K8s新手系列之静态Pod

什么是静态Pod?

静态 Pod 在指定的节点上由 kubelet 守护进程直接管理,不需要 Kubernetes API Server 监管。 与由控制面管理的 Pod(例如Deployment) 不同;kubelet 监视每个静态 Pod(在它失败之后重新启动)。

静态 Pod 始终都会绑定到特定节点的 Kubelet 上。

kubelet 会尝试通过 Kubernetes API 服务器为每个静态 Pod 自动创建一个镜像 Pod。 这意味着节点上运行的静态 Pod 对 API 服务来说是可见的,但是不能通过 API 服务器来控制。 Pod 名称将把以连字符开头的节点主机名作为后缀。

注意:

  • 静态 Pod 的 spec 不能引用其他 API 对象 (如:ServiceAccount、 ConfigMap、 Secret 等)。这里很好理解,因为kubelet的作用仅仅只是管理和维护Pod对象

  • 静态 Pod 不支持临时容器。临时容器的创建和管理依赖于 Kubernetes API Server。在使用kubectl debug命令创建临时容器时,该命令会与 API Server 通信,由 API Server 来处理容器的创建请求。由于静态 Pod 不经过 API Server 管理,API Server 无法直接操作静态 Pod 来添加临时容器。

  • 如果你在运行一个 Kubernetes 集群,并且在每个节点上都运行一个静态 Pod, 就可能需要考虑使用 DaemonSet 替代这种方式。

  • 静态 Pod 创建不基于Kubernetes API Server,因此也无法基于Kubernetes API Server进行删除

  • 静态Pod创建资源仅对Pod类型有效

  • kubeadm部署K8s集群方式就是基于静态Pod技术实现master组件的快速部署。

静态Pod的作用

节点级基础服务部署

可以用于在每个节点上运行一些关键的、与节点紧密相关的基础服务。例如,在 Kubernetes 集群中,用于监控节点资源使用情况的监控代理,如 Prometheus Node Exporter,它需要在每个节点上运行,以收集该节点的 CPU、内存、磁盘等资源的使用数据。通过将监控代理定义为静态 Pod,Kubelet 会在节点启动时自动创建和管理这些 Pod,确保监控服务在每个节点上都能稳定运行。

本地资源管理

有助于管理节点上的本地资源。比如,在一些需要使用节点本地存储的场景中,静态 Pod 可以被配置为挂载节点上的特定目录,用于存储和处理本地数据。以日志收集为例,将日志收集器设置为静态 Pod,它可以直接访问节点上的日志文件目录,将日志数据进行收集和处理,然后发送到集中式的日志管理系统中。这样可以确保每个节点上的日志都能被及时收集,而不会因为依赖 API Server 的调度而出现延迟或故障。

集群初始化和引导

在 Kubernetes 集群的初始化和引导阶段,静态 Pod 起着重要的作用。例如,kube-apiserver、kube-controller-manager 和 kube-scheduler 等控制平面组件,在一些部署方式中可以作为静态 Pod 运行在特定的控制节点上。这些静态 Pod 会在节点启动时首先被创建和启动,为整个集群的正常运行提供基础的控制和管理功能。它们的稳定运行是集群后续正常工作的前提,能够确保 API Server 正常提供服务,控制器能够对集群中的资源进行有效的管理和调度。

高可用和故障转移

对于一些对可用性要求较高的服务,可以将其部署为静态 Pod。因为静态 Pod 直接由 Kubelet 管理,不依赖于 API Server 的调度,所以在 API Server 出现故障或网络问题时,静态 Pod 仍然可以在节点上保持运行状态,提供一定程度的服务连续性。例如,在一个分布式存储系统中,存储节点的静态 Pod 可以在节点故障恢复后自动重新启动,确保存储服务的快速恢复,减少数据丢失和服务中断的风险。

简化部署和管理

对于一些简单的、不需要复杂调度和管理的应用,使用静态 Pod 可以简化部署过程。用户只需要将 Pod 的配置文件放置在 Kubelet 指定的目录下,Kubelet 就会自动创建和管理这些 Pod,无需通过 API Server 进行复杂的资源申请和调度流程。这对于一些测试环境或小型集群中的简单应用来说,能够提高部署效率,降低管理成本。

查看集群中的静态Pod

[root@master01 ~/pod]# kubectl describe pod -A | grep "Controlled By:  Node" -C 20 | grep -E "Name:|Namespace|^Pro"
# etcd
Name:                 etcd-master01
Namespace:            kube-system
Priority Class Name:  system-node-critical
# kube-apiserver
Name:                 kube-apiserver-master01
Namespace:            kube-system
Priority Class Name:  system-node-critical
# controller-manager
Name:                 kube-controller-manager-master01
Namespace:            kube-system
Priority Class Name:  system-node-critical
# scheduler
Name:                 kube-scheduler-master01
Namespace:            kube-system
Priority Class Name:  system-node-critical
# sealos相关的
Name:                 kube-sealos-lvscare-node01
Namespace:            kube-system
Priority Class Name:  system-node-critical
Name:                 kube-sealos-lvscare-node02
Namespace:            kube-system
Priority Class Name:  system-node-critical

通过上述可以发现,master节点的组件都是通过kubelet创建的静态Pod

创建静态Pod

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/static-pod/

查看静态Pod的配置目录

需要在工作节点,也就是部署了kubelet的节点上执行下面的命令

[root@node02 ~]#  grep staticPodPath /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests

创建Pod

创建pod的资源清单文件

[root@node02 ~]# cat <<EOF >/etc/kubernetes/manifests/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

重启kubelet

[root@node02 ~]# systemctl restart kubelet

查看pod

[root@node02 ~]# kubectl get po static-web-node02
NAME                READY   STATUS    RESTARTS   AGE
static-web-node02   1/1     Running   0          109s

验证通过api-server管理静态pod

在master节点通过kubectl工具删除我们上面创建的静态pod

[root@master01 ~]# kubectl delete po static-web-node02
pod "static-web-node02" deleted
[root@master01 ~]# kubectl get po static-web-node02
NAME                READY   STATUS    RESTARTS   AGE
static-web-node02   1/1     Running   0          11s

我们可以发现,通过api-sevrer无法删除静态pod,当我们执行kubectl delete命令之后,虽然暂时的将静态pod删除了,但是kubelet又会重新拉起一个新的pod

动态增加和删除静态Pod

运行中的 kubelet 会定期扫描配置的目录/etc/kubernetes/manifests
在没有额外配置的情况下,Kubelet 每 20 秒就会检查 /etc/kubernetes/manifests 目录,查看是否有新的静态 Pod 配置文件添加、已有文件被修改或者文件被删除。若有变动,Kubelet 会相应地创建、更新或删除静态 Pod。

我们如果删除上述创建的静态pod,可以将/etc/kubernetes/manifests对应的资源清单删除即可
示例:

[root@node02 ~]# mv /etc/kubernetes/manifests/static-web.yaml /tmp/
[root@node02 ~]# kubectl get po static-web-node02
Error from server (NotFound): pods "static-web-node02" not found

如果要新增静态Pod,则添加对应的资源文件,稍微等待一下即可

[root@node02 ~]# mv /tmp/static-web.yaml /etc/kubernetes/manifests/
[root@node02 ~]# kubectl get po static-web-node02
NAME                READY   STATUS    RESTARTS   AGE
static-web-node02   1/1     Running   0          9s

kubelet创建静态Pod的流程

  1. 配置文件监控

    • 指定目录:Kubelet 启动时会被配置一个用于存放静态 Pod 配置文件的目录,默认是 /etc/kubernetes/manifests。

    • 定期扫描:Kubelet 会按照一定的时间间隔(默认 20 秒)扫描该目录,检查是否有新的配置文件添加、已有文件被修改或者文件被删除。这个时间间隔可以通过 --manifest-tick 标志进行调整。

  2. 配置文件解析

    • 文件读取:当 Kubelet 发现新的或修改后的配置文件时,会读取这些文件内容。配置文件通常是 YAML 或 JSON 格式,描述了 Pod 的各种属性,如容器镜像、资源请求、环境变量等。

    • 格式验证:Kubelet 会对读取到的配置文件进行格式验证,确保其符合 Kubernetes 的 API 规范。如果配置文件格式不正确,Kubelet 会记录错误日志,不会创建 Pod。

  3. 与 API Server 通信

    • 注册 Pod:Kubelet 会将解析后的静态 Pod 配置信息发送到 Kubernetes API Server,在 API Server 上创建一个对应的 Pod 对象。这个 Pod 对象的名称会在原来的基础上加上节点名作为前缀,以区分不同节点上的静态 Pod。

    • 状态同步:Kubelet 会定期与 API Server 同步 Pod 的状态信息,确保 API Server 上的 Pod 状态与实际节点上的运行状态一致。

  4. 创建容器运行时环境

    • 选择容器运行时:Kubelet 会根据配置选择合适的容器运行时,如 Docker、Containerd 或 CRI-O 等。

    • 拉取镜像:如果容器镜像不在本地,Kubelet 会根据镜像拉取策略(如 Always、IfNotPresent 等)从镜像仓库拉取所需的镜像。

    • 创建沙箱:Kubelet 会为 Pod 创建一个容器沙箱,这个沙箱提供了 Pod 运行所需的隔离环境,包括网络命名空间、PID 命名空间等。

  5. 启动容器

    • 容器初始化:Kubelet 会根据 Pod 配置文件中的定义,初始化每个容器的参数,如命令、环境变量、挂载卷等。

    • 容器启动:Kubelet 调用容器运行时的 API 启动容器,并将容器加入到之前创建的沙箱中。

  6. 监控和管理

    • 状态检查:Kubelet 会定期检查容器的运行状态,如是否正常运行、是否发生错误等。如果容器出现异常,Kubelet 会根据配置进行相应的处理,如重启容器。

    • 资源管理:Kubelet 会监控容器的资源使用情况,确保容器使用的资源不超过其请求的资源配额。如果超过配额,Kubelet 可能会对容器进行限制或终止。

  7. 配置文件更新处理

    • 检测变化:当 Kubelet 再次扫描配置文件目录时,如果发现某个静态 Pod 的配置文件被修改,它会根据新的配置更新 Pod。

    • 滚动更新:Kubelet 会以滚动更新的方式更新 Pod,先创建新的容器,然后逐步替换旧的容器,确保服务的连续性。

  8. 配置文件删除处理

    • 检测删除:如果 Kubelet 发现某个静态 Pod 的配置文件被删除,它会停止并删除该 Pod。

    • 清理资源:Kubelet 会清理与该 Pod 相关的所有资源,包括容器、网络和存储资源等。

posted @ 2025-05-01 13:31  huangSir-devops  阅读(167)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。