通过文件将 Pod 信息暴露给容器

本页面展示了 Pod 如何使用 downwardAPI 将有关自身的信息暴露给 Pod 中运行的容器。downwardAPI 卷可以暴露 Pod 字段和容器字段。

在 Kubernetes 中,有两种方法可以将 Pod 和容器字段暴露给正在运行的容器

这两种暴露 Pod 和容器字段的方法统称为“向下 API”。

开始之前

您需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一

存储 Pod 字段

在本练习的这一部分,您将创建一个包含一个容器的 Pod,并将 Pod 级字段作为文件投影到正在运行的容器中。以下是该 Pod 的清单文件

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: client-container
      image: registry.k8s.io/busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n'; cat /etc/podinfo/labels; fi;
          if [[ -e /etc/podinfo/annotations ]]; then
            echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
            fieldRef:
              fieldPath: metadata.annotations

在清单文件中,您可以看到该 Pod 具有一个 downwardAPI 卷,并且该容器将该卷安装在 /etc/podinfo 中。

查看 downwardAPI 下的 items 数组。数组的每个元素定义一个 downwardAPI 卷。第一个元素指定 Pod 的 metadata.labels 字段的值应存储在名为 labels 的文件中。第二个元素指定 Pod 的 annotations 字段的值应存储在名为 annotations 的文件中。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume.yaml

验证 Pod 中的容器是否正在运行

kubectl get pods

查看容器的日志

kubectl logs kubernetes-downwardapi-volume-example

输出显示了 labels 文件和 annotations 文件的内容

cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

build="two"
builder="john-doe"

获取一个 shell 到 Pod 中运行的容器

kubectl exec -it kubernetes-downwardapi-volume-example -- sh

在您的 shell 中,查看 labels 文件

/# cat /etc/podinfo/labels

输出显示所有 Pod 的标签都已写入 labels 文件

cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"

类似地,查看 annotations 文件

/# cat /etc/podinfo/annotations

查看 /etc/podinfo 目录中的文件

/# ls -laR /etc/podinfo

在输出中,您可以看到 labelsannotations 文件位于一个临时子目录中:在本例中为 ..2982_06_02_21_47_53.299460680。在 /etc/podinfo 目录中,..data 是指向该临时子目录的符号链接。同样在 /etc/podinfo 目录中,labelsannotations 是符号链接。

drwxr-xr-x  ... Feb 6 21:47 ..2982_06_02_21_47_53.299460680
lrwxrwxrwx  ... Feb 6 21:47 ..data -> ..2982_06_02_21_47_53.299460680
lrwxrwxrwx  ... Feb 6 21:47 annotations -> ..data/annotations
lrwxrwxrwx  ... Feb 6 21:47 labels -> ..data/labels

/etc/..2982_06_02_21_47_53.299460680:
total 8
-rw-r--r--  ... Feb  6 21:47 annotations
-rw-r--r--  ... Feb  6 21:47 labels

使用符号链接可以实现元数据的动态原子刷新;更新会写入到一个新的临时目录,并且 ..data 符号链接会使用 rename(2) 进行原子更新。

退出 shell

/# exit

存储容器字段

在前面的练习中,您使用向下 API 使 Pod 级字段可访问。在接下来的练习中,您将传递 Pod 定义的一部分字段,但这些字段取自特定的 容器,而不是 Pod 本身。以下是一个清单文件,该文件同样只包含一个容器的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example-2
spec:
  containers:
    - name: client-container
      image: registry.k8s.io/busybox:1.24
      command: ["sh", "-c"]
      args:
      - while true; do
          echo -en '\n';
          if [[ -e /etc/podinfo/cpu_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_limit; fi;
          if [[ -e /etc/podinfo/cpu_request ]]; then
            echo -en '\n'; cat /etc/podinfo/cpu_request; fi;
          if [[ -e /etc/podinfo/mem_limit ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
          if [[ -e /etc/podinfo/mem_request ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_request; fi;
          sleep 5;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "cpu_limit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.cpu
              divisor: 1m
          - path: "cpu_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.cpu
              divisor: 1m
          - path: "mem_limit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.memory
              divisor: 1Mi
          - path: "mem_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.memory
              divisor: 1Mi

在清单文件中,您可以看到该 Pod 具有一个 downwardAPI,并且该 Pod 中的单个容器将该卷安装在 /etc/podinfo 中。

查看 downwardAPI 下的 items 数组。数组的每个元素定义向下 API 卷中的一个文件。

第一个元素指定,在名为 client-container 的容器中,以 1m 指定的格式的 limits.cpu 字段的值应作为名为 cpu_limit 的文件发布。divisor 字段是可选的,其默认值为 1。1 的除数表示 cpu 资源的内核,或 memory 资源的字节。

创建 Pod

kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume-resources.yaml

获取一个 shell 到 Pod 中运行的容器

kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh

在您的 shell 中,查看 cpu_limit 文件

# Run this in a shell inside the container
cat /etc/podinfo/cpu_limit

您可以使用类似的命令查看 cpu_requestmem_limitmem_request 文件。

将键投影到特定路径和文件权限

您可以将键投影到特定路径和特定权限(按文件为单位)。有关详细信息,请参阅 Secrets

下一步

  • 阅读 spec 的 Pod API 定义。其中包括 Container 的定义(Pod 的一部分)。
  • 阅读可以使用向下 API 暴露的 可用字段 列表。

阅读有关旧版 API 参考中的卷的信息

  • 查看 Volume API 定义,该定义定义了 Pod 中容器可以访问的通用卷。
  • 查看 DownwardAPIVolumeSource API 定义,该定义定义了包含向下 API 信息的卷。
  • 查看 DownwardAPIVolumeFile API 定义,该定义包含对对象或资源字段的引用,用于填充向下 API 卷中的文件。
  • 查看 ResourceFieldSelector API 定义,该定义指定容器资源及其输出格式。
上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample shortcode 代替 code shortcode (e8b136c3b3)