K8s系列之:在容器内获取Pod信息(Downward API)

每个Pod在成功创建出来以后,都会被系统分配唯一的名字、IP地址,并且处于某个Namespace中。在Pod容器内要获取Pod这些重要信息,可以使用Downward API。

Downward API可以通过以下两种方式将Pod信息注入容器底部:

  • 环境变量。用于单个变量,可以将Pod信息和Container信息注入容器内部。
  • Volume挂载:将数组类信息生成为文件,挂载到容器内部。

一、环境变量方式:将Pod信息注入为环境变量

下例通过Downward API将Pod的IP、名称和所在Namespace注入容器的环境变量中,容器应用使用env命令将全部环境变量打印到标准输出中:

dapi-test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
 - name: test-container
    image: 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
      - name: MY_POD_IP
        valueFrom:
          fieldRef:
            fieldPath: status.podIP
restartPolicy: Never

注意到上面valueFrom这种特殊的语法是Downward API的写法。目前Downward API提供了以下变量。

  • metadata.name:Pod的名称,当Pod通过RC生成时,其名称是RC随机产生的唯一名称。
  • status.podIP:Pod的IP地址,之所以叫作status.podIP而非metadata.IP,是因为IP属于状态数据,而非元数据。
  • metadata.namespace:Pod所在的Namespace。

运行kubectl create命令创建Pod:

kubectl create -f dapi-test-pod.yaml

查看dapi-test-pod的日志:

kubectl logs dapi-test-pod
......
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.1.2
MY_POD_NAME=dapi-test-pod

从日志中可以看到Pod的IP、Name及Namespace等信息都被正确保存到了Pod的环境变量中。

二、环境变量方式:将容器资源信息注入为环境变量

下例通过Downward API将Container的资源请求和限制信息注入容器的环境变量中,容器应用使用printenv命令将设置的资源请求和资源限制环境变量打印到标准输出中:
dapi-test-pod-container-vars.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod-container-vars
spec:
  containers:
 - name: test-container
   image: busybox
   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 3600;
     done;
	resources:
	  requests:
	    memory: "32Mi"
	    cpu: "125m"
	  limits:
	    memory: "64Mi"
	    cpu: "250m"
	env:
	  - name: MY_CPU_REQUEST
	    valueFrom:
	      resourceFieldRef:
	        containerName: test-container
	        resource: request.cpu
	  - name: MY_CPU_LIMIT
	    valueFrom:
	      resourceFieldRef:
	        containerName: test-container
	        resource: limits.cpu
	  - name: MY_MEM_REQUEST
	    valueFrom:
	      resourceFieldRef:
	        containerName: test-container
	        resource: request.memory
	  - name: MY_MEM_LIMIT
	  	valueFrom:
	  	  resourceFieldRef:
	  	    containerName: test-container
	  	    resource: limits.memory
restartPolicy: Never	

注意valueFrom这种特殊的Downward API语法,目前resourceFieldRef可以将容器的资源请求和资源限制等配置设置为容器内部的环境变量。

  • request.cpu:容器的CPU请求值
  • limits.cpu:容器的CPU限制值
  • requests.memory:容器的内存请求值
  • limits.memory:容器的内存限制值
kubectl create -f dapi-test-pod-container-vars.yaml
kubectl get pods

查看dapi-test-pod-container-vars的日志:

kubectl logs dapi-test-pod-container-vars

从日志中可以看到Container的requests.cpu、limits.cpu、requests.memory、limits.memory等信息被正确保存到了Pod的环境变量中。

三、Volume挂载方式

下例通过Downward API将Pod的Label、Annotation列表通过Volume挂载为容器内的一个文件,容器应用使用echo命令将文件内容打印到标准输出中:

dapi-test-pod-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
  annotations:
    build: two
    builder: john-doe
spec:
  containers:
 - name: test-container
   image: busybox
   imagePullPolicy: Never
   command: ["sh","-c"]
   args:
 - whild true; do
      if [[ -e /etc/labels ]]; then
      	echo -en '\n\n'; cat /etc/labels; fi;
      if [[ -e /etc/annotations ]]; then
        echo -en '\n\n'; cat /etc/annotations; fi;
      sleep 3600;
    done;
  volumeMounts:
  	- name: podinfo
  	  mountPath: /etc
  	  readOnly: false
  volumes:
    - name: podinfo
      downwardAPI:
        items:
          - path: "labels"
            fieldRef:
              fieldPath: metadata.labels
          - path: "annotations"
          	fieldRef:
          	  fieldPath: metadata.annotations

注意volumes中downwardAPI的特殊语法,通过items的设置,将会以path的名称生成文件。

  • 将在容器内生成/etc/labels和/etc/annotations两个文件,/etc/labels中将包含metadata.labels的全部Label列表,/etc/annotations中将包含metadata.annotations的全部Label列表。

运行kubectl create命令创建Pod

kubectl create -f dapi-test-pod-volume.yaml

kubectl get pods

查看dapi-test-pod-volume的日志:

kubectl logs dapi-test-pod-volume
zone="us-est-coast"
cluster="test-cluster1"
rack="rack-22"

build="two"
builder="john-doe" 

从日志中看到Pod的Label和Annotation信息都被保存到了容器内的/etc/labels和/etc/annotations文件中。

四、Downward API价值

  • 在某些集群中,集群中的每个节点都需要将自身标识ID及进程绑定的IP地址等信息事先写入配置文件中,进程启动时读取这些信息,然后发不到某个类似服务注册中心的地方,以实现集群节点的自动发现功能。
  • 此时Downward API就可以派上用场了,具体做法是先编写一个预启动脚本或Init Container,通过环境变量或文件方式获取Pod自身的名称、IP地址等信息,然后写入主程序的配置文件中,最后启动主程序。
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最笨的羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值