高可用Kubernetes集群-9. 部署kubelet


 十一.部署kubelet

接下來兩個章節是部署Kube-Node相關的服務,包含:kubelet,kube-proxy。

1. TLS bootstrap用戶授權

# kubelet采用TLS Bootstrapping 機制,自動完成到kube-apiserver的注冊,在node節點量較大或者后期自動擴容時非常有用。
# kubelet 啟動時向 kube-apiserver 發送 TLS bootstrapping 請求,需要先將 bootstrap token 文件中的 kubelet-bootstrap 用戶賦予ClusterRole system:node-bootstrapper 角色(通過kubectl get clusterroles可查詢),然后 kubelet 才有權限創建認證請求,通過創建ClusterRoleBinding可實現;
# --user=kubelet-bootstrap 指定用戶名,這里即文件 /etc/kubernetes/bootstrap/token.csv (前文創建)中指定的用戶名,同時也需要寫入kubeconfig文件 /etc/kubernetes/bootstrap.kubeconfig;
[root@kubenode1 ~]# kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap

# ClusterRoleBinding:kubelet-bootstrap創建成功
[root@kubenode1 ~]# kubectl get clusterrolebinding

2. 創建kube-scheduler kubeconfig文件

[root@kubenode1 ~]# cd /etc/kubernetes/bootstrap/

# 配置集群參數;
# --embed-certs:設置為 true 表示將 certificate-authority 證書寫入到生成的 bootstrap.kubeconfig 文件中
[root@kubenode1 bootstrap]# kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://172.30.200.10:6443 \
--kubeconfig=bootstrap.kubeconfig

# 配置客戶端認證參數;
# 認證用戶為前文token.csv文件中的“kubelet-bootstrap”;
# 指定token,前文中已設定的token的環境變量,證書與私鑰由kube-apiserver在kubeler首次注冊是自動生成
[root@kubenode1 bootstrap]# kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig

# 配置上下文參數
[root@kubenode1 bootstrap]# kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig

# 配置默認上下文
[root@kubenode1 bootstrap]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

# 分發bootstrap.kubeconfig到所有node節點
[root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.22:/etc/kubernetes/bootstrap/
[root@kubenode1 bootstrap]# scp bootstrap.kubeconfig root@172.30.200.23:/etc/kubernetes/bootstrap/

3. 配置kubelet的systemd unit文件

相關可執行文件在部署kubectl時已部署完成。

# kubelet依賴於docker.service服務,在其啟動之后啟動;
# 可通過ExecStartPost設置iptables開放tcp 4194端口,為cAdvisor做准備
[root@kubenode1 ~]# touch /usr/lib/systemd/system/kubelet.service
[root@kubenode1 ~]# vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/usr/local/kubernetes/kubelet.conf
ExecStart=/usr/local/kubernetes/bin/kubelet $KUBELET_ARGS
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

# 創建工作目錄
[root@kubenode1 ~]# mkdir -p /var/lib/kubelet

# 配置啟動參數文件;
# --address:綁定主機ip地址,默認值”0.0.0.0”表示使用全部網絡接口;
# --hostname-override:設置node在集群中的主機名,默認使用主機hostname;如果設置了此項參數,kube-proxy服務也需要設置此項參數;
# --pod-infra-container-image:用於Pod內namespace共享的基礎pause鏡像,默認值即” gcr.io/google_containers/pause-amd64:3.0”;建議節點上提前pull相關鏡像以提升部署效率;
# --bootstrap-kubeconfig:kubelet首次啟動在沒有客戶端證書文件時,將使用指定的kubeconfig配置到kube-apiserver獲取客戶端證書;通過csr請求,成功獲取后在--kubeconfig指定的路徑生成kubeconfig文件;證書與私鑰文件將被保存到--cert-dir指定的目錄下;
# --cluster-dns:指定集群內dns服務器,以逗號分隔;kubelet在新創建的Pod中設DNS域名解析配置文件/etc/resolv.conf文件,寫入nameserver與search配置;
# --cluster-domain:集群內dns服務器域名;
# --allow-privileged:是否允許以特權模式啟動容器,默認false;
# --serialize-image-pulls:按順序pull鏡像,默認值true;
# --fail-swap-on=false:如果節點開啟了swap,節點不能啟動kubelet服務,默認值true,在v1.8.x與v1.9.x版本時注意
[root@kubenode1 ~]# touch /usr/local/kubernetes/kubelet.conf
[root@kubenode1 ~]# vim /usr/local/kubernetes/kubelet.conf
KUBELET_ARGS="--address=172.30.200.21 \
  --hostname-override=172.30.200.21 \
  --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.0 \
  --bootstrap-kubeconfig=/etc/kubernetes/bootstrap/bootstrap.kubeconfig \
  --kubeconfig=/etc/kubernetes/bootstrap/kubelet.kubeconfig \
  --cert-dir=/etc/kubernetes/bootstrap \
  --cluster-dns=169.169.0.11 \
  --cluster-domain=cluster.local. \
  --allow-privileged=true \
  --serialize-image-pulls=false \
  --fail-swap-on=false \
  --logtostderr=false \
  --log-dir=/var/log/kubernetes/kubelet \
  --v=2"

# 創建日志目錄
[root@kubenode1 ~]# mkdir -p /var/log/kubernetes/kubelet

4. 啟動並驗證

1)kubelet狀態驗證

[root@kubenode1 ~]# systemctl daemon-reload
[root@kubenode1 ~]# systemctl enable kubelet
[root@kubenode1 ~]# systemctl start kubelet
[root@kubenode1 ~]# systemctl status kubelet

2)通過kubelet的TLS證書請求

kubelet 首次啟動向 kube-apiserver 發送證書簽名請求,必須由 kubernetes 系統允許通過后,才會將該 node 加入到集群。

以kubenode1為例,其余節點類似。

# 查看未授權的csr請求,處於”Pending”狀態
[root@kubenode1 ~]# kubectl get csr

# 通過csr請求,狀態變更為”Approved, Issued”;
# 集群節點已“Ready”
[root@kubenode1 ~]# kubectl certificate approve node-csr-Gl5zdgp6IZYQBAV1S59vXDZzHbirH9qDMb0xHaDnDIA
[root@kubenode1 ~]# kubectl get nodes

3)kubelet證書與私鑰

# 在指定的目錄,可查詢自動生成的kubelet證書,私鑰及kubeconfig文件等;
[root@kubenode1 ~]# ll /etc/kubernetes/bootstrap/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM