Kubernetes(k8s)-静态(static)pod介绍

139 阅读4分钟

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们上一小节介绍了普通pod的时候有已经有提过管理节点也几个组件kube-apiserver/kube-controller-manager/kube-scheduler等也会默认有2个容器,可是我们明明才安装完成集群,他们的pod又从哪里来的呢?他们可以不依赖k8s就可以创建么?是的,这里就是我们要将到的静态pod。

这个静态pod,对于使用k8s经验较少的人,可能都没听过这个概念,一般运维不容易涉及到这个问题,下面我们就来讲讲这个静态pod。

静态Pod

静态Pod是Kubernetes中的一种特殊类型的Pod,由kubelet直接管理而不是由apiserver管理。这意味着静态Pods不受Kubernetes控制平面(如Scheduler、Controller Manager)的直接控制。静态Pods通常用于运行控制平面组件本身,如Kubernetes Master节点上的apiserver、controller-manager和scheduler。

静态Pods的特点如下:

  • 由Kubelet管理:静态Pods由在节点上运行的kubelet程序直接管理。kubelet会周期性扫描指定的目录,任何在这个目录中的Pod定义文件(通常是YAML或JSON格式)都会被自动创建。

  • 不通过apiserver:静态Pods不依赖于Kubernetes apiserver。即使apiserver不可用,kubelet也可以启动静态Pods。

  • 节点范围:静态Pods只能在它们启动的特定节点上运行,无法跨节点迁移。

  • 控制平面组件:静态Pods通常用于启动控制平面组件,因为它们可以在没有Kubernetes API的情况下启动。

创建静态Pod的步骤如下:

  1. 准备Pod的定义文件:创建一个包含Pod定义的YAML或JSON文件。这个定义与普通的Pod定义类似。

  2. 配置kubelet:在kubelet的配置中(通常是/etc/kubernetes/kubelet.conf),指定一个或多个用于存放静态Pod定义文件的目录。例如,你可以在kubelet的启动参数中加上--pod-manifest-path=/etc/kubernetes/manifests

  3. 将Pod定义文件放入指定目录:将上一步准备的Pod定义YAML或JSON文件放入kubelet配置中指定的目录。

  4. kubelet创建Pod:kubelet会自动检测目录中的新文件,并基于这些文件启动静态Pod。

  5. 验证静态Pod状态:可以通过在节点上运行kubectl get pods命令查看静态Pod的状态。尽管kubelet直接管理这些Pod,但它们的状态信息依然会被报告给apiserver并显示在kubectl命令的输出中。

静态Pod是Kubernetes集群初始化时的关键组件,因为它们可以在没有Kubernetes API的情况下启动必要的控制平面服务。然而,由于它们的管理和调度不受集群的统一管理,所以静态Pods主要用于特殊的用途,而不是通常的应用部署。

虽然可以通过kubectl 查看静态pod,但是无法删除该pod,虽然提示你删除成功,但是实际容器是不会真实删除的。这类pod重启,通常是通过移除/还原该pod的配置文件来实现的,这个操作反应有的时候很快,有的时候会稍慢,操作的时候需要注意。正常情况下修改里面的配置文件都会触发pod重建,所以修改需要慎重。

创建静态pod

apiVersion: v1
kind: Pod
metadata:
  name: nginx-static-pod
spec:
  containers:
  - name: nginx
    image: 192.168.31.43:5000/nginx:latest
    ports:
    - containerPort: 80

只要文件没问题,就可以正常创建这个pod出来。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。