静态Pod是直接有Node节点上的Kubelet进程进行管理,不通过Master节点Apiserver进行生命周期管理。静态Pod不关联任何Replication Controller控制器,它由Kubelet进程自己来监控,Pod崩溃时Kubelet负责重启Pod,但是静态Pod是没有健康检查,而且始终绑定节点Kubelet进程,所以始终运行在同一个节点,没有办法做迁移。
在此基础上,Kubelet会自动为每个静态Pod在Kubernetes的Apiserver上创建一个与之镜像的Pod(Mirror Pod),此镜像Pod只能在Apiserver上查询状态,但是不能被Apiserver做其他操作(例如:删除)
静态Pod被用于Master组件的运行,并配置为Kubelet守护进程的启动/重新加载时运行,Kubeadm在创建集群时,Apiserver都没启动,会使用静态Pod创建master主要组件
静态Pod的创建方式有2种:
常用manifest的YAML文件目录
/etc/kubernetes/manifests
在/etc/systemd/system/kubelet.service文件下
# cat kubelet.service
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
ExecStart=/opt/kube/bin/kubelet \
--config=/var/lib/kubelet/config.yaml \
--cni-bin-dir=/opt/kube/bin \
--cni-conf-dir=/etc/cni/net.d \
--hostname-override=192.168.2.10 \
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
--network-plugin=cni \
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1 \
--root-dir=/var/lib/kubelet \
--cpu-cfs-quota=false \
--pod-manifest-path=/etc/kubernetes/manifests \ #static pod manifest
--v=2
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
然后重新启动Kubelet 进程
systemctl daemon-reload
systemctl restart kubelet.service
/var/lib/kubelet/config.yaml
vi /var/lib/kubelet/config.yaml
...
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 2m0s
serializeImagePulls: true
# add staticPodPath
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 4h0m0s
...
重启kubelet进程
systemctl restart kubelet
Kubelet周期地从--manifest-url=
参数指定的地址下载文件,并且把它翻译成JSON/YAML格式的pod定义。此后的操作方式与--pod-manifest-path=
相同,kubelet会不时地重新下载该文件,当文件变化时对应地终止或启动静态pod
运行中的kubelet周期扫描配置的目录(我们这个例子中就是/etc/kubernetes/manifests
)下文件的变化,当这个目录中有文件出现或消失时创建或删除pods
[joe@my-node1 ~] $ mv /etc/kubernetes/manifests/static-web.yaml /tmp
[joe@my-node1 ~] $ sleep 20
[joe@my-node1 ~] $ docker ps
// no nginx container is running
[joe@my-node1 ~] $ mv /tmp/static-web.yaml /etc/kubernetes/manifests/
[joe@my-node1 ~] $ sleep 20
[joe@my-node1 ~] $ docker ps
CONTAINER ID IMAGE COMMAND CREATED ...
e7a62e3427f1 nginx:latest "nginx -g 'daemon of 27 seconds ago