Kubernetes在容器內(nèi)獲取Pod信息
我們知道,每個 Pod 在被成功創(chuàng)建出來之后,都會被系統(tǒng)分配唯一的名字、IP 地址,并且處于某個 Namespace
中,那么我們?nèi)绾卧?Pod 的容器內(nèi)獲取 Pod 的這些重要信息呢?答案就是使用 Downward API。
Downward API 可以通過以下兩種方式將 Pod 信息注入容器內(nèi)部。
(1)環(huán)境變量:用于單個變量,可以將 Pod 信息和 Container 信息注入容器內(nèi)部。
(2)Volume 掛載:將數(shù)組類信息生成為文件并掛載到容器內(nèi)部。
下面通過幾個例子對 Downward API 的用法進(jìn)行說明。
1、環(huán)境變量方式將Pod信息注入為環(huán)境變量
下面的例子通過 Downward API 將 Pod 的 IP、名稱和所在 Namespace 注入容器的環(huán)境變量中,容器應(yīng)用使用
env 命令將全部環(huán)境變量打印到標(biāo)準(zhǔn)輸出中。
配置文件 010-dapi-test-pod.yaml
的內(nèi)容為:
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 的名稱,當(dāng) Pod 通過 RC 生成時,其名稱是 RC 隨機(jī)產(chǎn)生的唯一名稱。 -
status.podIP
:Pod 的 IP 地址,之所以叫作 status.podIP 而非 metadata.IP,是因為 Pod 的 IP 屬于狀態(tài)數(shù)據(jù),而非元數(shù)據(jù)。
-
metadata.namespace
:Pod 所在的 Namespace。
運(yùn)行 kubectl create 命令創(chuàng)建 Pod:
[root@master cha3]# kubectl create -f 010-dapi-test-pod.yaml
pod/dapi-test-pod created
[root@master cha3]# kubectl get pods dapi-test-pod
NAME READY STATUS RESTARTS AGE
dapi-test-pod 0/1 Completed 0 67s
查看 dapi-test-pod 的日志:
[root@master cha3]# kubectl logs dapi-test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=dapi-test-pod
SHLVL=1
HOME=/root
MY_POD_NAMESPACE=default
MY_POD_IP=10.244.140.197
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
MY_POD_NAME=dapi-test-pod
從日志中我們可以看到 Pod 的 IP、Name 及 Namespace 等信息都被正確保存到了 Pod 的環(huán)境變量中。
2、環(huán)境變量方式將容器資源信息注入為環(huán)境變量
下面的例子通過 Downward API 將 Container 的資源請求和限制信息注入容器的環(huán)境變量中,容器應(yīng)用使用
printenv 命令將設(shè)置的資源請求和資源限制環(huán)境變量打印到標(biāo)準(zhǔn)輸出中。
配置文件 011-dapi-test-pod-container-vars.yaml
的內(nèi)容為:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod-container-vars
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 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
- name: MY_CPU_LIMIT
valueFrom:
resourceFieldRef:
containerName: test-container
resource: limits.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
注意 valueFrom 這種特殊的 Downward API 語法,目前 resourceFieldRef 可以將容器的資源請求和資源限制等
配置設(shè)置為容器內(nèi)部的環(huán)境變量。
-
requests.cpu
:容器的 CPU 請求值。 -
limits.cpu
:容器的 CPU 限制值。 -
requests.memory
:容器的內(nèi)存請求值。 -
limits.memory
:容器的內(nèi)存限制值。
運(yùn)行 kubectl create 命令來創(chuàng)建 Pod:
[root@master cha3]# kubectl create -f 011-dapi-test-pod-container-vars.yaml
pod/dapi-test-pod-container-vars created
[root@master cha3]# kubectl get pods dapi-test-pod-container-vars
NAME READY STATUS RESTARTS AGE
dapi-test-pod-container-vars 1/1 Running 0 14s
查看 dapi-test-pod-container-vars
的日志:
[root@master cha3]# kubectl logs dapi-test-pod-container-vars
1
1
33554432
67108864
從日志中我們可以看到Container
的requests.cpu
、limits.cpu
、requests.memory
、limits.memory
等
信息都被正確保存到了 Pod 的環(huán)境變量中。
3、Volume掛載方式
下面的例子通過 Downward API 將 Pod 的 Label、Annotation 列表通過 Volume 掛載為容器中的一個文件,容器
應(yīng)用使用 echo 命令將文件的內(nèi)容打印到標(biāo)準(zhǔn)輸出中。
配置文件 012-dapi-test-pod-volume.yaml
的內(nèi)容為:
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:
- while true; do
if [[ -e /opt/labels ]]; then
echo -en '\n\n'; cat /opt/labels; fi;
if [[ -e /opt/annotations ]]; then
echo -en '\n\n'; cat /opt/annotations; fi;
sleep 3600;
done;
volumeMounts:
- name: podinfo
mountPath: /opt
readOnly: false
volumes:
- name: podinfo
downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
這里要注意 volumes 字段中 downwardAPI 的特殊語法,通過 items 的設(shè)置,系統(tǒng)會根據(jù) path 的名稱生成文
件。根據(jù)上例的設(shè)置,系統(tǒng)將在容器內(nèi)生成 /opt/labels
和 /opt/annotations
兩個文件。在 /opt/labels
文件中將包含 metadata.labels
的全部 Label 列表,在 /opt/annotations
文件中將包含
metadata.annotations
的全部 Label 列表。
運(yùn)行 kubectl create 命令創(chuàng)建 Pod:
[root@master cha3]# kubectl create -f 012-dapi-test-pod-volume.yaml
pod/dapi-test-pod-volume created
[root@master cha3]# kubectl get pods dapi-test-pod-volume
NAME READY STATUS RESTARTS AGE
dapi-test-pod-volume 1/1 Running 0 16s
查看 dapi-test-pod-volume
的日志:
[root@master cha3]# kubectl logs dapi-test-pod-volume
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"
build="two"
builder="john-doe"
kubernetes.io/config.seen="2023-07-02T17:02:42.357753840+08:00"
從日志中我們看到 Pod 的 Label 和 Annotation 信息都被保存到了容器內(nèi)的 /opt/labels
和/opt/annotations
文件中。
[root@master cha3]# kubectl exec -it dapi-test-pod-volume -- ls /opt
annotations labels
[root@master cha3]# kubectl exec -it dapi-test-pod-volume -- cat /opt/annotations
build="two"
builder="john-doe"
kubernetes.io/config.seen="2023-07-02T17:02:42.357753840+08:00"
kubernetes.io/config.source="api"
[root@master cha3]# kubectl exec -it dapi-test-pod-volume -- cat /opt/labels
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"
那么,Downward API有什么價值呢?
在某些集群中,集群中的每個節(jié)點(diǎn)都需要將自身的標(biāo)識(ID)及進(jìn)程綁定的 IP 地址等信息事先寫入配置文件中,進(jìn)程
在啟動時會讀取這些信息,然后將這些信息發(fā)布到某個類似服務(wù)注冊中心的地方,以實現(xiàn)集群節(jié)點(diǎn)的自動發(fā)現(xiàn)功
能。此時 Downward API 就可以派上用場了,具體做法是先編寫一個預(yù)啟動腳本或 Init Container,通過環(huán)境變量文章來源:http://www.zghlxwxcb.cn/news/detail-688450.html
或文件方式獲取 Pod 自身的名稱、IP地址等信息,然后將這些信息寫入主程序的配置文件中,最后啟動主程序。文章來源地址http://www.zghlxwxcb.cn/news/detail-688450.html
到了這里,關(guān)于Kubernetes在容器內(nèi)獲取Pod信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!