k8s 静态pod

什么是静态pod

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

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

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

常见的静态pod

  • etcd
  • kube-scheduler
  • kube-apiserver
  • kube-controller-manager

静态pod存放目录

  • kubelet 启动时由 staticPodPath 指定的目录(默认/etc/kubernetes/manifests),kubelet会定期扫描这个目录,并根据这个目录下的 .yaml 或 .json 文件进行创建和更新操作

  • 如果不知道这个目录在哪,可以通过下面方法查找:
    systemctl cat kubelet,会有下面两种结果


    [root@master kubernetes]# systemctl cat kubelet
    # /etc/systemd/system/kubelet.service
    [Unit]
    Description=Kubernetes Kubelet Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=containerd.service
    Wants=containerd.service
    
    [Service]
    EnvironmentFile=-/etc/kubernetes/kubelet.env
    ExecStart=/usr/local/bin/kubelet \
                    $KUBE_LOGTOSTDERR \
                    $KUBE_LOG_LEVEL \
                    $KUBELET_API_SERVER \
                    $KUBELET_ADDRESS \
                    $KUBELET_PORT \
                    $KUBELET_HOSTNAME \
                    $KUBELET_ARGS \
                    $DOCKER_SOCKET \
                    $KUBELET_NETWORK_PLUGIN \
                    $KUBELET_VOLUME_PLUGIN \
                    $KUBELET_CLOUDPROVIDER
    Restart=always
    RestartSec=10s
    
    [Install]
    WantedBy=multi-user.target
    [root@master kubernetes]# 
    
    • EnvironmentFile=-/etc/kubernetes/kubelet.env
    • cat /etc/kubernetes/kubelet.env
      [root@master kubernetes]# cat /etc/kubernetes/kubelet.env
      KUBE_LOG_LEVEL="--v=2"
      KUBELET_ADDRESS="--node-ip=192.168.10.21"
      KUBELET_HOSTNAME="--hostname-override=master"
      
      
      
      KUBELET_ARGS="--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
      --config=/etc/kubernetes/kubelet-config.yaml \  # 这个配置就是查找静态pod目录的文件
      --kubeconfig=/etc/kubernetes/kubelet.conf \
      --container-runtime=remote \
      --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
      --runtime-cgroups=/kube.slice/containerd.service \
        "
      KUBELET_CLOUDPROVIDER=""
      
      PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      [root@master kubernetes]# 
      
    • cat /etc/kubernetes/kubelet-config.yaml

    [root@dev-master ~]# systemctl cat kubelet
    # /usr/lib/systemd/system/kubelet.service
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=https://kubernetes.io/docs/
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    ExecStart=/usr/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
    # /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    # Note: This dropin only works with kubeadm and kubelet v1.11+
    [Service]
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/sysconfig/kubelet
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
    
    • 通过配置可以查看文件 Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    • 然后查看config.yaml cat /var/lib/kubelet/config.yaml

创建静态pod

两种方式:可以通过 文件系统上的配置文件 或者 Web网络上的配置文件 来配置静态Pod。

  • 文件系统上的静态 Pod 声明文件
    1、将配置好自定义的静态pod配置文件,放到kubelet监控的静态目录下
    2、设定kubelet启动参数"--pod-manifest-path"或者在kubelet的配置文件中设定staticPodPath,指定的路径是kubelet监控的路径(如果k8s集群由kubeadm搭建,那默认存储在目录/etc/kubernetes/manifests下),kubelet 会定期的扫描该目录下的 YAML/JSON 文件来创建/修改/删除静态 Pod。

    注意:声明文件是标准的 Pod 定义文件,以 JSON 或者 YAML 格式存储在指定目录。路径设置在 Kubelet 配置文件的 staticPodPath: <目录> 字段,kubelet 会定期的扫描这个文件夹下的 YAML/JSON 文件来创建、更新、删除静态 Pod。 注意 kubelet 扫描目录的时候会忽略以点开头的文件。

    pod 示例:
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: static-pod
      lables:
        app: nginx
    spec:
      containers:
        - name: test-static
          image: nginx:latest
          ports:
            - containerPort: 81
              name: http-server
    
  • Web 网上的静态 Pod 声明文件(不常用)
    Kubelet 根据 --manifest-url=<URL> 参数的配置定期的下载指定文件,并且转换成 JSON/YAML 格式的 Pod 定义文件。 与文件系统上的清单文件使用方式类似,kubelet 调度获取清单文件。 如果静态 Pod 的清单文件有改变,kubelet 会应用这些改变。

    示例:

    • 创建一个 YAML 文件,并保存在 web 服务上,为 kubelet 生成一个 URL。
      apiVersion: v1
      kind: Pod
      metadata:
        name: static-web
        labels:
          role: myrole
      spec:
        containers:
          - name: web
            image: nginx
            ports:
              - name: web
                containerPort: 80
                protocol: TCP
      
    • 通过在选择的节点上使用 --manifest-url=<manifest-url> 配置运行 kubelet,修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf配置文件,增加--manifest-url配置项。
      Environment="KUBELET_SYSTEM_PODS_ARGS=--manifest-url=<manifest-url>"
      
    • 重启节点kubelet服务使配置生效
      systemctl restart kubelet
      
posted @   嘸杺  阅读(133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示