K8S---Downward API

本文介绍Kubernetes DownwardAPI的功能与使用方法,包括如何将Pod和容器的元数据及资源限制信息注入容器内的环境变量或挂载为Volume文件。

Downward API

容器内部获取pod级别的信息,包括Pod级别的Pod名称、Pod IP、Node IP、Label、Annotation、容器级别的资源限制等

Downward API 在容器内获取Pod信息

Downward API将Pod和容器的元数据信息注入容器内部的两种方式

  • 环境变量:将Pod或Container信息设置为容器内的环境变量
  • Volume挂载:将Pod或Container信息以文件的形式挂载到容器内部
环境变量方式

将Pod信息设置为容器内的环境变量

通过Downward API将Pod的IP、名称和所在命名空间注入容器的环境变量中

# dapi-envars-pod.yaml
# 环境变量不直接设置value,而是设置valueFrom对Pod的元数据进行引用

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-fieldref
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: IfNotPresent
      command: ["sh","-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE;
          printenv MY_POD_IP MY_POD_ SERVICE_ACCOUNT;
          leep 10;
        done;
      env:
      - name: MY_NODE_NAME
        valueFrom:
          fieldRef:
            fieldPath: spec.nodeName           # Pod所在Node的名称
      - name: MY_POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name           # Pod名称
      - name: MY_POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace       # Pod所在命名空间的名称
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP             # Pod的IP地址
      - name: MY_POD_SERVICE_ACCOUNT
        valueFrom:
          fieldRef:
            fieldPath: spec.serviceAccountName  #Pod使用的ServiceAccount名称
  restartPolicy: Never

# 创建
# kubectl create -f dapi-envars-pod.yaml
# 查看pod日志,核查容器启动命令的输出
# kubectl logs dapi-envars-fieldref
# 查看容器的内的环境变量设置
# kubectl exec -it dapi-envars-fieldref -- printenv |grep MY

将Container信息设置为容器内的环境变量

将Container的资源请求和资源限制信息设置为容器内的环境变量

# dapi-envars-container.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-envars-resourcefieldref
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: Never
      command: ["sh","-c"]
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_ LIMIT;
          sleep 10;
        done;
      args:
      - while true; do
          echo -en '\n';
          printenv MY_CPU_REQUEST MY_CPU_LIMIT;
          printenv MY_MEM_REQUEST MY_MEM_LIMIT;
          sleep 3600;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      env:
        - name: MY_CPU_REQUEST
          valueFrom :
            resourceFieldRef:
              containerName: test-container
              resource: requests.cpu           # 容器的CPU请求值。
        - name: MY_CPU_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.cpu             # 容器的CPU限制值
        - name: MY_MEM_REQUEST
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: requests.memory       # 容器的内存请求值
        - name: MY_MEM_LIMIT
          valueFrom:
            resourceFieldRef:
              containerName: test-container
              resource: limits.memory          # 容器的内存限制值
  restartPolicy: Never

# 创建
# kubectl create -f dapi-envars-container.yaml
# 查看日志
# kubectl logs  dapi-envars-resourcefieldref
Volume挂载方式

将Pod信息挂载为容器内的文件

将Pod的Label、Annotation信息通 过Volume挂载为容器中的文件

# dapi-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
    - name: client-container
      image: busybox
      imagePullPolicy: IfNotPresent
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/ labels ]];then
            echo -en ' \n\n '; cat /etc/podinfo/labels; fi;
          if [[ -e /etc/podinfo/annotations ]];then
            echo -en '\n\n'; cat /etc/podinfo/annotations; fi;
          sleep 5;
        done;
      volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
  volumes:
  - name: podinfo
    downwardAPI:
      items:
        - path: "labels"
          fieldRef:
            fieldPath: metadata.labels        # Pod的Label列表
        - path: "annotations"
          fieldRef:
            fieldPath: metadata.annotations   # Pod的Annotation列表

# 创建 
# kubectl create -f dapi-volume.yaml
# 查看日志
# kubectl logs kubernetes-downwardapi-volume-example
# 进入容器查看挂载文件
# kubectl exec -it kubernetes-downwardapi-volume-example -- ls /etc/podinfo
# 查看文件内容
# kubectl exec -it kubernetes-downwardapi-volume-example -- cat /etc/podinfo/labels
# kubectl exec -it kubernetes-downwardapi-volume-example -- cat /etc/podinfo/annotations

将Container信息挂载为容器内的文件

将Container的资源限制信息通过Volume挂载为容器中的文件

# dpi-volume-resources.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-downwardapi-volume-example-2
spec:
  containers:
    - name: client-container
      image: busybox
      imagePullPolicy: IfNotPresent
      command: ["sh", "-c"]
      args:
      - while true; do
          echo -en 'n';
          if [[ -e /etc/podinfo/cpu_limit ]]; then
            echo -en ' \n '; cat /etc/podinfo/cpu_limit; fi;
          if [[ -e /etc/podinfo/cpu_request ]];then
            echo -en '\n '; cat /etc/podinfo/cpu_request; fi;
          if [[ -e /etc/podinfo/mem_limit ]];then
            echo -en '\n'; cat /etc/podinfo/mem_limit; fi;
          if [[ -e /etc/podinfo/mem_request ]]; then
            echo -en '\n'; cat /etc/podinfo/mem_request; fi;
          sleep 5;
        done;
      resources:
        requests:
          memory: "32Mi"
          cpu: "125m"
        limits:
          memory: "64Mi"
          cpu: "250m"
      volumeMounts:
      - name: podinfo
        mountPath: /etc/podinfo
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "cpu_1imit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.cpu             # 容器的CPU限制值。
              divisor: 1m
          - path: "cpu_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.cpu           # 容器的CPU请求值
              divisor: 1m
          - path: "mem_limit"
            resourceFieldRef:
              containerName: client-container
              resource: limits.memory          # 容器的内存限制值。
              divisor: 1Mi
          - path: "mem_request"
            resourceFieldRef:
              containerName: client-container
              resource: requests.memory        # 容器的内存请求值。
              divisor: 1Mi

# 创建
# kubectl create -f dpi-volume-resources.yaml
# 查看日志
# kubectl logs kubernetes-downwardapi-volume-example-2
# 查看容器内挂载的文件
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- ls /etc/podinfo
# 查看文件内容
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/cpu_1imit
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/cpu_request
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/mem_limit
# kubectl exec -it kubernetes-downwardapi-volume-example-2 -- cat /etc/podinfo/mem_request
Downward API支持设置的Pod和Container信息

Downward API支持设置的Pod和Container信息

可以通过fieldRef设置的元数据

  • metadata.name:Pod名称。
  • metadata.namespace:Pod所在的命名空间名称。
  • metadata.uid:Pod的UID,
  • metadata.labels[‘’]:Pod某个Label的值,通过进行引用
  • metadata.annotations[‘’]:Pod某个Annotation的值,通过进行引用,

可以通过resourceFieldRef设置的数据

  • Container级别的CPU Limit。
  • Container级别的CPU Request。
  • Container级别的Memory Limit。
  • Container级别的Memory Request。
  • Container级别的临时存储空间(ephemeral-storage)Limit
  • Container级别的临时存储空间(ephemeral-storage)Request,

对以下信息通过fieldRef字段进行设置

  • metadata.labels:Pod的Label列表,每个Label都以key为文件名,value为文件内容,每个Label各占一行。
  • metadata.namannotations : Pod 的 Annotation 列 表 , 每 个Annotation都以key为文件名,value为文件内容,每个Annotation各占一行

以下Pod的元数据信息可以被设置为容器内的环境变量

  • status.podIP:Pod的IP地址
  • spec.serviceAccountName:Pod使用的ServiceAccount名称。
  • spec.nodeName:Pod所在Node的名称,
  • status.hostIP:Pod所在Node的IP地址
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值