创建静态 Pod

    静态 Pod 永远都会绑定到一个指定节点上的 。

    kubelet 会尝试通过 Kubernetes API 服务器为每个静态 Pod 自动创建一个 镜像 Pod。 这意味着节点上运行的静态 Pod 对 API 服务来说是可见的,但是不能通过 API 服务器来控制。

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 .

    本文假定你在使用 Docker 来运行 Pod, 并且你的节点是运行着 Fedora 操作系统。 其它发行版或者 Kubernetes 部署版本上操作方式可能不一样。

    可以通过 或者 web 网络上的配置文件 来配置静态 Pod。

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

    例如:下面是如何以静态 Pod 的方式启动一个简单 web 服务:

    1. 选择一个目录,比如在 /etc/kubelet.d 目录来保存 web 服务 Pod 的定义文件, /etc/kubelet.d/static-web.yaml

      1. # 在 kubelet 运行的节点上执行以下命令
      2. mkdir /etc/kubelet.d/
      3. cat <<EOF >/etc/kubelet.d/static-web.yaml
      4. apiVersion: v1
      5. kind: Pod
      6. metadata:
      7. name: static-web
      8. labels:
      9. role: myrole
      10. spec:
      11. containers:
      12. - name: web
      13. image: nginx
      14. ports:
      15. - name: web
      16. protocol: TCP
      17. EOF
    2. 配置这个节点上的 kubelet,使用这个参数执行 --pod-manifest-path=/etc/kubelet.d/。 在 Fedora 上编辑 /etc/kubernetes/kubelet 以包含下行:

      或者在 Kubelet配置文件 中添加 staticPodPath: <目录>字段。

    3. 重启 kubelet。Fedora 上使用下面的命令:

      1. # 在 kubelet 运行的节点上执行以下命令
      2. systemctl restart kubelet

    Web 网上的静态 Pod 声明文件

    Kubelet 根据 --manifest-url=<URL> 参数的配置定期的下载指定文件,并且转换成 JSON/YAML 格式的 Pod 定义文件。 与使用方式类似,kubelet 调度获取清单文件。 如果静态 Pod 的清单文件有改变,kubelet 会应用这些改变。

    按照下面的方式来:

    1. 创建一个 YAML 文件,并保存在 web 服务上,为 kubelet 生成一个 URL。

      1. apiVersion: v1
      2. kind: Pod
      3. metadata:
      4. name: static-web
      5. labels:
      6. role: myrole
      7. spec:
      8. containers:
      9. - name: web
      10. image: nginx
      11. ports:
      12. - name: web
      13. containerPort: 80
      14. protocol: TCP
    2. 通过在选择的节点上使用 --manifest-url=<manifest-url> 配置运行 kubelet。 在 Fedora 添加下面这行到 /etc/kubernetes/kubelet

      1. KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --manifest-url=<manifest-url>"
    3. 重启 kubelet。在 Fedora 上运行如下命令:

    可以在节点上运行下面的命令来查看正在运行的容器(包括静态 Pod):

    1. docker ps

    输出可能会像这样:

    1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    可以在 API 服务上看到镜像 Pod:

    1. kubectl get pods
    1. NAME READY STATUS RESTARTS AGE
    2. static-web-my-node1 1/1 Running 0 2m

    说明: 要确保 kubelet 在 API 服务上有创建镜像 Pod 的权限。如果没有,创建请求会被 API 服务拒绝。 可以看Pod安全策略

    静态 Pod 上的 被传到镜像 Pod。 你可以通过 选择算符 使用这些标签。

    如果你用 kubectl 从 API 服务上删除镜像 Pod,kubelet 不会 移除静态 Pod:

    1. kubectl delete pod static-web-my-node1

    可以看到 Pod 还在运行:

    1. kubectl get pods
    1. NAME READY STATUS RESTARTS AGE
    2. static-web-my-node1 1/1 Running 0 12s

    回到 kubelet 运行的节点上,可以手工停止 Docker 容器。 可以看到过了一段时间后 kubelet 会发现容器停止了并且会自动重启 Pod:

    1. # 在 kubelet 运行的节点上执行以下命令
    2. # 把 ID 换为你的容器的 ID
    3. docker stop f6d05272b57e
    4. sleep 20
    5. docker ps
    1. CONTAINER ID IMAGE COMMAND CREATED ...
    2. 5b920cbaf8b1 nginx:latest "nginx -g 'daemon of 2 seconds ago ...

    运行中的 kubelet 会定期扫描配置的目录(比如例子中的 /etc/kubelet.d 目录)中的变化, 并且根据文件中出现/消失的 Pod 来添加/删除 Pod。

    1. # 前提是你在用主机文件系统上的静态 Pod 配置文件
    2. # 在 kubelet 运行的节点上执行以下命令
    3. mv /etc/kubelet.d/static-web.yaml /tmp
    4. sleep 20
    5. docker ps
    6. # 可以看到没有 nginx 容器在运行
    7. mv /tmp/static-web.yaml /etc/kubelet.d/
    8. sleep 20