×

向下 API 是一种机制,允许容器在不与 OpenShift Dedicated 耦合的情况下使用有关 API 对象的信息。此类信息包括 Pod 的名称、命名空间和资源值。容器可以使用环境变量或卷插件使用向下 API 中的信息。

使用向下 API 将 Pod 信息公开给容器

向下 API 包含 Pod 的名称、项目和资源值等信息。容器可以使用环境变量或卷插件使用向下 API 中的信息。

Pod 中的字段使用FieldRef API 类型进行选择。FieldRef 具有两个字段

字段 描述

fieldPath

要选择的字段路径,相对于 Pod。

apiVersion

用于在其中解释fieldPath 选择器的 API 版本。

当前,v1 API 中有效的选择器包括

选择器 描述

metadata.name

Pod 的名称。这在环境变量和卷中都受支持。

metadata.namespace

Pod 的命名空间。这在环境变量和卷中都受支持。

metadata.labels

Pod 的标签。这仅在卷中受支持,而不支持在环境变量中。

metadata.annotations

Pod 的注释。这仅在卷中受支持,而不支持在环境变量中。

status.podIP

Pod 的 IP。这仅在环境变量中受支持,而不支持在卷中。

如果未指定apiVersion 字段,则默认为封闭 Pod 模板的 API 版本。

了解如何使用向下 API 使用容器值

您的容器可以使用环境变量或卷插件来使用API值。根据您选择的方法,容器可以使用

  • Pod名称

  • Pod项目/命名空间

  • Pod注释

  • Pod标签

只有使用卷插件才能使用注释和标签。

使用环境变量使用容器值

当使用容器的环境变量时,请使用EnvVar类型的valueFrom字段(EnvVarSource类型),以指定变量的值应来自FieldRef源,而不是由value字段指定的字面值。

只能以这种方式使用Pod的常量属性,因为一旦在进程中启动了一个进程,环境变量就无法更新,从而允许进程被通知变量的值已更改。使用环境变量支持的字段是:

  • Pod名称

  • Pod项目/命名空间

步骤
  1. 创建一个包含您希望容器使用的环境变量的新Pod规范

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              - name: MY_POD_NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        restartPolicy: Never
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml
验证
  • 检查容器日志中MY_POD_NAMEMY_POD_NAMESPACE的值

    $ oc logs -p dapi-env-test-pod

使用卷插件使用容器值

您的容器可以使用卷插件来使用API值。

容器可以使用:

  • Pod名称

  • Pod项目/命名空间

  • Pod注释

  • Pod标签

步骤

要使用卷插件:

  1. 创建一个包含您希望容器使用的环境变量的新Pod规范

    1. 创建一个类似于以下内容的volume-pod.yaml文件

      kind: Pod
      apiVersion: v1
      metadata:
        labels:
          zone: us-east-coast
          cluster: downward-api-test-cluster1
          rack: rack-123
        name: dapi-volume-test-pod
        annotations:
          annotation1: "345"
          annotation2: "456"
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: volume-test-container
            image: gcr.io/google_containers/busybox
            command: ["sh", "-c", "cat /tmp/etc/pod_labels /tmp/etc/pod_annotations"]
            volumeMounts:
              - name: podinfo
                mountPath: /tmp/etc
                readOnly: false
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        volumes:
        - name: podinfo
          downwardAPI:
            defaultMode: 420
            items:
            - fieldRef:
                fieldPath: metadata.name
              path: pod_name
            - fieldRef:
                fieldPath: metadata.namespace
              path: pod_namespace
            - fieldRef:
                fieldPath: metadata.labels
              path: pod_labels
            - fieldRef:
                fieldPath: metadata.annotations
              path: pod_annotations
        restartPolicy: Never
      # ...
    2. volume-pod.yaml文件创建Pod

      $ oc create -f volume-pod.yaml
验证
  • 检查容器日志并验证已配置字段的存在

    $ oc logs -p dapi-volume-test-pod
    示例输出
    cluster=downward-api-test-cluster1
    rack=rack-123
    zone=us-east-coast
    annotation1=345
    annotation2=456
    kubernetes.io/config.source=api

了解如何使用向下 API 使用容器资源

创建Pod时,可以使用向下API注入有关计算资源请求和限制的信息,以便镜像和应用程序作者可以为特定环境正确创建镜像。

您可以使用环境变量或卷插件来执行此操作。

使用环境变量使用容器资源

创建Pod时,可以使用向下API使用环境变量注入有关计算资源请求和限制的信息。

创建Pod配置时,请指定与spec.container字段中resources字段内容相对应的环境变量。

如果容器配置中不包含资源限制,则向下API默认为节点的可分配CPU和内存值。

步骤
  1. 创建一个包含您要注入的资源的新Pod规范

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: test-container
            image: gcr.io/google_containers/busybox:1.24
            command: [ "/bin/sh", "-c", "env" ]
            resources:
              requests:
                memory: "32Mi"
                cpu: "125m"
              limits:
                memory: "64Mi"
                cpu: "250m"
            env:
              - name: MY_CPU_REQUEST
                valueFrom:
                  resourceFieldRef:
                    resource: requests.cpu
              - name: MY_CPU_LIMIT
                valueFrom:
                  resourceFieldRef:
                    resource: limits.cpu
              - name: MY_MEM_REQUEST
                valueFrom:
                  resourceFieldRef:
                    resource: requests.memory
              - name: MY_MEM_LIMIT
                valueFrom:
                  resourceFieldRef:
                    resource: limits.memory
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml

使用卷插件使用容器资源

创建Pod时,可以使用向下API使用卷插件注入有关计算资源请求和限制的信息。

创建Pod配置时,请使用spec.volumes.downwardAPI.items字段描述与spec.resources字段相对应的所需资源。

如果容器配置中不包含资源限制,则向下API默认为节点的可分配CPU和内存值。

步骤
  1. 创建一个包含您要注入的资源的新Pod规范

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        containers:
          - name: client-container
            image: gcr.io/google_containers/busybox:1.24
            command: ["sh", "-c", "while true; do echo; if [[ -e /etc/cpu_limit ]]; then cat /etc/cpu_limit; fi; if [[ -e /etc/cpu_request ]]; then cat /etc/cpu_request; fi; if [[ -e /etc/mem_limit ]]; then cat /etc/mem_limit; fi; if [[ -e /etc/mem_request ]]; then cat /etc/mem_request; fi; sleep 5; done"]
            resources:
              requests:
                memory: "32Mi"
                cpu: "125m"
              limits:
                memory: "64Mi"
                cpu: "250m"
            volumeMounts:
              - name: podinfo
                mountPath: /etc
                readOnly: false
        volumes:
          - name: podinfo
            downwardAPI:
              items:
                - path: "cpu_limit"
                  resourceFieldRef:
                    containerName: client-container
                    resource: limits.cpu
                - path: "cpu_request"
                  resourceFieldRef:
                    containerName: client-container
                    resource: requests.cpu
                - path: "mem_limit"
                  resourceFieldRef:
                    containerName: client-container
                    resource: limits.memory
                - path: "mem_request"
                  resourceFieldRef:
                    containerName: client-container
                    resource: requests.memory
      # ...
    2. volume-pod.yaml文件创建Pod

      $ oc create -f volume-pod.yaml

使用向下 API 使用密钥

创建Pod时,可以使用向下API注入密钥,以便镜像和应用程序作者可以为特定环境创建镜像。

步骤
  1. 创建一个要注入的密钥

    1. 创建一个类似于以下内容的secret.yaml文件

      apiVersion: v1
      kind: Secret
      metadata:
        name: mysecret
      data:
        password: <password>
        username: <username>
      type: kubernetes.io/basic-auth
    2. secret.yaml文件创建密钥对象

      $ oc create -f secret.yaml
  2. 创建一个引用上述Secret对象中username字段的Pod

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_SECRET_USERNAME
                valueFrom:
                  secretKeyRef:
                    name: mysecret
                    key: username
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        restartPolicy: Never
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml
验证
  • 检查容器日志中MY_SECRET_USERNAME的值

    $ oc logs -p dapi-env-test-pod

使用向下 API 使用配置映射

创建Pod时,可以使用向下API注入配置映射值,以便镜像和应用程序作者可以为特定环境创建镜像。

步骤
  1. 创建一个包含要注入值的配置映射

    1. 创建一个类似于以下内容的configmap.yaml文件

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: myconfigmap
      data:
        mykey: myvalue
    2. configmap.yaml文件创建配置映射

      $ oc create -f configmap.yaml
  2. 创建一个引用上述配置映射的Pod

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_CONFIGMAP_VALUE
                valueFrom:
                  configMapKeyRef:
                    name: myconfigmap
                    key: mykey
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        restartPolicy: Always
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml
验证
  • 检查容器日志中MY_CONFIGMAP_VALUE的值

    $ oc logs -p dapi-env-test-pod

引用环境变量

创建Pod时,可以使用$()语法引用先前定义的环境变量的值。如果无法解析环境变量引用,则该值将保留为提供的字符串。

步骤
  1. 创建一个引用现有环境变量的Pod

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_EXISTING_ENV
                value: my_value
              - name: MY_ENV_VAR_REF_ENV
                value: $(MY_EXISTING_ENV)
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        restartPolicy: Never
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml
验证
  • 检查容器日志中MY_ENV_VAR_REF_ENV的值

    $ oc logs -p dapi-env-test-pod

转义环境变量引用

创建Pod时,可以使用双美元符号转义环境变量引用。然后,该值将设置为提供的值的单美元符号版本。

步骤
  1. 创建一个引用现有环境变量的Pod

    1. 创建一个类似于以下内容的pod.yaml文件

      apiVersion: v1
      kind: Pod
      metadata:
        name: dapi-env-test-pod
      spec:
        securityContext:
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault
        containers:
          - name: env-test-container
            image: gcr.io/google_containers/busybox
            command: [ "/bin/sh", "-c", "env" ]
            env:
              - name: MY_NEW_ENV
                value: $$(SOME_OTHER_ENV)
            securityContext:
              allowPrivilegeEscalation: false
              capabilities:
                drop: [ALL]
        restartPolicy: Never
      # ...
    2. pod.yaml文件创建Pod

      $ oc create -f pod.yaml
验证
  • 检查容器日志中MY_NEW_ENV的值

    $ oc logs -p dapi-env-test-pod