kubernetes Downward API

Downward API存储卷配置信息

除了通过ConfigMap和secret对象向容器注入配置信息之外,应用程序有时候还需要基于所运行的外在系统环境信息设定自身的运行特性。例如nginx进行可根据节点CPU核心数量自动设定要启动的worker进程数,JVM虚拟机可根据节点内存资源自动设定其堆内存大小等。这种功能有点类似于编程中的反射机制,它旨在让对象与自身相关的重要环境信息并据此做出运行决策。

kubernetes的Downward API支持通过环境变量与文件(downwardAPI卷插件)将pod及节点环境相关的部分元数据和状态数据注入容器中,它们的使用方式同ConfigMap和secret类似,用于完成将外部信息传递给pod中容器的应用程序。然后,Downward API并不会将所有可用的元数据统统注入到容器中,而是由用户在配置pod对象自行选择需要助于容器的元数据。可选择注入的信息包括pod对象的IP、主机名、标签、注解、UID、请求的CPU与内存资源量及其限额,甚至是pod所在的节点名称和节点IP等。

但是与ConfigMap和secret这两个标准的API资源类型不同的是,Downward API自身便是一种附属于API Server之上API,在pod资源的定义中可直接进行引用而无须事先进行任何资源定义。

环境变量式元数据注入

类似于ConfigMap或secret资源,容器能够在环境变量valueFrom字段中嵌套filedRef或resourceFiledRef字段来引用其所属pod对象的元数据信息。不过,通常只有常用量类型的属性才能够通过环境变量注入容器中,毕竟进程启动后无法再向其告知变量值的变动,于是环境变量不支持中途的更新操作。在容器规范中,可在环境变量汇总配置valueFrom字段内嵌filedRef字段引用的信息包括如下:

  • metadata.name:pod对象的名称。
  • metadata.namespace:pod对象隶属的名称空间。
  • metadata.uid:pod对象的UID。
  • metadata.lables['<KEY>']:po对象标签中的指定键的值,例如metadata.labels['mylable']。
  • metadata.annotations['<KEY>']:pod对象注解信息中的指定键的值。

容器上的计算资源和资源限制相关的信息,以及临时存储资源需求和资源限制相关的信息可通过容器规范中的resourceFieldRef字段引用,相关字段包括requests.cpu、limits.cpu、requests.memory和limits.memory等。另外,可通过环境变量引用的信息有如下几个。

  • status.podIP:pod对象的IP地址。
  • spec.serviceAccountName:pod对象使用的ServiceAccount资源名称。
  • spec.nodeName:节点名称。
  • status.hostIP:节点IP地址。

另外,还可以通过resourceFieldRef字段引用当前容器的资源请求及资源限额的定义,它们包括requests.cpu、requests.memory、requests.ephemeral-storage、limits.cpu、limits.memory和limits.ephemeral-storage这6项。

示例

apiVersion: v1
kind: Pod
metadata:
  name: downwardapi-env-demo
  labels:
    app: demoapp
spec:
  containers:
    - name: demoapp
      image: nginx:alpine
      resources:
        requests:
          memory: "32Mi"
          cpu: "250m"
        limits:
          memory: "64Mi"
          cpu: "500m"
      env:
        - name: THIS_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: THIS_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: THIS_APP_LABEL
          valueFrom:
            fieldRef:
              fieldPath: metadata.labels['app']
        - name: THIS_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              resource: limits.cpu
        - name: THIS_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              resource: requests.memory
              divisor: 1Mi
  restartPolicy: Never

查看环境变量

~# kubectl exec downwardapi-env-demo -- env |grep "THIS"
THIS_POD_NAME=downwardapi-env-demo
THIS_POD_NAMESPACE=default
THIS_APP_LABEL=demoapp
THIS_CPU_LIMIT=1
THIS_MEM_REQUEST=32

该示例最后一个环境变量的定义中还额外指定一个divisor字段,它用于引用的值指定一个除数,以对引用的数据进行单位换算。CPU资源的divisor字段默认值为1,它表示为1个核心,相除的结果不足1个单位则向上调整,它的另一个可用单位为1m,即标识1个微核心。内存资源的divisor字段默认值也是1,它指1个字节,此时32MiB的内存资源则要换算为33553321输出。其它可用的单位还有1KiB、1MiB、1GiB等,于是将divisor字段的值设置为1MiB时,32MiB的内存资源换算的结果即为32。 

存储卷式元数据注入

downwardAPI存储卷能够以文件方式向容器注入元数据,将配置的字段数据映射为文件并可通过容器中的挂载点访问。事实上通过环境变量方式注入的元数据信息也都可以使用存储卷方式进行信息暴露,但除此之外,我们还能够在downwardAPI存储卷中使用fieldRef引用下面两个数据源。

  • metadata.lables:pod对象的所有标签信息,每行一个,格式为label-key="escaped-label-value"。
  • metadata.annotations:pod对象的所有注解信息,每行一个,格式为annotation-key="escaped-annotation-value"。

示例

查看代码
kind: Pod
apiVersion: v1
metadata:
  name: downwardapi-volume-demo
  labels:
    zone: zone1
    rack: rack100
    app: demoapp
  annotations:
    region: ease-cn
spec:
  containers:
    - name: demoapp
      image: nginx:alpine
      resources:
        requests:
          memory: "32Mi"
          cpu: "250m"
        limits:
          memory: "64Mi"
          cpu: "500m"
      volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
        readOnly: false
  volumes:
  - name: podinfo
    downwardAPI:
      defaultMode: 420
      items:
      - fieldRef:
          fieldPath: metadata.namespace
        path: pod_namespace
      - fieldRef:
          fieldPath: metadata.labels
        path: pod_labels
      - fieldRef:
          fieldPath: metadata.annotations
        path: pod_annotations
      - resourceFieldRef:
          containerName: demoapp
          resource: limits.cpu
          divisor: "1m"
        path: "cpu_limit"
      - resourceFieldRef:
          containerName: demoapp
          resource: requests.memory
          divisor: "1Mi"
        path: "mem_request"

查看映射文件

~# kubectl exec downwardapi-volume-demo -- ls /etc/podinfo -l
total 0
lrwxrwxrwx    1 root     root            16 Jun  9 11:07 cpu_limit -> ..data/cpu_limit
lrwxrwxrwx    1 root     root            18 Jun  9 11:07 mem_request -> ..data/mem_request
lrwxrwxrwx    1 root     root            22 Jun  9 11:07 pod_annotations -> ..data/pod_annotations
lrwxrwxrwx    1 root     root            17 Jun  9 11:07 pod_labels -> ..data/pod_labels
lrwxrwxrwx    1 root     root            20 Jun  9 11:07 pod_namespace -> ..data/pod_namespace

查看映射文件内容

~# kubectl exec downwardapi-volume-demo -- cat /etc/podinfo/cpu_limit
500
~# kubectl exec downwardapi-volume-demo -- cat /etc/podinfo/mem_request
32
~# kubectl exec downwardapi-volume-demo -- cat /etc/podinfo/pod_labels
app="demoapp"
rack="rack100"
zone="zone1"
~# kubectl exec downwardapi-volume-demo -- cat /etc/podinfo/pod_namespace
default
~# kubectl exec downwardapi-volume-demo -- cat /etc/podinfo/pod_annotations
kubectl.kubernetes.io/last-applied-configuration="{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{\"region\":\"ease-cn\"},\"labels\":{\"app\":\"demoapp\",\"rack\":\"rack100\",\"zone\":\"zone1\"},\"name\":\"downwardapi-volume-demo\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:alpine\",\"name\":\"demoapp\",\"resources\":{\"limits\":{\"cpu\":\"500m\",\"memory\":\"64Mi\"},\"requests\":{\"cpu\":\"250m\",\"memory\":\"32Mi\"}},\"volumeMounts\":[{\"mountPath\":\"/etc/podinfo\",\"name\":\"podinfo\",\"readOnly\":false}]}],\"volumes\":[{\"downwardAPI\":{\"defaultMode\":420,\"items\":[{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"},\"path\":\"pod_namespace\"},{\"fieldRef\":{\"fieldPath\":\"metadata.labels\"},\"path\":\"pod_labels\"},{\"fieldRef\":{\"fieldPath\":\"metadata.annotations\"},\"path\":\"pod_annotations\"},{\"path\":\"cpu_limit\",\"resourceFieldRef\":{\"containerName\":\"demoapp\",\"divisor\":\"1m\",\"resource\":\"limits.cpu\"}},{\"path\":\"mem_request\",\"resourceFieldRef\":{\"containerName\":\"demoapp\",\"divisor\":\"1Mi\",\"resource\":\"requests.memory\"}}]},\"name\":\"podinfo\"}]}}\n"
kubernetes.io/config.seen="2022-06-09T19:11:30.901001465+08:00"
kubernetes.io/config.source="api"
region="ease-cn"

 

 

 

 

posted @ 2022-06-09 19:25  小吉猫  阅读(220)  评论(0编辑  收藏  举报