以二進制文件安裝K8S之部署Node服務

概述

在Node上需要部署Dockerkubeletkube-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部分內容:
  1. 部署kubelet服務
  2. 部署kube-proxy服務
  3. 在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的kubeletkube-proxy服務正常啓動之後,會將本Node自動註冊到Master上,然後就可以到Master主機上通過kubectl查詢自動註冊到Kubernetes集羣的Node的信息了。

由於Master開啓了HTTPS認證,所以kubectl也需要使用客戶端CA證書連接Master,可以直接使用kube-controller-managerkubeconfig文件,命令如下:

[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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章