cka-静态pod

了解什么是静态pod

正常情况下pod是在master上统一管理,指定,分配。所谓静态pod就是不接受master的管理,在node上只要启动kubelet,则会自动的创建pod。

比如使用kubeadm安装的kubernetes,里面想apiserver、kube-proxy等组件都是以pod的方式运行的。那么问题就来了,这些pod如果没运行的话则意味着master就没有运行,如果master如果没有运行的话,那么apiserver、kube-proxy这些pod又是如何运行起来的呢?这就是先有鸡还是先有蛋的问题了,所以需要一个突破口,这个突破口就是静态pod。

指定静态pod的路径

在某节点(注意,这里是在worker上不是master上操作的)上,假设在vms11这台机器上,执行systemctl status kubelet,查看kubelet启动的参数文件为/etc/systemd/system/kubelet.services.d/10-kubeadm.conf:
file
编辑这个文件,在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"

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

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

重启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 ~]#

创建静态pod

在/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。
在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正常运行了。
如果在vms11上删除此yaml文件的话,则这个静态pod会被自动的删除

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

然后到master再次进行查看:

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

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

master上静态pod的指定方式

除了这种指定静态pod的方式之外,还有另外一种方式也可以指定静态pod的方式。在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 -1 /etc/kubernetes/manifests/
etcd.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
[root@vms10 pod]#

如果这个路径修改错误的话,则读取不到这些静态pod的yaml文件,就会导致k8s启动失败,比如修改静态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]# 
[root@vms10 pod]# systemctl restart kubelet
[root@vms10 pod]#

启动kubelet的时候,kubelet会到/etc/kubernetes/manifestsxxx加载各种yaml文件,但是此目录根本就不存在,所以加载失败,则apiserver、kube-proxy等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]#

我们需要指定正确的静态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启动不了。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读