天天看點

Kubernetes認證考試自學系列 | 靜态pod

書籍來源:《CKA/CKAD應試指南:從Docker到Kubernetes完全攻略》

一邊學習一邊整理讀書筆記,并與大家分享,侵權即删,謝謝支援!

附上彙總貼:Kubernetes認證考試自學系列 | 彙總_COCOgsta的部落格-CSDN部落格

正常情況下,pod在master上統一管理、指定、配置設定。所謂靜态pod,是指不是由master建立啟動,在node上隻要啟動kubelet,就會自動地建立pod。

比如使用kubeadm安裝的kubernetes,裡面像kube-apiserver、kube-scheduler等元件都是以pod的方式運作的。那麼問題就來了,如果這些pod沒有運作的話,則意味着master就沒有運作,如果master沒有運作的話,那麼kube-apiserver、kube-scheduler這些pod又是如何運作起來的呢?這就是先有雞還是先有蛋的問題了,是以需要一個突破口,這個突破口就是靜态pod。

5.5.1 建立靜态pod

本節講解的是建立靜态pod的具體過程,注意這裡是在worker上操作的。

步驟1:檢視kubelet運作的參數檔案。

在某節點上(注意,這裡是在worker上,不是master上操作的),假設在vms11這台機器上執行systemctl status kubelet。

[root@vms11 ~]# systemctl status kubelet
kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service ; enabled; vendor preset: disabled)
 Drop-In: /usr/lib/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
         ... 大量輸出 ...
[root@vms11 ~]#           

檢視kubelet啟動的參數檔案為/usr/lib/systemd/system/kubelet.services.d/10-kubeadm.conf。

步驟2:編輯這個檔案,在Environment最後添加--pod-manifest-path=/etc/kubernetes/kubelet.d,如下所示。

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/kubelet.d"           

步驟3:如果/etc/kubernetes/kubelet.d不存在,則把這個目錄建立出來。

[root@vms11 ~]# mkdir /etc/kubernetes/kubelet.d
[root@vms11 ~]#            

步驟4:重新開機kubelet服務。

[root@vms11 ~]# systemctl restart kubelet
Warning: kubelet.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@vms11 ~]# systemctl daemon-reload 
[root@vms11 ~]# systemctl restart kubelet 
[root@vms11 ~]#           

步驟5:在vms11上,于/etc/kubernetes/kubelet.d下建立一個pod的yaml檔案test.yaml。

[root@vms11 ~]# cat /etc/kubernetes/kubelet.d/test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-web 
  namespace: default 
  labels:
    role: myrole 
spec:
  containers:
  - name: web
    image: nginx
    imagePullPolicy: IfNotPresent
[root@vms11 ~]#           

上述yaml檔案是在default命名空間裡建立一個名字為static-web的pod。

步驟6:在master上進行檢視。

[root@vms10 pod]#
[root@vms10 pod]# kubectl get pods 
NAME                         READY   STATUS    RESTARTS   AGE 
static-web-vms11.rhce.cc     1/1     Running   0          13s 
[root@vms10 pod]#           

可以看到此pod正常運作了。

步驟7:如果在vms11上删除此yaml檔案的話,則這個靜态pod會被自動地删除。

[root@vms11 ~]# rm -rf /etc/kubernetes/kubelet.d/test.yaml 
[root@vms11 ~]# systemctl restart kubelet 
[root@vms11 ~]#           

步驟8:到master再次進行檢視。

[root@vms10 pod]# kubectl get pods 
No resources found in default namespace.
[root@vms10 pod]#           

可以看到pod已經被删除了。

5.5.2 master上靜态pod的指定方式

除了這種指定靜态pod的方式之外,還有另外一種方式也可以指定靜态pod。

步驟1:在master上打開/etc/systemd/system/kubelet.services.d/10-kubeadm.conf之後,看到裡面有一行Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml",此檔案裡也定義了靜态pod所在路徑。

[root@vms10 pod]# grep static /var/lib/kubelet/config.yaml 
staticPodPath: /etc/kubernetes/manifests 
[root@vms10 pod]#           

其實,master元件,比如apiserver、kube-proxy等靜态配置檔案都是放在此目錄裡的。

[root@vms10 pod]# ls -l /etc/kubernetes/manifests/
etcd.yaml
kube-apiserver.yaml 
kube-controller-manager.yaml 
kube-scheduler.yaml 
[root@vms10 pod]#           

如果這個路徑修改錯誤的話,則讀取不到這些靜态pod的yaml檔案,就會導緻k8s啟動失敗。

步驟2:修改靜态pod路徑并重新開機kubelet。

[root@vms10 pod]# grep static /var/lib/kubelet/config.yaml 
staticPodPath: /etc/kubernetes/manifestsxxx 
[root@vms10 pod]# ls /etc/kubernetes/manifestsxxx 
ls: 無法通路 /etc/kubernetes/manifestsxxx: 沒有那個檔案或目錄
[root@vms10 pod]#           

步驟3:重新開機kubelet。

[root@vms10 pod]# systemctl restart kubelet 
[root@vms10 pod]#           

啟動kubelet的時候,kubelet會到/etc/kubernetes/manifestsxxx加載各種yaml檔案,但是此目錄根本就不存在,是以加載失敗,則kube-apiserver、kube-scheduler等pod就啟動不起來,master也就沒有運作,是以執行kubectl指令的時候就會報錯。

[root@vms10 pod]# kubectl get nodes 
The connection to the server 192.168.26.10:6443 was refused - did you specify the right host or port?
[root@vms10 pod]#           

步驟4:我們需要指定正确的靜态pod位址才可以運作。

[root@vms10 pod]# grep static /var/lib/kubelet/config.yaml 
staticPodPath: /etc/kubernetes/manifests 
[root@vms10 pod]# systemctl restart kubelet
[root@vms10 pod]#           

是以一開始的實驗在worker上做沒問題,如果在master通過--pod-manifest-path指定靜态pod的路徑為/etc/kubernetes/kubelet.d的話,則覆寫了預設的路徑/etc/kubernetes/manifests,也會導緻k8s啟動不了。

繼續閱讀