書籍來源:《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啟動不了。