Kubernetes认证考试自学系列 | 静态pod

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:Kubernetes认证考试自学系列 | 汇总_COCOgsta的博客-CSDN博客


所谓静态pod,是指不是由master创建启动,在node上只要启动kubelet,就会自动地创建pod。

比如使用kubeadm安装的kubernetes,里面像kube-apiserver、kube-scheduler等组件都是以pod的方式运行的。如果这些pod没有运行的话,则意味着master就没有运行,如果master没有运行的话,那么kube-apiserver、kube-scheduler这些pod又是如何运行起来的呢?

5.5.1 创建静态pod

注意这里是在worker上操作的。

步骤1:查看kubelet运行的参数文件。

在某节点上(注意,这里是在worker上,不是master上操作的),假设在vms11这台机器上执行systemctl status kubelet。

 
 

ruby

复制代码

[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启动的参数文件为/etc/systemd/system/kubelet.services.d/10-kubeadm.conf。

步骤2:编辑这个文件,在Environment最后添加--pod-manifest-path=/etc/kubernetes/kubelet.d,如下所示。

 
 

css

复制代码

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

步骤3:如果/etc/kubernetes/kubelet.d不存在,则把这个目录创建出来。

 
 

csharp

复制代码

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

步骤4:重启kubelet服务。

 
 

csharp

复制代码

[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。

 
 

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: IfNotPresnet [root@vms11 ~]#

上述yaml文件是在default命名空间里创建一个名字为static-web的pod。

步骤6:在master上进行查看。

 
 

csharp

复制代码

[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会被自动地删除。

 
 

ini

复制代码

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

步骤8:到master再次进行查看。

 
 

csharp

复制代码

[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所在路径。

 
 

typescript

复制代码

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

其实,master组件,比如apiserver、kube-proxy等静态配置文件都是放在此目录里的。

 
 

csharp

复制代码

[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。

 
 

perl

复制代码

[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。

 
 

ini

复制代码

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

启动kubelet的时候,kubelet会到/etc/kubernetes/manifestsxxx加载各种yaml文件,但是此目录根本就不存在,所以加载失败,则kube-apiserver、kube-scheduler等pod就启动不起来,master也就没有运行,所以执行kubectl命令的时候就会报错。

 
 

ini

复制代码

[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地址才可以运行。

 
 

perl

复制代码

[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启动不了。

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/130628407