深入理解Pod-静态Pod

前面我们详细讲解了 Yaml ⽂件的使⽤,也⼿动的创建了⼀个简单的 Pod,今天我们来深⼊的学习下 Pod。在Kubernetes集群中除了我们经常使⽤到的普通的 Pod 外,还有⼀种特殊 的 Pod,叫做 Static Pod ,通俗讲就是静态 Pod,静态 Pod 有什么特殊的地方呢?

首先,静态 Pod 直接由特定节点上的 kubelet 进程来管理,不通过 master 节点上的 apiserver 。⽆法与我们常⽤的控制器 Deployment 或者 DaemonSet 进⾏关联,它由 kubelet 进程自己来监控,当 pod 崩溃时重启该 pod , kubelete 也⽆法对他们进⾏健康检查。静态 pod 始终绑定在某⼀个 kubelet ,并且始终运⾏在同⼀个节点上。 kubelet 会⾃动为每⼀个静态 pod 在 Kubernetes 的 apiserver 上创建⼀ 个镜像 Pod(Mirror Pod),因此我们可以在 apiserver 中查询到该 pod,但是不能通过 apiserver 进 ⾏控制(例如不能删除)。

创建静态 Pod 有两种⽅式:配置⽂件和 HTTP 两种⽅式;下面我们就来详细的看看这两种静态Pod的创建方式。

1、通过配置文件创建Pod

配置⽂件就是放在特定目录下的标准的 Json 或 Yaml 格式的 pod 定义⽂件。用 kubelet –podmanifest- path= 来启动 kubelet 进程,kubelet 定期的去扫描这个⽬录,根据这个目录下出现或消失的 Yaml/Json ⽂件来创建或删除静态 pod。

例如、我们在 Node01 节点上⽤静态 pod 的⽅式来启动⼀个 nginx 的服务。我们登录到 Node01 节点 上⾯,可以通过下⾯命令找到kubelet对应的启动配置⽂件:

[root@Node01 ~]# systemctl status kubelet

img

我们可以看到配置文件的路径为:

/usr/lib/systemd/system/kubelet.service.d
     └─10-kubeadm.conf

打开这个⽂件我们可以看到配置文件里面并没有配置环境变量、那么我们手动添加环境变量配置,增加–pod-manifest-path 参数,然后重启Kubelet即可:

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allowprivileged=true"

img

所以如果我们通过 kubeadm 的⽅式来安装的集群环境,对应的 kubelet 已经配置了我们的静态 Pod 文件的路径,那就是 /etc/kubernetes/manifests ,所以我们只需要在该⽬录下⾯创建⼀个标准的 Pod 的 Json 或者 Yaml ⽂件即可:

# /etc/kubernetes/manifest/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    app: static
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80

kubelet 启动时,由 –pod-manifest-path= or –manifest-url= 参数指定的⽬录下定义的所有 pod 都会自动创建,例如,我们示例中的 static-web:

然后我们可以通过 kubectl get pods 命令看到Pod已经启动了、这里因为Yaml文件中并没有指定namespace、所以我们直接通过 kubectl get pods 命令就可以看到该Pod:

img

此时如果我们把Yaml文件删除、再次执行 kubectl get pods 命令,可以看到、Pod已经没有了。静态 Pod 的标签会传递给镜像 Pod,可以⽤来过滤或筛选。 需要注意的是,我们不能通过 API 服务器来删除静态 pod(例如,通过kubectl命令),kebelet 不会删除它:

img

运⾏中的kubelet周期扫描配置的⽬录(我们这个例⼦中就是/etc/kubernetes/manifests)下⽂件的变
化,当这个⽬录中有⽂件出现或消失时创建或删除pods。

当然、我们在Master节点同样也可以看到该Pod、如果我们执行 kubectl delete pod static-web-node01命令删除该Pod发现,并不能删除。这也就是解释了我们上面所说的:静态 Pod 直接由特定节点上的 kubelet 进程来管理,不通过 master 节点上的 apiserver 。所以只能有 kubelet 自己来进⾏控制,这就是我们所说的静态 Pod。img

2、通过HTTP创建Pod

kubelet 周期地从 –manifest-url= 参数指定的地址下载⽂件,并且把它翻译成 Json/Yaml 格式的
pod 定义。此后的操作⽅式与 –pod-manifest-path= 相同,kubelet 会不时地重新下载该⽂件,当⽂件
变化时对应地终止或启动静态 pod;过程和原理都是一样的这里就不再详细介绍了。

推荐文章