真快!10秒内将k8s集群运行起来
大家好,我是小碗湯,今天演示一個項目,可以在一分鐘內用容器將k8s集群運行起來,真的很方便。
您可能已經知道,將 Kubernetes 集群安裝在 VM 上。但在 Docker 容器中安裝一個 Kubernetes 集群,還沒有太多的實踐。
本文我將簡要演示如何在 Docker 容器中創建 Kubernetes 集群。如果你想看細節,可以查看 GitHub倉庫[1]。
創建集群
下載腳本
git?clone?--depth=1?[https://github.com/ManasPecenek/clinco.git](https://github.com/ManasPecenek/clinco.git?"https://github.com/ManasPecenek/clinco.git")?&&?cd?clinco?&&?chmod?+x?initial-script.sh?add-worker.sh查看目錄結構
#?ls? add-worker.sh??initial-script.sh??LICENSE??master?image??README.md??worker?image現在您可以設置工作節點數,然后運行腳本。例如./initial-script.sh 1將產生一個 worker-node 集群:
./initial-script.sh?<worker-node-count>稍等片刻,即可看到1 master 1 worker集群創建好了:
#?docker?ps?-a CONTAINER?ID???IMAGE??????????????????????????????COMMAND????????CREATED??????????STATUS??????????PORTS??????????????????????????????????????????????????????????????????????????NAMES 7521c916e92e???petschenek/ubuntu-systemd:worker???"/sbin/init"???11?minutes?ago???Up?11?minutes??????????????????????????????????????????????????????????????????????????????????worker-1 a2e5bcf92c92???petschenek/ubuntu-systemd:master???"/sbin/init"???15?minutes?ago???Up?15?minutes???0.0.0.0:80->80/tcp,?:::80->80/tcp,?0.0.0.0:6443->6443/tcp,?:::6443->6443/tcp???mastermaster會將80、6443端口映射到宿主機上。
我們將容器中的kubectl命令復制到宿主機上,方便操作:
#?docker?cp?master:/usr/local/bin/kubectl?/usr/local/bin/在clinco目錄中默認存在了admin.kubeconfig文件,我們查看集群:
#?kubectl?get?nodes?-o?wide?--kubeconfig?admin.kubeconfig NAME???????STATUS???ROLES????AGE???VERSION???INTERNAL-IP???EXTERNAL-IP???OS-IMAGE???????KERNEL-VERSION????????????????CONTAINER-RUNTIME worker-1???Ready????<none>???29m???v1.21.0???172.172.1.1???<none>????????Ubuntu?21.10???3.10.0-1160.31.1.el7.x86_64???containerd://1.5.8#?kubectl?cluster-info?--kubeconfig?admin.kubeconfig Kubernetes?control?plane?is?running?at?https://127.0.0.1:6443To?further?debug?and?diagnose?cluster?problems,?use?'kubectl?cluster-info?dump'.添加工作節點
運行下面的腳本,例如./add-worker.sh 1 將向現有集群添加1個工作節點:
./add-worker.sh?<worker-node-count>查看添加的節點:
#?docker?ps?-a CONTAINER?ID???IMAGE??????????????????????????????COMMAND????????CREATED??????????STATUS??????????PORTS??????????????????????????????????????????????????????????????????????????NAMES bfc68af79191???petschenek/ubuntu-systemd:worker???"/sbin/init"???14?seconds?ago???Up?13?seconds??????????????????????????????????????????????????????????????????????????????????worker-2 7521c916e92e???petschenek/ubuntu-systemd:worker???"/sbin/init"???33?minutes?ago???Up?33?minutes??????????????????????????????????????????????????????????????????????????????????worker-1 a2e5bcf92c92???petschenek/ubuntu-systemd:master???"/sbin/init"???36?minutes?ago???Up?36?minutes???0.0.0.0:80->80/tcp,?:::80->80/tcp,?0.0.0.0:6443->6443/tcp,?:::6443->6443/tcp???master稍等片刻,節點會變成Ready:
#?kubectl?get?nodes?-o?wide?--kubeconfig?admin.kubeconfig NAME???????STATUS???ROLES????AGE???VERSION???INTERNAL-IP???EXTERNAL-IP???OS-IMAGE???????KERNEL-VERSION????????????????CONTAINER-RUNTIME worker-1???Ready????<none>???33m???v1.21.0???172.172.1.1???<none>????????Ubuntu?21.10???3.10.0-1160.31.1.el7.x86_64???containerd://1.5.8 worker-2???Ready????<none>???38s???v1.21.0???172.172.1.2???<none>????????Ubuntu?21.10???3.10.0-1160.31.1.el7.x86_64???containerd://1.5.8為了方便,可以設置環境變量,或者將admin.kubeconfig復制到~/.kube/config文件中,這里設置個KUBECONFIG環境變量:
export?KUBECONFIG=admin.kubeconfig部署服務
部署2個實例的nginx deployment做測試:
kubectl?create?deploy?nginx?--image?nginx?--replicas?4稍等片刻即可啟動成功:
#?kubectl??get?pod??-o?wide NAME?????????????????????READY???STATUS??????????????RESTARTS???AGE?????IP???????NODE???????NOMINATED?NODE???READINESS?GATES nginx-6799fc88d8-b5xhx???1/1?????Running???0??????????2m10s???<none>???worker-2???<none>???????????<none> nginx-6799fc88d8-ch2x9???1/1?????Running???0??????????2m10s???<none>???worker-2???<none>???????????<none>修復集群
如果使用delete node命令刪除節點后,例如:
kubectl??delete?node?worker-2則直接執行以下命令重啟容器即可:
docker?restart?worker-2如果容器被刪除,刪除的是主節點,想恢復集群,可以運行以下命令:
#?docker?stop?master?;?docker?rm?master #?docker?run?-dt?--network?clinco?--hostname?master?--name?master?-v?master:/root?-v?etcd:/lib/etcd?-v?/sys/fs/cgroup:/sys/fs/cgroup:ro?--ip=172.172.0.1?-p?6443:6443?-p?80:80?--privileged?--user?root?petschenek/ubuntu-systemd:master?&&?docker?exec?-it?--privileged?--user?root?master?bash?-c?"./master.sh"如果容器被刪除,刪除的是工作節點之一(例如worker-2),可以運行以下命令來重新創建:
#?docker?stop?worker-2?;?docker?rm?worker-2 #?j=2?&&?docker?run?-dt?--network?clinco?--hostname?worker-$j?--name?worker-$j?-v?/lib/modules:/lib/modules:ro?-v?worker-$j:/root?-v?/sys/fs/cgroup:/sys/fs/cgroup:ro?--ip=172.172.0.$j?--privileged?--user?root?petschenek/ubuntu-systemd:worker?&&?docker?exec?-it?--privileged?--user?root?worker-$j?bash?-c?"./worker.sh"原理
其實在master node容器中運行了系統組件:
#?docker?exec?-ti?master?ps?-ef??|?grep?kube root????????1452???????1??3?13:10??????????00:01:33?/usr/local/bin/kube-apiserve root????????1453???????1??0?13:10??????????00:00:21?/usr/local/bin/kube-controll root????????1454???????1??0?13:10??????????00:00:05?/usr/local/bin/kube-schedule #?docker?exec?-ti?master?ps?-ef??|?grep?etcd root????????1367???????1??1?13:10??????????00:00:29?/usr/local/bin/etcd?--name?m在worker node容器中運行了kubelet:
#?docker?exec?-ti?worker-1?ps?-ef??|?grep?kubelet root?????????980???????1??0?13:11??????????00:00:20?/usr/local/bin/kubelet?--con#?docker?exec?-ti?worker-2?ps?-ef??|?grep?kubelet root?????????981???????1??0?13:44??????????00:00:05?/usr/local/bin/kubelet?--con因為在master node容器中沒有運行kubelet,所以查看node時看不到master。
容器網絡都為clinco模式:
#?docker?network??ls?-f?name=clinco NETWORK?ID?????NAME??????DRIVER????SCOPE 5d018b1d9b06???clinco????bridge????local#?docker?inspect?master?|?grep?NetworkMode"NetworkMode":?"clinco", #?docker?inspect?worker-1?|?grep?NetworkMode"NetworkMode":?"clinco", #?docker?inspect?worker-2?|?grep?NetworkMode"NetworkMode":?"clinco",數據也是掛載到宿主機上的:
#?docker?volume?ls?-f?name=etcd DRIVER????VOLUME?NAME local?????etcd總結
這里用到兩個鏡像(master、worker各一個),我們可以在10秒內輕松裝好一個 Kubernetes 集群,平時測試用起來將變得方便快捷。
參考
[1]
GitHub倉庫: https://github.com/ManasPecenek/clinco
點個在看你最好看
總結
以上是生活随笔為你收集整理的真快!10秒内将k8s集群运行起来的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET6之MiniAPI(九):基于角
- 下一篇: MD5计算,一个扩展类,哪里都能用