概述
在Node上需要部署Docker
、kubelet
、kube-proxy
,在成功加入Kubernetes集羣后,還需要部署CNI網絡插件、DNS插件等管理組件。
本節以將192.168.3.138和192.168.3.139兩臺主機部署爲Node爲例進行說明。
在部署之前,先確保如下幾件事情:
(1) 已經在Node主機上安裝了Docker環境,注意k8s與Docker版本的對應關係。
(2) 將Master主機上的ca.crt、client.key、client.crt都拷貝到Node主機的/etc/kubernetes/pki目錄下。
(3) 將Master主機上的kubeconfig配置文件拷貝到Node主機的/etc/kubernetes目錄下。
(4) 將kubelet程序拷貝到Node主機的/usr/bin目錄下。
(5) 將kube-proxy程序拷貝到Node主機的/usr/bin目錄下。
對K8S Node節點服務的部署主要包含3部分內容:
- 部署kubelet服務
- 部署kube-proxy服務
- 在Master上通過kubectl驗證Node信息
部署kubelet服務
(1)爲kubelet服務創建systemd服務配置文件/usr/lib/systemd/system/kubelet.service
,內容如下:
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/kubernetes/kubernetes
After=docker.target
[Service]
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=always
[Install]
WantedBy=multi-user.target
(2)配置文件/etc/kubernetes/kubelet
的內容爲通過環境變量KUBELET_ARGS
設置的kubelet的全部啓動參數,示例如下:
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig --config=/etc/kubernetes/kubelet.config \
--hostname-override=192.168.3.138 \
--network-plugin=cni \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對主要參數說明如下。
--kubeconfig
:設置與API Server連接的相關配置,可以與kube-controller-manager使用的kubeconfig文件相同。需要將相關客戶端證書文件從Master主機複製到Node主機的/etc/kubernetes/pki目錄下,例如ca.crt、client.key、client.crt文件。--config
:kubelet配置文件,從Kubernetes 1.10版本開始引入,設置可以讓多個Node共享的配置參數,例如address、port、cgroupDriver、clusterDNS、clusterDomain等。--hostname-override
:設置本Node在集羣中的名稱,默認值爲主機名,應將各Node設置爲本機IP或域名。--network-plugin
:網絡插件類型,建議使用CNI網絡插件。
配置文件kubelet.config
的內容示例如下(需要拷貝到/etc/kubernetes
目錄下):
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: cgroupfs
clusterDNS: ["169.169.0.100"]
clusterDomain: cluster.local
authentication:
anonymous:
enabled: true
在本例中設置的kubelet參數如下。
address
:服務監聽IP地址。port
:服務監聽端口號,默認值爲10250。cgroupDriver
:設置爲cgroupDriver驅動,默認值爲cgroupfs,可選項包括systemd。clusterDNS
:集羣DNS服務的IP地址,例如169.169.0.100。clusterDomain
:服務DNS域名後綴,例如cluster.local。authentication
:設置是否允許匿名訪問或者是否使用webhook進行鑑權。
(3)在配置文件準備完畢後,在各Node主機上啓動kubelet服務並設置爲開機自啓動:
# 啓動kubelet服務並設置爲開機啓動
systemctl start kubelet && systemctl enable kubelet
# 查看kubelet服務運行狀態
systemctl status kubelet
如果啓動失敗,查看kubelet日誌:journalctl -xefu kubelet
。
部署kube-proxy服務
(1)爲kube-proxy服務創建systemd服務配置文件/usr/lib/systemd/system/kube-proxy.service
,內容如下:
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=always
[Install]
WantedBy=multi-user.target
(2)配置文件/etc/kubernetes/proxy
的內容爲通過環境變量KUBE_PROXY_ARGS
設置的kube-proxy的全部啓動參數,示例如下:
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.3.138 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
對主要參數說明如下。
--kubeconfig
:設置與API Server連接的相關配置,可以與kubelet使用的kubeconfig文件相同。相關客戶端CA證書使用部署kubelet服務時從Master主機複製到Node主機的/etc/kubernetes/pki目錄下的文件,包括ca.crt、client.key和client.crt。--hostname-override
:設置本Node在集羣中的名稱,默認值爲主機名,各Node應被設置爲本機IP或域名。--proxy-mode
:代理模式,包括iptables、ipvs、kernelspace(Windows節點使用)等。
上述配置文件需要在所有Node節點進行。
(3)在配置文件準備完畢後,在各Node主機上啓動kube-proxy服務,並設置爲開機自啓動:
# 啓動kube-proxy服務並設置開機啓動
systemctl start kube-proxy && systemctl enable kube-proxy
# 查看kube-proxy服務運行狀態
systemctl status kube-proxy
如果啓動服務失敗,查看kube-proxy日誌:journalctl -xefu kube-proxy
。
在Master上通過kubectl驗證Node信息
在各個Node的kubelet
和kube-proxy
服務正常啓動之後,會將本Node自動註冊到Master上,然後就可以到Master主機上通過kubectl查詢自動註冊到Kubernetes集羣的Node的信息了。
由於Master開啓了HTTPS認證,所以kubectl也需要使用客戶端CA證書連接Master,可以直接使用kube-controller-manager
的kubeconfig
文件,命令如下:
[root@m1 ~]# kubectl --kubeconfig=/etc/kubernetes/kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
192.168.3.138 NotReady <none> 3m29s v1.19.0
192.168.3.139 NotReady <none> 2m55s v1.19.0
可以看到各Node的狀態爲“NotReady”,這是因爲還沒有部署CNI網絡插件,無法設置容器網絡。
類似於通過kubeadm創建Kubernetes集羣,例如選擇Calico CNI插件運行下面的命令一鍵完成CNI網絡插件的部署:
在Master節點上執行如下安裝:
kubectl apply -f "https://docs.projectcalico.org/manifests/calico.yaml"
如果是網絡原因無法正常訪問https://docs.projectcalico.org/manifests/calico.yaml
,可以先手動下載到本地再執行。
比如保存到本地文件名爲:calico.yaml
,則可以執行如下命令:
kubectl apply -f ./calico.yaml
遇到報錯:The connection to the server localhost:8080 was refused - did you specify the right host or port?
解決:由於啓用了CA認證,所以在使用kubectl命令時也必須指定kubeconfig配置文件。
kubectl --kubeconfig=/etc/kubernetes/kubeconfig apply -f ./calico.yaml
報錯:error: unable to recognize "./calico.yaml": no matches for kind "PodDisruptionBudget" in version "policy/v1"
原因:下載的calico.yaml版本爲:v3.26.1,即:https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
由於安裝的k8s版本爲:v1.19.0
版本,根據calico與k8s的版本對應關係,重新下載v3.19版本的calio.yaml,並命名爲:calico_v319.yaml
。
再次執行:
kubectl --kubeconfig=/etc/kubernetes/kubeconfig apply -f ./calico_v319.yaml
安裝成功。
在CNI網絡插件成功運行之後,Node的狀態會更新爲“Ready”:
[root@m1 ~]# kubectl --kubeconfig=/etc/kubernetes/kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
192.168.3.138 Ready <none> 17h v1.19.0
192.168.3.139 Ready <none> 17h v1.19.0
[root@m1 ~]#
執行如下命令查看Node節點詳細信息:
kubectl --kubeconfig=/etc/kubernetes/kubeconfig describe nodes
卸載cni:如果CNI插件版本不對需要卸載,執行如下命令:
kubectl --kubeconfig=/etc/kubernetes/kubeconfig delete -f ./calico_v319.yaml