本文主要是介绍3.12 访问Pod元数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、通过环境变量形式传递元数据
- 二、通过Downward API传递元数据
- 三、Downward API比环境变量优势
在 ConfigMap和 Secret章节中可知,可以通过ConfigMap和Secret向应用中传递Pod创建前可预先知道的数据,但不能传递Pod创建后未知的一些元数据,比如pod的名字,pod的ip,因为这些信息都是pod创建后才会知道,在创建pod时不可以通过ConfigMap和Secret传递数据,可以通过下列方式传递pod的一些元数据信息:环境变量和Downward API。
Pod中可传递的元数据包括如下数据:
- pod的名称
- pod的IP
- pod所在的命名空间
- pod运行节点的名称
- pod运行所归属的服务账户的名称
- 每个容器请求的CPU和内存的使用量
- 每个容器可以使用的CPU和内存的限制
- pod的标签
- pod的注解
一、通过环境变量形式传递元数据
可以通过环境变量方式把pod和容器的一些元数据信息传递到pod中的容器,在下面资源清单中通过环境变量形式向容器中传递元数据。
apiVersion: v1
kind: Pod
metadata:name: pod-env
spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]resources:requests:cpu: 30mmemory: 1Milimits:cpu: 100mmemory: 5Mienv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountName- name: REQUEST_CPUvalueFrom:resourceFieldRef:resource: requests.cpudivisor: 1m- name: REQUEST_MEMORYvalueFrom:resourceFieldRef:resource: requests.memorydivisor: 1Mi- name: CPUT_LIMITvalueFrom:resourceFieldRef:resource: limits.cpudivisor: 1m- name: MEMORY_LIMITvalueFrom:resourceFieldRef:resource: limits.memorydivisor: 1Mi
其中,1m表示1 millicore,即千分之一内核,30m表示千分之30内核;1Mi表示1兆
requests:cpu: 30mmemory: 1Mi
通过上面创建pod后,进入pod中容器可以查看传入的元数据信息,如下所示
[root@k8s-master01 downward]# kubectl exec pod-env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=pod-env
MEMORY_LIMIT=5
POD_IP=10.244.2.189
NODE_NAME=k8s-node02
REQUEST_MEMORY=1
REQUEST_CPU=30
CPUT_LIMIT=100
POD_NAME=pod-env
POD_NAMESPACE=default
SERVICE_ACCOUNT=default
MYSERVICE_PORT_8080_TCP_PORT=8080
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT_443_TCP_PORT=443
MYSERVICE_SERVICE_HOST=10.106.129.199
MYSERVICE_SERVICE_PORT=8080
MYSERVICE_PORT_8080_TCP=tcp://10.106.129.199:8080
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYSERVICE_SERVICE_PORT_HTTP=8080
MYSERVICE_PORT_8080_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
MYSERVICE_PORT=tcp://10.106.129.199:8080
MYSERVICE_PORT_8080_TCP_ADDR=10.106.129.199
HOME=/root
二、通过Downward API传递元数据
上述方式是通过环境变量形式把元数据传递到容器中,也可以通过文件卷的方式把元数据传递到容器中,即本节讲的Down可以ward API方式,把Downward API卷挂载到容器中。Downward API可以给Pod中运行的容器暴露pod的元数据,如下所示
apiVersion: v1
kind: Pod
metadata:name: mydownwardlabels:prod: devannotations:description: this is description for downwarddate: 2020-10-18
spec:containers:- name: busyboximage: busyboximagePullPolicy: IfNotPresentcommand: ["sh", "-c", "sleep 3600"]resources:requests:cpu: 30m memory: 1Mi limits:cpu: 100mmemory: 5Mi volumeMounts:- name: downwardmountPath: /etc/downwardvolumes:- name: downwarddownwardAPI:items:- path: podNamefieldRef:fieldPath: metadata.name- path: podNamespacefieldRef:fieldPath: metadata.namespace- path: labelsfieldRef:fieldPath: metadata.labels- path: annotationsfieldRef:fieldPath: metadata.annotations- path: requst-cpuresourceFieldRef:containerName: busyboxresource: requests.cpudivisor: 1m- path: limits-memoryresourceFieldRef:containerName: busyboxresource: limits.memorydivisor: 1Mi
通过上述资源清单创建pod后,可以进入容器内部查看downward API挂在卷,发现annotations、labels等对象已经挂载到了容器中。
[root@k8s-master01 downward]# kubectl exec mydownward -it -- /bin/sh
/ # cd /etc/
/etc # ls
downward group hostname hosts localtime mtab network passwd resolv.conf shadow
/etc # cd downward
/etc/downward # ls
annotations labels limits-memory podName podNamespace requst-cpu
三、Downward API比环境变量优势
1、环境变量方式不可以暴露labels和annotations两种元数据,而Downward API可以;
2、运行的pod修改标签和注解后,Downward API可以更新挂载卷中内容,获取最新修改的元数据,而环境变量的方式,标签和注解修改后,无法把新修改的值暴露到容器内部,所以环境变量方式不能传递标签和注解两种元数据。
- 参考《kubenetes in action》
这篇关于3.12 访问Pod元数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!