开发者社区> 问答> 正文

如何处理Downward API?

如何处理Downward API?

展开
收起
小天使爱美 2020-03-20 17:49:20 1866 0
2 条回答
写回答
取消 提交回答
  • limits.cpu requests.cpu limits.memory requests.memory limits.ephemeral-storage requests.ephemeral-storage

    2020-03-21 14:32:51
    赞同 展开评论 打赏
  • 标准的k8s有两种方式可以将Pod和Container字段呈现给运行中的容器:

    环境变量。 DownwardAPIVolumeFile。 这两种呈现Pod和Container字段的方式都称为Downward API。

    目前ACK/ASK+ECI已经支持了Downward API的大部分的常用字段。具体的使用文档见下文。

    环境变量 环境变量能通过fieldRef获得如下值: metadata.name : Pod名称 、 metadata.namespace : Pod名字空间 、 metadata.uid : Pod的UID、 metadata.labels[' '] : 单个 pod 标签值 (例如, metadata.labels['mylabel'])、 metadata.annotations[' '] : 单个 pod 的标注值 。

    除此之外,环境变量fieldRef还支持spec以及status字段:

    spec.serviceAccountName

    spec.nodeName

    status.podIP

    Deployment样例如下:

    apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: vk-downward-env labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: annotations: regionId: cn-beijing platform: Aliyun ECI labels: app: nginx env: test spec: containers: - name: nginx image: nginx env: - name: MY_metadata.name valueFrom: fieldRef: fieldPath: metadata.name - name: MY_metadata.namespace valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_metadata.uid valueFrom: fieldRef: fieldPath: metadata.uid - name: MY_metadata.labels valueFrom: fieldRef: fieldPath: metadata.labels['env'] - name: MY_metadata.annotations valueFrom: fieldRef: fieldPath: metadata.annotations['regionId'] - name: MY_status.podIP valueFrom: fieldRef: fieldPath: status.podIP - name: MY_spec.serviceAccountName valueFrom: fieldRef: fieldPath: spec.serviceAccountName - name: MY_spec.nodeName valueFrom: fieldRef: fieldPath: spec.nodeName nodeName: virtual-node-eci-0 登入容器查看环境变量,可以看到fieldRef都生效了:

    root@default-vk-downward-env:/# env MY_spec.nodeName=virtual-kubelet MY_spec.serviceAccountName=default MY_metadata.annotations=cn-beijing MY_metadata.namespace=default MY_metadata.uid=f4881309-f3dd-11e9-bcf9-9efaf54dcfa7 MY_metadata.name=vk-downward-env MY_metadata.labels=test MY_status.podIP=192.168.6.245 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_PORT=6443 PWD=/ PKG_RELEASE=1~buster HOME=/root KUBERNETES_PORT_443_TCP=tcp://172.22.128.1:443 NJS_VERSION=0.3.5 TERM=xterm SHLVL=1 KUBERNETES_PORT_443_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP_ADDR=172.22.128.1 KUBERNETES_SERVICE_HOST=192.168.6.120 KUBERNETES_PORT=tcp://172.22.128.1:443 KUBERNETES_PORT_443_TCP_PORT=443 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.17.4 _=/usr/bin/env DownwardAPIVolumeFile

    DownwardAPIVolumeFile能通过fieldRef获得如下的值: metadata.name - Pod名称 、 metadata.namespace - Pod名字空间 、 metadata.uid - Pod的UID、 metadata.labels[' '] - 单个 pod 标签值 (例如, metadata.labels['mylabel'])、 metadata.annotations[' '] - 单个 pod 的标注值 。该部分和环境变量支持的范围及用法是一致的。

    除此之外,DownwardAPIVolumeFile的fieldRef还支持存储所有的labels以及annotations:

    metadata.annotations: 所有Pod的标签,以label-key="label-value"格式显示,每行显示一个label。

    metadata.labels: Pod的注释,以annotation-key="annotation-value"格式显示,每行显示一个标签。

    Deployment样例如下:

    apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: vk-downward-down-volume labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: annotations: regionId: cn-beijing platform: Aliyun ECI labels: app: nginx env: test spec: containers: - name: nginx image: nginx volumeMounts: - name: podinfo mountPath: /etc/podinfo readOnly: false volumes: - name: podinfo downwardAPI: items: - path: "metadata.name" fieldRef: fieldPath: metadata.name - path: "metadata.namespace" fieldRef: fieldPath: metadata.namespace - path: "metadata.uid" fieldRef: fieldPath: metadata.uid - path: "metadata.labels" fieldRef: fieldPath: metadata.labels - path: "metadata.annotations" fieldRef: fieldPath: metadata.annotations nodeName: virtual-node-eci-0 登入容器查看volume的挂载目录,可以看到volume的fieldRef都生效了,并存储在了容器指定的目录下:

    Welcome to Alibaba Cloud Elastic Container Instance! root@default-vk-downward-down-volume:/# cd /etc/podinfo/ root@default-vk-downward-down-volume:/etc/podinfo# ls metadata.annotations metadata.labels metadata.name metadata.namespace metadata.uid root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.namespace default root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.name vk-downward-down-volume root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.uid fa50b2b2-f3e3-11e9-bcf9-9efaf54dcfa7 root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.annotations platform="Aliyun ECI" regionId="cn-beijing" root@default-vk-downward-down-volume:/etc/podinfo# cat metadata.labels app="nginx" env="test" root@default-vk-downward-down-volume:/etc/podinfo# 目前仅支持pod字段,而容器的字段还不支持,例如:

    limits.cpu requests.cpu limits.memory requests.memory limits.ephemeral-storage requests.ephemeral-storage

    2020-03-20 17:51:24
    赞同 展开评论 打赏
问答分类:
API
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Boot2.0实战Redis分布式缓存 立即下载
CUDA MATH API 立即下载
API PLAYBOOK 立即下载