文章首發於公號「阿拉平平」
相信 Kubernetes 以其複雜的架構,勸退了不少想要學習的新手。僅是搭建集羣,學習成本就不低。我的建議是:與其將時間放在搭建上,不如將精力放到 K8s 本身,等熟悉各個功能了,再搭建集羣去了解各個組件,這種學習方法可能更加高效。
今天和大家分享的一個開源的 K8s 發行版:k0s,只需將 k0s 的二進制文件複製到各個主機上,就可以快速搭 K8s 集羣。
項目介紹
k0s [1] 是一款簡易、穩定且經過認證的 Kubernetes 發行版,它提供了構建 Kubernetes 集羣所需的所有內容,集成了運行 K8s 所有必需的組件。
環境準備
k0s 支持單/多節點部署,這裏僅介紹多節點部署,其它安裝方法可以參考官方文檔 [2] 。
我準備了兩臺 CentOS 7.8 的虛擬機,信息如下:
主機名 | IP |
---|---|
master | 192.168.128.131 |
worker | 192.168.128.132 |
需要說明的是,兩臺主機的防火牆和 SELinux 均已關閉。
下載安裝
目前 k0s 的最新版本爲 v0.11.0,可以通過腳本下載並安裝:
$ curl -sSLf https://get.k0s.sh | sudo sh
安裝完成後,驗證下版本:
[root@master ~]# k0s version
v0.11.0
各主機下載完成後,就可以搭建集羣了。
搭建集羣
最新版本的 k0s 支持通過命令創建服務,只需在各個主機上建好各自的服務,直接啓動即可。
master
在 master 主機上安裝 controller 服務:
[root@master ~]# k0s install controller
INFO[2021-03-05 15:54:29] no config file given, using defaults
INFO[2021-03-05 15:54:29] creating user: etcd
INFO[2021-03-05 15:54:30] creating user: kube-apiserver
INFO[2021-03-05 15:54:30] creating user: konnectivity-server
INFO[2021-03-05 15:54:30] creating user: kube-scheduler
INFO[2021-03-05 15:54:30] Installing k0s service
啓動 controller 服務:
[root@master ~]# systemctl start k0scontroller
服務啓動後,檢查下運行狀態:
服務運行正常,接下來生成一個 token 文件供 worker 連接:
# 出於安全考慮,這裏設置了 token 的過期時間
[root@master ~]# k0s token create --role=worker --expiry=100h > token-file
將 token 文件複製到 worker 主機上:
[root@master ~]# scp token-file 192.168.128.132:/opt/k0s/
至此,master 節點部署完成,接下來登錄 worker 節點。
worker
在 worker 主機上安裝 worker 服務,並指定剛複製的 token 文件,:
[root@worker ~]# k0s install worker --token-file /opt/k0s/token-file
INFO[2021-03-05 16:19:41] Installing k0s service
啓動服務並確保運行正常:
[root@worker ~]# systemctl start k0sworker
至此,所有的部署工作均已完成。
使用示例
接下來,我準備創建一個 Deployment 來測試集羣是否可用。在創建前,需要檢查下當前集羣的狀態。
回到 master 節點,首先檢查下節點的狀態。需要注意:如果節點沒有加入或者處於 Not Ready
,會導致 pod 一直處於 pending 狀態:
[root@master ~]# k0s kubectl get nodes
NAME STATUS ROLES AGE VERSION
worker Ready <none> 8m32s v1.20.4-k0s1
可以看到,worker 節點已加入並處於就緒狀態,再檢查下 kube-system 中 pod 的運行情況:
[root@master ~]# k0s kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5f6546844f-9fjhp 1/1 Running 0 37m
calico-node-rnjnl 1/1 Running 0 12m
coredns-5c98d7d4d8-xw6lw 1/1 Running 0 38m
konnectivity-agent-xkcjh 1/1 Running 0 10m
kube-proxy-hfcc9 1/1 Running 0 12m
metrics-server-6fbcd86f7b-tc9kg 1/1 Running 0 37m
各 pod 均處於 Runing 狀態,說明集羣服務運行正常。接下來,試試通過 yaml 文件創建一個 nginx 應用。
[root@master ~]# cat nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
[root@master ~]# k0s kubectl create -f nginx.yaml
deployment.apps/nginx-deployment created
查看 nginx 的運行情況,應用已啓動,,說明集羣可用:
[root@master ~]# k0s kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 46s
寫在最後
官方將這個項目命名爲 k0s,這可不是亂取的啊,顯然是有備而來。k0s 中的 0 包含三層含義:
- 零摩擦:輕量並保留所有 K8s 的功能,儘可能降低安裝和使用的複雜性。
- 零依賴:集成所有 K8s 組件,無需安裝其它依賴。
- 零成本:二進制文件部署,適合非專業用戶使用。
如文中演示,k0s 部署方便,使用簡單,即使是沒有經驗的用戶,在數分鐘內也可以創建一套 Kubernetes 集羣。
References
[1] k0s: https://github.com/k0sproject/k0s
[2] 官方文檔: https://docs.k0sproject.io/latest/