前言
在上一篇文章中,我們學(xué)習(xí)了針對容器設(shè)置啟動時要執(zhí)行的命令和參數(shù)、定義相互依賴的環(huán)境變量、為容器設(shè)置環(huán)境變量,三種設(shè)置方式,本篇文章,我們將繼續(xù)學(xué)習(xí)數(shù)據(jù)的傳遞。
有兩種方式可以將 Pod 和 Container 字段傳遞給運行中的容器:
- 環(huán)境變量
- 卷文件
這兩種呈現(xiàn) Pod 和 Container 字段的方式統(tǒng)稱為 Downward API。
一、通過環(huán)境變量將 Pod 信息傳遞給容器
在文章開始之前,我們先在目錄 pods/inject/dapi-envars-pod.yaml
中創(chuàng)建一個包含一個容器的 Pod。這是該 Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: dapi-envars-fieldref
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
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;
sleep 10;
done;
env:
- name: MY_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- 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
- name: MY_POD_SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
restartPolicy: Never
這個配置文件中,你可以看到五個環(huán)境變量。env 字段是一個 EnvVars.
對象的數(shù)組。 數(shù)組中第一個元素指定 MY_NODE_NAME 這個環(huán)境變量從 Pod 的 spec.nodeName
字段獲取變量值。 同樣,其它環(huán)境變量也是從 Pod 的字段獲取它們的變量值。
- 創(chuàng)建Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-pod.yaml
- 驗證 Pod 中的容器運行正常:
$ kubectl get pods
- 查看容器日志:
$ kubectl logs dapi-envars-fieldref
- 輸出信息顯示了所選擇的環(huán)境變量的值:
minikube
dapi-envars-fieldref
default
172.17.0.4
default
要了解為什么這些值在日志中,請查看配置文件中的command 和 args字段。 當(dāng)容器啟動時,它將五個環(huán)境變量的值寫入 stdout。每十秒重復(fù)執(zhí)行一次。
接下來,通過打開一個 Shell 進(jìn)入 Pod 中運行的容器:
$ kubectl exec -it dapi-envars-fieldref -- sh
在 Shell 中,查看環(huán)境變量:
/# printenv
輸出信息顯示環(huán)境變量已經(jīng)設(shè)置為 Pod 字段的值。
MY_POD_SERVICE_ACCOUNT=default
…
MY_POD_NAMESPACE=default
MY_POD_IP=172.17.0.4
…
MY_NODE_NAME=minikube
…
MY_POD_NAME=dapi-envars-fieldref
1.1、用 Container 字段作為環(huán)境變量的值
上面我們將 Pod 字段作為環(huán)境變量的值。 現(xiàn)在我們將用 Container 字段作為環(huán)境變量的值。在目錄 pods/inject/dapi-envars-container.yaml
中創(chuàng)建一個包含容器的 Pod 的配置文件:
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox:1.24
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;
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
這個配置文件中,你可以看到四個環(huán)境變量。env 字段是一個 EnvVars.
對象的數(shù)組。數(shù)組中第一個元素指定 MY_CPU_REQUEST 這個環(huán)境變量從 Container 的 requests.cpu
字段獲取變量值。同樣,其它環(huán)境變量也是從 Container 的字段獲取它們的變量值。
- 創(chuàng)建Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dapi-envars-container.yaml
- 驗證 Pod 中的容器運行正常:
$ kubectl get pods
- 查看容器日志:
$ kubectl logs dapi-envars-resourcefieldref
- 輸出信息顯示了所選擇的環(huán)境變量的值:
1
1
33554432
67108864
二、通過文件將 Pod 信息呈現(xiàn)給容器
前面我們學(xué)習(xí)了使用環(huán)境變量的方式,現(xiàn)在我們學(xué)習(xí)通過文件的方式。
在目錄 pods/inject/dapi-volume.yaml
中創(chuàng)建一個包含一個容器的 Pod,并將 Pod 級別的字段作為文件映射到正在運行的容器中。 Pod 的清單如下:
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: k8s.gcr.io/busybox
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
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
在 Pod 清單中,你可以看到 Pod 有一個 downwardAPI 類型的卷,并且掛載到容器中的 /etc/podinfo 目錄。
查看 downwardAPI 下面的 items 數(shù)組。 數(shù)組的每個元素定義一個 downwardAPI 卷。 第一個元素指示 Pod 的 metadata.labels 字段的值保存在名為 labels 的文件中。 第二個元素指示 Pod 的 annotations 字段的值保存在名為 annotations 的文件中。
- 創(chuàng)建 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume.yaml
- 驗證Pod中的容器運行正常:
$ kubectl get pods
- 查看容器的日志:
$ kubectl logs kubernetes-downwardapi-volume-example
- 輸出顯示 labels 和 annotations 文件的內(nèi)容:
cluster=“test-cluster1”
rack=“rack-22”
zone=“us-est-coast”build=“two”
builder=“john-doe”
- 進(jìn)入 Pod 中運行的容器,打開一個 Shell:
$ kubectl exec -it kubernetes-downwardapi-volume-example -- sh
- 在該 Shell中,查看 labels 文件:
/# cat /etc/podinfo/labels
- 輸出顯示 Pod 的所有標(biāo)簽都已寫入 labels 文件。
cluster=“test-cluster1”
rack=“rack-22”
zone=“us-est-coast”
- 同樣,查看 annotations 文件:
/# cat /etc/podinfo/annotations
- 查看 /etc/podinfo 目錄下的文件:
/# ls -laR /etc/podinfo
在輸出中可以看到,labels 和 annotations 文件都在一個臨時子目錄中。 在這個例子,…2982_06_02_21_47_53.299460680。 在 /etc/podinfo 目錄中,…data 是一個指向臨時子目錄 的符號鏈接。/etc/podinfo 目錄中,labels 和 annotations 也是符號鏈接。
drwxr-xr-x … Feb 6 21:47 …2982_06_02_21_47_53.299460680
lrwxrwxrwx … Feb 6 21:47 …data -> …2982_06_02_21_47_53.299460680
lrwxrwxrwx … Feb 6 21:47 annotations -> …data/annotations
lrwxrwxrwx … Feb 6 21:47 labels -> …data/labels
/etc/…2982_06_02_21_47_53.299460680:
total 8
-rw-r–r-- … Feb 6 21:47 annotations
-rw-r–r-- … Feb 6 21:47 labels
用符號鏈接可實現(xiàn)元數(shù)據(jù)的動態(tài)原子性刷新;更新將寫入一個新的臨時目錄, 然后通過使用 rename(2) 完成 …data 符號鏈接的原子性更新。
- 退出 Shell:
/# exit
2.1、存儲容器字段
使用 downward API 使 Pod 級別的字段可以被 Pod 內(nèi)正在運行的容器訪問。 接下來我們將只傳遞由 Pod 定義的部分的字段到 Pod 內(nèi)正在運行的容器中,但這些字段取自特定容器而不是整個 Pod。 下面是目錄 pods/inject/dapi-volume-resources.yaml
中一個同樣只有一個容器的 Pod 的清單:
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-downwardapi-volume-example-2
spec:
containers:
- name: client-container
image: k8s.gcr.io/busybox:1.24
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_limit"
resourceFieldRef:
containerName: client-container
resource: limits.cpu
divisor: 1m
- path: "cpu_request"
resourceFieldRef:
containerName: client-container
resource: requests.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
在這個清單中,你可以看到 Pod 有一個 downwardAPI 卷, 并且這個會掛載到 Pod 內(nèi)的單個容器的 /etc/podinfo 目錄。
查看 downwardAPI 下面的 items 數(shù)組。 數(shù)組的每個元素定義一個 downwardAPI 卷。
第一個元素指定在名為 client-container 的容器中, 以 1m 所指定格式的 limits.cpu 字段的值應(yīng)推送到名為 cpu_limit 的文件中。 divisor 字段是可選的,默認(rèn)值為 1,1 的除數(shù)表示 CPU 資源的核心或內(nèi)存資源的字節(jié)。
- 創(chuàng)建Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dapi-volume-resources.yaml
- 打開一個 Shell,進(jìn)入 Pod 中運行的容器:
$ kubectl exec -it kubernetes-downwardapi-volume-example-2 -- sh
- 在 Shell 中,查看 cpu_limit 文件:
# 在容器內(nèi)的 Shell 中運行
$ cat /etc/podinfo/cpu_limit
你可以使用同樣的命令查看 cpu_request、mem_limit 和 mem_request
文件.文章來源:http://www.zghlxwxcb.cn/news/detail-823197.html
總結(jié)
本篇文章,主要是為了總結(jié)學(xué)習(xí)上一篇的內(nèi)容,在此文章中,我們學(xué)會了如何使用環(huán)境變量的方式、通過文件的方式,來為容器傳遞數(shù)據(jù),那么下一篇,我們將一起學(xué)習(xí)如何使用 Secret 來安全的分發(fā)數(shù)據(jù)內(nèi)容,期待我們的下次再見。文章來源地址http://www.zghlxwxcb.cn/news/detail-823197.html
到了這里,關(guān)于【云原生 | Kubernetes 系列】K8s 實戰(zhàn) 如何給應(yīng)用注入數(shù)據(jù) II 將pod數(shù)據(jù)傳遞給容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!