×

向下API是一种机制,允许容器在不耦合到OpenShift Container Platform的情况下使用有关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