如何部署一個Kubernetes集群

在上一篇文章《Kubernetes和Docker的關(guān)系是什么?》和大家分享了關(guān)于Kubernetes的基本系統(tǒng)架構(gòu)以及關(guān)于容器編排相關(guān)的概念,并總體闡述Kubernetes與Docker之間的基本關(guān)系。而要學(xué)習(xí)Kubernetes容器編排技術(shù),首先要解決的就是學(xué)習(xí)環(huán)境問題,而由于Kubernetes本身具有一定的復(fù)雜性,且需要較大的系統(tǒng)資源環(huán)境,所以對于剛?cè)腴T的讀者來說如何快速部署一套Kubernetes學(xué)習(xí)環(huán)境就成了一件棘手的事情。
在本篇文章中我將以在Mac筆記本中安裝兩臺Ubantu系統(tǒng)的方式,演示如何部署一套具備一個控制節(jié)點(Master)和一個計算節(jié)點(Worker)的Kubernetes學(xué)習(xí)集群。
1、系統(tǒng)環(huán)境準(zhǔn)備

要安裝部署Kubernetes集群,首先需要準(zhǔn)備機器,最直接的辦法可以到公有云(如阿里云等)申請幾臺虛擬機。而如果條件允許,拿幾臺本地物理服務(wù)器來組建集群自然是最好不過了。但是這些機器需要滿足以下幾個條件:
要求64位Linux操作系統(tǒng),且內(nèi)核版本要求3.10及以上,能滿足安裝Docker項目所需的要求;
機器之間要保持網(wǎng)絡(luò)互通,這是未來容器之間網(wǎng)絡(luò)互通的前提條件;
要有外網(wǎng)訪問權(quán)限,因為部署的過程中需要拉取相應(yīng)的鏡像,要求能夠訪問到gcr.io、quay.io這兩個dockerregistry,因為有小部分鏡像需要從這里拉取;
單機可用資源建議2核CPU、8G內(nèi)存或以上,如果小一點也可以但是能調(diào)度的Pod數(shù)量就比較有限了;
磁盤空間要求在30GB以上,主要用于存儲Docker鏡像及相關(guān)日志文件;
在本次實驗中由于條件有限,我是在Mac筆記本上通過虛擬軟件準(zhǔn)備了兩臺虛擬機,其具體配置如下:
2核CPU、2GB內(nèi)存,30GB的磁盤空間;
Unbantu 20.04 LTS的Sever版本,其Linux內(nèi)核為5.4.0;
內(nèi)網(wǎng)互通,外網(wǎng)訪問權(quán)限不受控制;
2、Kubeadm一鍵部署工具簡介

作為典型的分布式系統(tǒng),Kubernetes的部署一直是困擾初學(xué)者進入Kubernetes世界的一大障礙。在發(fā)布早期Kubernetes的部署主要依賴于社區(qū)維護的各種腳本,但這其中會涉及二進制編譯、配置文件以及kube-apiserver授權(quán)配置文件等諸多運維工作。目前各大云服務(wù)廠商常用的Kubernetes部署方式是使用SaltStack、Ansible等運維工具自動化地執(zhí)行這些繁瑣的步驟,但即使這樣,這個部署的過程對于初學(xué)者來說依然是非常繁瑣的。
正是基于這樣的痛點,在志愿者的推動下Kubernetes社區(qū)終于發(fā)起了kubeadm這一獨立的一鍵部署工具,使用kubeadm我們可以通過幾條簡單的指令來快速地部署一個kubernetes集群。后面的內(nèi)容,就將具體演示如何使用kubeadm來部署一個Kubernetes集群。
3、安裝Kubeadm及Docker環(huán)境

在準(zhǔn)備的兩臺虛擬機中,分別安裝Kubeadm部署工具及Docker環(huán)境。步驟如下:
1)、編輯操作系統(tǒng)安裝源配置文件,添加kubernetes鏡像源,命令如下:
#添加Kubernetes官方鏡像源apt-key
root@kubenetesnode01:~#curl?-s?https://packages.cloud.google.com/apt/doc/apt-key.gpg?|?apt-key?add?-
#添加Kubernetes官方鏡像源地址
root@kubernetesnode01:~#?vim?/etc/apt/sources.list
#add?kubernetes?source
deb?http://apt.kubernetes.io/?kubernetes-xenial?main
上述操作添加的是kubernetes的官方鏡像源,如果apt.kubernetes.io因為網(wǎng)絡(luò)原因訪問不到,也可以換成國內(nèi)Ubantu鏡像源,如阿里云鏡像源地址:
#添加阿里云Kubernetes鏡像源apt-key
root@kubenetesnode01:~#?curl?-s?https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg?|?apt-key?add?-
#添加阿里云Kubernetes鏡像源地址
root@kubernetesnode01:~#?vim?/etc/apt/sources.list
deb?https://mirrors.aliyun.com/kubernetes/apt/?kubernetes-xenial?main
2)、鏡像源添加后更新apt資源列表,命令如下:
root@kubernetesnode01:~#?apt-get?update
Hit:1?http://cn.archive.ubuntu.com/ubuntu?focal?InRelease
Hit:2?http://cn.archive.ubuntu.com/ubuntu?focal-updates?InRelease
Hit:3?http://cn.archive.ubuntu.com/ubuntu?focal-backports?InRelease
Hit:4?http://cn.archive.ubuntu.com/ubuntu?focal-security?InRelease
Get:5?https://packages.cloud.google.com/apt?kubernetes-xenial?InRelease?[8,993?B]
Get:6?https://packages.cloud.google.com/apt?kubernetes-xenial/main?amd64?Packages?[37.7?kB]
Fetched?46.7?kB?in?7s?(6,586?B/s)
Reading?package?lists...?Done
3)、完成上述2步后就可以通過apt-get命令安裝kubeadm了,如下:
root@kubernetesnode01:~#?apt-get?install?-y?docker.io?kubeadm
Reading?package?lists...?Done
Building?dependency?tree???????
Reading?state?information...?Done
The?following?additional?packages?will?be?installed:
bridge-utils?cgroupfs-mount?conntrack?containerd?cri-tools?dns-root-data?dnsmasq-base?ebtables?kubectl?kubelet?kubernetes-cni?libidn11?pigz?runc?socat?ubuntu-fan
....
這里直接使用Ubantu的docker.io安裝源。在上述安裝kubeadm的過程中,kubeadm和kubelet、kubectl、kubernetes-cni這幾個kubernetes核心組件的二進制文件都會被自動安裝好。
4)、Docker服務(wù)啟動及限制修改
完成上述步驟側(cè)操作后,系統(tǒng)中會自動安裝Docker引擎,但是在具體運行kubernetes部署之前需要對Docker的配置信息進行一些調(diào)整。
首先,編輯系統(tǒng)/etc/default/grub文件,在配置項GRUB_CMDLINE_LINUX中添加如下參數(shù):
GRUB_CMDLINE_LINUX="?cgroup_enable=memory?swapaccount=1"
完成編輯后保存執(zhí)行如下命令,并重啟服務(wù)器,命令如下:
root@kubernetesnode01:/opt/kubernetes-config#?update-grub
root@kubernetesnode01:/opt/kubernetes-config#?reboot
上述修改主要解決的是可能出現(xiàn)的“docker警告WARNING: No swap limit support”問題。
其次,編輯創(chuàng)建/etc/docker/daemon.json文件,添加如下內(nèi)容:
{
??"exec-opts":?["native.cgroupdriver=systemd"]
}
完成保存后執(zhí)行重啟Docker命令,如下:
root@kubernetesnode01:/opt/kubernetes-config#?systemctl?restart?docker
此時可以查看Docker的Cgroup信息,如下:
root@kubernetesnode01:/opt/kubernetes-config#?docker?info?|?grep?Cgroup
?Cgroup?Driver:?systemd
上述修改主要解決的是“Dockercgroup driver. The recommended driver is "systemd"”的問題。需要強調(diào)的是以上修改只是作者在具體安裝操作是遇到的具體問題的解決整理,如在實踐過程中遇到其他問題還需要自行查閱相關(guān)資料!
最后,需要注意由于kubernetes禁用虛擬內(nèi)存,所以要先關(guān)閉掉swap否則就會在kubeadm初始化kubernetes的時候報錯,具體如下:
root@kubernetesnode01:/opt/kubernetes-config#?swapoff?-a
該命令只是臨時禁用swap,如要保證系統(tǒng)重啟后仍然生效則需要“edit /etc/fstab”文件,并注釋掉swap那一行。
完成以上操作后啟動系統(tǒng)Docker服務(wù),命令如下:
root@kubenetesnode02:~#?systemctl?enable?docker.service
4、部署Kubernetes的Master節(jié)點

在Kubernetes中Master節(jié)點是集群的控制節(jié)點,它是由三個緊密協(xié)作的獨立組件組合而成,分別是負(fù)責(zé)API服務(wù)的kube-apiserver、負(fù)責(zé)調(diào)度的kube-scheduler以及負(fù)責(zé)容器編排的kube-controller-manager,其中整個集群的持久化數(shù)據(jù)由kube-apiserver處理后保存在Etcd中。
要部署Master節(jié)點可以直接通過kubeadm進行一鍵部署,但這里我們希望能夠部署一個相對完整的Kubernetes集群,可以通過配置文件來開啟一些實驗性的功能。具體在系統(tǒng)中新建/opt/kubernetes-config/目錄,并創(chuàng)建一個給kubeadm用的YAML文件(kubeadm.yaml),具體內(nèi)容如下:
apiVersion:?kubeadm.k8s.io/v1beta2
kind:?ClusterConfiguration
controllerManager:
?extraArgs:
?????horizontal-pod-autoscaler-use-rest-clients:?"true"
?????horizontal-pod-autoscaler-sync-period:?"10s"
?????node-monitor-grace-period:?"10s"
apiServer:
??extraArgs:
?????runtime-config:?"api/all=true"
kubernetesVersion:?"v1.18.1"
在上述yaml配置文件中“horizontal-pod-autoscaler-use-rest-clients: "true"”這個配置,表示將來部署的kuber-controller-manager能夠使用自定義資源(CustomMetrics)進行自動水平擴展,感興趣的讀者可以自行查閱相關(guān)資料!而“v1.18.1”就是要kubeadm幫我們部署的Kubernetes版本號。
需要注意的是,如果執(zhí)行過程中由于國內(nèi)網(wǎng)絡(luò)限制問題導(dǎo)致無法下載相應(yīng)的Docker鏡像,可以根據(jù)報錯信息在國內(nèi)網(wǎng)站(如阿里云)上找到相關(guān)鏡像,然后再將這些鏡像重新tag之后再進行安裝。具體如下:
#從阿里云Docker倉庫拉取Kubernetes組件鏡像
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:v1.18.1
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:v1.18.1
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:v1.18.1
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.18.1
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:3.4.3-0
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
下載完成后再將這些Docker鏡像重新tag下,具體命令如下:
#重新tag鏡像
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2?k8s.gcr.io/pause:3.2
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7?k8s.gcr.io/coredns:1.6.7
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64:3.4.3-0?k8s.gcr.io/etcd:3.4.3-0
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64:v1.18.1?k8s.gcr.io/kube-scheduler:v1.18.1
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64:v1.18.1?k8s.gcr.io/kube-controller-manager:v1.18.1
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64:v1.18.1?k8s.gcr.io/kube-apiserver:v1.18.1
docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.18.1?k8s.gcr.io/kube-proxy:v1.18.1
此時通過Docker命令就可以查看到這些Docker鏡像信息了,命令如下:
root@kubernetesnode01:/opt/kubernetes-config#?docker?images
REPOSITORY??????????????????????????????????????????????????????????????????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
k8s.gcr.io/kube-proxy???????????????????????????????????????????????????????????????v1.18.1?????????????4e68534e24f6????????2?months?ago????????117MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64????????????????v1.18.1?????????????4e68534e24f6????????2?months?ago????????117MB
k8s.gcr.io/kube-controller-manager??????????????????????????????????????????????????v1.18.1?????????????d1ccdd18e6ed????????2?months?ago????????162MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager-amd64???v1.18.1?????????????d1ccdd18e6ed????????2?months?ago????????162MB
k8s.gcr.io/kube-apiserver???????????????????????????????????????????????????????????v1.18.1?????????????a595af0107f9????????2?months?ago????????173MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver-amd64????????????v1.18.1?????????????a595af0107f9????????2?months?ago????????173MB
k8s.gcr.io/kube-scheduler???????????????????????????????????????????????????????????v1.18.1?????????????6c9320041a7b????????2?months?ago????????95.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler-amd64????????????v1.18.1?????????????6c9320041a7b????????2?months?ago????????95.3MB
k8s.gcr.io/pause????????????????????????????????????????????????????????????????????3.2?????????????????80d28bedfe5d????????4?months?ago????????683kB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause???????????????????????????3.2?????????????????80d28bedfe5d????????4?months?ago????????683kB
k8s.gcr.io/coredns??????????????????????????????????????????????????????????????????1.6.7???????????????67da37a9a360????????4?months?ago????????43.8MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns?????????????????????????1.6.7???????????????67da37a9a360????????4?months?ago????????43.8MB
k8s.gcr.io/etcd?????????????????????????????????????????????????????????????????????3.4.3-0?????????????303ce5db0e90????????8?months?ago????????288MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd-amd64??????????????????????3.4.3-0?????????????303ce5db0e90????????8?months?ago????????288MB
解決鏡像拉取問題后再次執(zhí)行kubeadm部署命令就可以完成Kubernetes Master控制節(jié)點的部署了,具體命令及執(zhí)行結(jié)果如下:
root@kubernetesnode01:/opt/kubernetes-config#?kubeadm?init?--config?kubeadm.yaml?--v=5
...
Your?Kubernetes?control-plane?has?initialized?successfully!
To?start?using?your?cluster,?you?need?to?run?the?following?as?a?regular?user:
??mkdir?-p?$HOME/.kube
??sudo?cp?-i?/etc/kubernetes/admin.conf?$HOME/.kube/config
??sudo?chown?$(id?-u):$(id?-g)?$HOME/.kube/config
You?should?now?deploy?a?pod?network?to?the?cluster.
Run?"kubectl?apply?-f?[podnetwork].yaml"?with?one?of?the?options?listed?at:
??https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then?you?can?join?any?number?of?worker?nodes?by?running?the?following?on?each?as?root:
kubeadm?join?10.211.55.6:6443?--token?jfulwi.so2rj5lukgsej2o6?\
????--discovery-token-ca-cert-hash?sha256:d895d512f0df6cb7f010204193a9b240e8a394606090608daee11b988fc7fea6
從上面部署執(zhí)行結(jié)果中可以看到,部署成功后kubeadm會生成如下指令:
kubeadm?join?10.211.55.6:6443?--token?d35pz0.f50zacvbdarqn2vi?\
????--discovery-token-ca-cert-hash?sha256:58958a3bf4ccf4a4c19b0d1e934e77bf5b5561988c2274364aaadc9b1747141d
這個kubeadm join命令就是用來給該Master節(jié)點添加更多Worker(工作節(jié)點)的命令,后面具體部署Worker節(jié)點的時候?qū)褂玫剿4送猓琸ubeadm還會提示我們第一次使用Kubernetes集群所需要配置的命令:
mkdir?-p?$HOME/.kube
sudo?cp?-i?/etc/kubernetes/admin.conf?$HOME/.kube/config
sudo?chown?$(id?-u):$(id?-g)?$HOME/.kube/config
而需要這些配置命令的原因在于Kubernetes集群默認(rèn)是需要加密方式訪問的,所以這幾條命令就是將剛才部署生成的Kubernetes集群的安全配置文件保存到當(dāng)前用戶的.kube目錄,之后kubectl會默認(rèn)使用該目錄下的授權(quán)信息訪問Kubernetes集群。如果不這么做的化,那么每次通過集群就都需要設(shè)置“export KUBE CONFIG 環(huán)境變量”來告訴kubectl這個安全文件的位置。
執(zhí)行完上述命令后,現(xiàn)在我們就可以使用kubectlget命令來查看當(dāng)前Kubernetes集群節(jié)點的狀態(tài)了,執(zhí)行效果如下:
root@kubernetesnode01:/opt/kubernetes-config#?kubectl?get?nodes
NAME???????????????STATUS?????ROLES????AGE???VERSION
kubernetesnode01???NotReady???master???35m???v1.18.4
在以上命令輸出的結(jié)果中可以看到Master節(jié)點的狀態(tài)為“NotReady”,為了查找具體原因可以通過“kuberctl describe”命令來查看下該節(jié)點(Node)對象的詳細(xì)信息,命令如下:
root@kubernetesnode01:/opt/kubernetes-config#?kubectl?describe?node?kubernetesnode01
該命令可以非常詳細(xì)地獲取節(jié)點對象的狀態(tài)、事件等詳情,這種方式也是調(diào)試Kubernetes集群時最重要的排查手段。根據(jù)顯示的如下信息:
...
Conditions
...
Ready?False...?KubeletNotReady?runtime?network?not?ready:?NetworkReady=false?reason:NetworkPluginNotReady?message:docker:?network?plugin?is?not?ready:?cni?config?uninitialized
...
可以看到節(jié)點處于“NodeNotReady”的原因在于尚未部署任何網(wǎng)絡(luò)插件,為了進一步驗證著一點還可以通過kubectl檢查這個節(jié)點上各個Kubernetes系統(tǒng)Pod的狀態(tài),命令及執(zhí)行效果如下:
root@kubernetesnode01:/opt/kubernetes-config#?kubectl?get?pods?-n?kube-system
NAME???????????????????????????????????????READY???STATUS????RESTARTS???AGE
coredns-66bff467f8-l4wt6???????????????????0/1?????Pending???0??????????64m
coredns-66bff467f8-rcqx6???????????????????0/1?????Pending???0??????????64m
etcd-kubernetesnode01??????????????????????1/1?????Running???0??????????64m
kube-apiserver-kubernetesnode01????????????1/1?????Running???0??????????64m
kube-controller-manager-kubernetesnode01???1/1?????Running???0??????????64m
kube-proxy-wjct7???????????????????????????1/1?????Running???0??????????64m
kube-scheduler-kubernetesnode01????????????1/1?????Running???0??????????64m
命令中“kube-system”表示的是Kubernetes項目預(yù)留的系統(tǒng)Pod空間(Namespace),需要注意它并不是Linux Namespace,而是Kuebernetes劃分的不同工作空間單位。回到命令輸出結(jié)果,可以看到coredns等依賴于網(wǎng)絡(luò)的Pod都處于Pending(調(diào)度失敗)的狀態(tài),這樣說明了該Master節(jié)點的網(wǎng)絡(luò)尚未部署就緒。
5、部署Kubernetes網(wǎng)絡(luò)插件

前面部署Master節(jié)點中由于沒有部署網(wǎng)絡(luò)插件,所以節(jié)點狀態(tài)顯示“NodeNotReady”狀態(tài)。接下來的內(nèi)容我們就來具體部署下網(wǎng)絡(luò)插件。在Kubernetes“一切皆容器”的設(shè)計理念指導(dǎo)下,網(wǎng)絡(luò)插件也會以獨立Pod的方式運行在系統(tǒng)中,所以部署起來也很簡單只需要執(zhí)行“kubectl apply”指令即可,例如以Weave網(wǎng)絡(luò)插件為例:
root@kubernetesnode01:/opt/kubernetes-config#?kubectl?apply?-f?https://cloud.weave.works/k8s/net?k8s-version=$(kubectl?version?|?base64?|?tr?-d?'\n')
serviceaccount/weave-net?created
clusterrole.rbac.authorization.k8s.io/weave-net?created
clusterrolebinding.rbac.authorization.k8s.io/weave-net?created
role.rbac.authorization.k8s.io/weave-net?created
rolebinding.rbac.authorization.k8s.io/weave-net?created
daemonset.apps/weave-net?created
部署完成后通過“kubectl get”命令重新檢查Pod的狀態(tài):
root@kubernetesnode01:/opt/kubernetes-config#?kubectl?get?pods?-n?kube-system
NAME???????????????????????????????????????READY???STATUS????RESTARTS???AGE
coredns-66bff467f8-l4wt6???????????????????1/1?????Running???0??????????116m
coredns-66bff467f8-rcqx6???????????????????1/1?????Running???0??????????116m
etcd-kubernetesnode01??????????????????????1/1?????Running???0??????????116m
kube-apiserver-kubernetesnode01????????????1/1?????Running???0??????????116m
kube-controller-manager-kubernetesnode01???1/1?????Running???0??????????116m
kube-proxy-wjct7???????????????????????????1/1?????Running???0??????????116m
kube-scheduler-kubernetesnode01????????????1/1?????Running???0??????????116m
weave-net-746qj?
可以看到,此時所有的系統(tǒng)Pod都成功啟動了,而剛才部署的Weave網(wǎng)絡(luò)插件則在kube-system下面新建了一個名叫“weave-net-746qj”的Pod,而這個Pod就是容器網(wǎng)絡(luò)插件在每個節(jié)點上的控制組件。
到這里,Kubernetes的Master節(jié)點就部署完成了,如果你只需要一個單節(jié)點的Kubernetes,那么現(xiàn)在就可以使用了。但是在默認(rèn)情況下,Kubernetes的Master節(jié)點是不能運行用戶Pod的,需要通過額外的操作進行調(diào)整,感興趣的朋友可以自己查閱下其他資料。
6、部署Kubernetes的Worker節(jié)點

為了構(gòu)建一個完整的Kubernetes集群,這里還需要繼續(xù)介紹如何部署Worker節(jié)點。實際上Kubernetes的Worker節(jié)點和Master節(jié)點幾乎是相同的,它們都運行著一個kubelet組件,主要的區(qū)別在于“kubeadm init”的過程中,kubelet啟動后,Master節(jié)點還會自動啟動kube-apiserver、kube-scheduler及kube-controller-manager這三個系統(tǒng)Pod。
在具體部署之前與Master節(jié)點一樣,也需要在所有Worker節(jié)點上執(zhí)行前面“安裝kubeadm及Decker環(huán)境”小節(jié)中的所有步驟。之后在Worker節(jié)點執(zhí)行部署Master節(jié)點時生成的“kubeadm join”指令即可,具體如下:
root@kubenetesnode02:~#?kubeadm?join?10.211.55.6:6443?--token?jfulwi.so2rj5lukgsej2o6?????--discovery-token-ca-cert-hash?sha256:d895d512f0df6cb7f010204193a9b240e8a394606090608daee11b988fc7fea6?--v=5
...
This?node?has?joined?the?cluster:
*?Certificate?signing?request?was?sent?to?apiserver?and?a?response?was?received.
*?The?Kubelet?was?informed?of?the?new?secure?connection?details.
Run?'kubectl?get?nodes'?on?the?control-plane?to?see?this?node?join?the?cluster.
完成集群加入后為了便于在Worker節(jié)點執(zhí)行kubectl相關(guān)命令,需要進行如下配置:
#創(chuàng)建配置目錄
root@kubenetesnode02:~#?mkdir?-p?$HOME/.kube
#將Master節(jié)點中$/HOME/.kube/目錄中的config文件拷貝至Worker節(jié)點對應(yīng)目錄
root@kubenetesnode02:~#[email protected]:$HOME/.kube/config?$HOME/.kube/
#權(quán)限配置
root@kubenetesnode02:~#?sudo?chown?$(id?-u):$(id?-g)?$HOME/.kube/config
之后可以在Worker或Master節(jié)點執(zhí)行節(jié)點狀態(tài)查看命令“kubectl get nodes”,具體如下:
root@kubernetesnode02:~#?kubectl?get?nodes
NAME???????????????STATUS?????ROLES????AGE???VERSION
kubenetesnode02????NotReady??????33m???v1.18.4
kubernetesnode01???Ready??????master???29h???v1.18.4
通過節(jié)點狀態(tài)顯示此時Work節(jié)點還處于NotReady狀態(tài),具體查看節(jié)點描述信息如下:
root@kubernetesnode02:~#?kubectl?describe?node?kubenetesnode02
...
Conditions:
...
Ready?False?...?KubeletNotReady?runtime?network?not?ready:?NetworkReady=false?reason:NetworkPluginNotReady?message:docker:?network?plugin?is?not?ready:?cni?config?uninitialized
...
根據(jù)描述信息,發(fā)現(xiàn)Worker節(jié)點NotReady的原因也在于網(wǎng)絡(luò)插件沒有部署,繼續(xù)執(zhí)行“部署Kubernetes網(wǎng)絡(luò)插件”小節(jié)中的步驟即可。但是要注意部署網(wǎng)絡(luò)插件時會同時部署kube-proxy,其中會涉及從k8s.gcr.io倉庫獲取鏡像的動作,如果無法訪問外網(wǎng)可能會導(dǎo)致網(wǎng)絡(luò)部署異常,這里可以參考前面安裝Master節(jié)點時的做法,通過國內(nèi)鏡像倉庫下載后通過tag的方式進行標(biāo)記,具體如下:
root@kubenetesnode02:~#?docker?pull?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.18.1
root@kubenetesnode02:~#?docker?tag?registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.18.1?k8s.gcr.io/kube-proxy:v1.18.1
如若一切正常,則繼續(xù)查看節(jié)點狀態(tài),命令如下:
root@kubenetesnode02:~#?kubectl?get?node
NAME???????????????STATUS???ROLES????AGE?????VERSION
kubenetesnode02????Ready???????7h52m???v1.18.4
kubernetesnode01???Ready????master???37h?????v1.18.4
可以看到此時Worker節(jié)點的狀態(tài)已經(jīng)變成“Ready”,不過細(xì)心的讀者可能會發(fā)現(xiàn)Worker節(jié)點的ROLES并不像Master節(jié)點那樣顯示“master”而是顯示了
root@kubenetesnode02:~#?kubectl?label?node?kubenetesnode02?node-role.kubernetes.io/worker=worker
再次運行節(jié)點狀態(tài)命令就能看到正常的顯示了,命令效果如下:
root@kubenetesnode02:~#?kubectl?get?node
NAME???????????????STATUS???ROLES????AGE???VERSION
kubenetesnode02????Ready????worker???8h????v1.18.4
kubernetesnode01???Ready????master???37h???v1.18.4
到這里就部署完成了具有一個Master節(jié)點和一個Worker節(jié)點的Kubernetes集群了,作為實驗環(huán)境它已經(jīng)具備了基本的Kubernetes集群功能!
7、部署Dashboard可視化插件

在Kubernetes社區(qū)中,有一個很受歡迎的Dashboard項目,它可以給用戶一個可視化的Web界面來查看當(dāng)前集群中的各種信息。該插件也是以容器化方式進行部署,操作也非常簡單,具體可在Master、Worker節(jié)點或其他能夠安全訪問Kubernetes集群的Node上進行部署,命令如下:
root@kubenetesnode02:~#?kubectl?apply?-f?https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml
部署完成后就可以查看Dashboard對應(yīng)的Pod運行狀態(tài),執(zhí)行效果如下:
root@kubenetesnode02:~#?kubectl?get?pods?-n?kubernetes-dashboard
NAME?????????????????????????????????????????READY???STATUS????RESTARTS???AGE
dashboard-metrics-scraper-6b4884c9d5-xfb8b???1/1?????Running???0??????????12h
kubernetes-dashboard-7f99b75bf4-9lxk8????????1/1?????Running???0??????????12h
除此之外還可以查看Dashboard的服務(wù)(Service)信息,命令如下:
root@kubenetesnode02:~#?kubectl?get?svc?-n?kubernetes-dashboard
NAME????????????????????????TYPE????????CLUSTER-IP??????EXTERNAL-IP???PORT(S)????AGE
dashboard-metrics-scraper???ClusterIP???10.97.69.158????????????8000/TCP???13h
kubernetes-dashboard????????ClusterIP???10.111.30.214???????????443/TCP????13h 需要注意的是,由于Dashboard是一個Web服務(wù),從安全角度出發(fā)Dashboard默認(rèn)只能通過Proxy的方式在本地訪問。具體方式為在本地機器安裝kubectl管理工具,并將Master節(jié)點$HOME/.kube/目錄中的config文件拷貝至本地主機相同目錄,之后運行“kubectl proxy”命令,如下:
qiaodeMacBook-Pro-2:.kube?qiaojiang$?kubectl?proxy
Starting?to?serve?on?127.0.0.1:8001
本地proxy代理啟動后,訪問Kubernetes Dashboard地址,具體如下:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
如果訪問正常,就會看到相應(yīng)的界面!以上就是Kubernetes基本集群的搭建方式,希望能對你學(xué)習(xí)Kubernetes容器編排技術(shù)有所幫助!
—————END—————
