前言:
从容器内获取容器的IP/端口/namespace等信息,以及k8s对容器的内存/CPU等资源限制的值。
1. 获取pod信息
说明:容器中获取pod的所有信息,先看一个简单示例,然后我们说明怎么获取其他信息。
1.1 一个简单示例
说明:定义一些变量,以获取POD状态信息(如节点名/容器名/namespace等)
apiVersion: v1
kind: Pod
metadata:name: busybox-infornamespace: test
spec:containers:- name: busybox-inforimage: harbocto.boe.com.cn/public/nginxenv:- name: MY_NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: MY_POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: MY_POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: MY_POD_SERVICE_ACCOUNTvalueFrom:fieldRef:fieldPath: spec.serviceAccountNameports:- containerPort: 80
- 结果测试
用上边的yml文件启动容器(略)之后,进入容器,并打印yml文件中定义的变量,可以看见容器的信息被以变量形式传入容器。
[root@DoM01 test]
root@busybox-infor:/
don03
root@busybox-infor:/
busybox-infor
root@busybox-infor:/
test
root@busybox-infor:/
10.244.5.20
root@busybox-infor:/
default
1.2 可以获取那些信息
上边通过k8s提供的这些接口看到的信息,实际上我们用edit 查看pod信息时都可以看到。
从示例中我们可以看到变量的valueFrom都是诸如: metadata.namespace, spec.nodeName, metadata.name …… 很容易猜到,这和我们使用edit pod 看到的信息应该是一致的。所以我们可以用变量取到这里的所有信息。
- 我们验证一下,执行如下命令:
[root@DoM01 test]
可以查找到刚才的信息,如我们可以看到 namespace的key如下:
而我们刚才定义变量获取值的位置是:
metadata.namespace
这是一致的。如此我们可以定义你查到的pod的任意信息了。
2. 获取容器资源限制
说明:此处获取的是k8s对容器的资源限制,区别前边的容器信息。当然我们通过edit也是可以看到的。
- 创建podinfo.yml文件如下:
apiVersion: v1
kind: Pod
metadata:name: busybox-infornamespace: test
spec:containers:- name: busybox-inforimage: harbocto.boe.com.cn/public/nginxenv:- name: MY_CPU_REQUESTvalueFrom:resourceFieldRef:resource: requests.cpu- name: MY_CPU_LIMITvalueFrom:resourceFieldRef:resource: limits.cpu- name: MY_MEM_REQUESTvalueFrom:resourceFieldRef:resource: requests.memory- name: MY_MEM_LIMITvalueFrom:resourceFieldRef:resource: limits.memoryresources:requests:cpu: "250m"memory: "64Mi"limits:cpu: "4000m"memory: "8Gi"
[root@DoM01 test]
pod/pod-infor created
[root@DoM01 test]
NAME READY STATUS RESTARTS AGE
pod-infor 1/1 Running 0 5s
- 验证
进入容器,打印刚才的变量如下:
[root@DoM01 test]
root@busybox-infor:/
8589934592
root@busybox-infor:/
67108864
如上,变量值和我们刚才设置的一样。如果没有设置,变量值为0