概述

今儿是冬至,尽管如此,学习的脚步还是不能停下,今天学习实践一下kubernetes中的静态pod是什么?

我们知道在前面Pod的声明周期管理都是通过像DaemonSet、StatefulSet、Deployment这种方式创建管理的,而官方文档介绍了一种特殊的pod就是静态Pod,

什么是静态Pod

静态Pod是由kubelet进行管理,仅存在于特定Node上的Pod。它们不能通过API Server进行管理,无法与ReplicationController、Deployment或DaemonSet进行关联,并且kubelet也无法对其健康检查。

静态Pod的创建:

静态pod可以通过两种方式创建:使用配置文件或HTTP。

通过配置文件创建

配置文件只是特定目录中json或yaml格式的标准pod定义。他通过在kubelet守护进程中添加配置参数--pod-manifest-path=<the directory> 来运行静态Pod,kubelet经常会它定期扫描目录;

例如,如何将一个简单web服务作为静态pod启动

选择运行静态pod的节点服务器
不一定是node节点,只要有kubelet进程所在的节点都可以运行静态pod

我在某个节点上创建一个放置一个Web服务器pod定义的描述文件文件夹,例如/etc/kubelet.d/static-web.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ mkdir /etc/kubelet.d/
$ cat <<EOF >/etc/kubelet.d/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
labels:
role: myrole
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
EOF

$ ls /etc/kubelet.d/
static-web.yaml

通过使用–pod-manifest-path=/etc/kubelet.d/参数运行它,在节点上配置我的kubelet守护程序以使用此目录。
比如我这里kubelet启动参数位于/etc/systemd/system/kubelet.service.d/10-kubelet.conf, 修改配置,然后将参数加入到现有参数配置项中(安装方式不尽相同,但是道理一样)

1
2
3
4
5
6
$ vim /etc/systemd/system/kubelet.service.d/10-kubelet.conf
······
······
Environment="KUBELET_EXTRA_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local --pod-manifest-path=/etc/kubelet.d/"
······
······

保存退出,reload一下systemd daeomon ,重启kubelet服务进程

1
2
$ systemctl daemon-reload
$ systemctl restart kubelet

前面说啦,当kubelet启动时,它会自动启动在指定的目录–pod-manifest-path=或–manifest-url=参数中定义的所有pod ,即我们的static-web。
再该节点上检查是否创建成功:

1
2
3
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
static-web-k8s-m1 1/1 Running 0 2m 10.244.2.32 k8s-m1

上面也提到了,他不归任何部署方式来管理,即使我们尝试kubelet命令去删除

1
2
3
4
5
$ kubectl delete pod static-web-k8s-m1
pod "static-web-k8s-m1" deleted
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
static-web-k8s-m1 0/1 Pending 0 2s <none> k8s-m1 <none>

可以看出静态pod通过这种方式是没法删除的

那我如何去删除或者说是动态的添加一个pod呢?
这种机制已经知道,kubelet进程会定期扫描配置的目录(/etc/kubelet.d在我的示例)以进行更改,并在文件出现/消失在此目录中时添加/删除pod。

通过url来创建:

例如,我在这个url放置了一个pod创建的描述文件

那么上面提到了如何修改?通过url来创建的?就是kubelet启动配置参数中配置--manifest-url指向即可

static-pod-from-url
static-pod-from-url

ok 以上就是如何创建静态Pod的具体食用方法,那什么场景需要用到它,这个我个人觉得还是因人或因环境而已,毕竟kubernetes开发出了这个功能,就说明有用武之地的。

同时在kubelet-conf.yml可以指定直接指定这个StaticPod的描述文件存放目录:

1
2
3
4
5
6
$ cat kubelet-conf.yml
......
......
staticPodPath: /etc/kubernetes/manifests
......
......

但是还是需要在启动参数中配置 --pod-manifest-path