×

向下 API是一种机制,允许容器在不与 Red Hat OpenShift Service on AWS 耦合的情况下使用有关 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