前言
前面我們已經(jīng)一起學(xué)習(xí)了很多的東西了,本篇文章,我們將一起學(xué)習(xí),如何給應(yīng)用注入數(shù)據(jù),當(dāng)然,本篇文章不會講解全部知識點(diǎn),而是帶領(lǐng)大家,一起學(xué)習(xí)如何對我們的項(xiàng)目進(jìn)行相關(guān)的配置和設(shè)置。
一、為容器設(shè)置啟動時(shí)要執(zhí)行的命令和參數(shù)
1.1、創(chuàng)建 Pod 時(shí)設(shè)置命令及參數(shù)
創(chuàng)建 Pod 時(shí),可以為其下的容器設(shè)置啟動時(shí)要執(zhí)行的命令及其參數(shù)。如果要設(shè)置命令,就填寫在配置文件的 command 字段下,如果要設(shè)置命令的參數(shù),就填寫在配置文件的 args 字段下。一旦 Pod 創(chuàng)建完成,該命令及其參數(shù)就無法再進(jìn)行更改了。
如果在配置文件中設(shè)置了容器啟動時(shí)要執(zhí)行的命令及其參數(shù),那么容器鏡像中自帶的命令與參數(shù)將會被覆蓋而不再執(zhí)行。如果配置文件中只是設(shè)置了參數(shù),卻沒有設(shè)置其對應(yīng)的命令,那么容器鏡像中自帶的命令會使用該新參數(shù)作為其執(zhí)行時(shí)的參數(shù)。
在目錄 pods/commands.yaml
創(chuàng)建一個(gè)只包含單個(gè)容器的 Pod。在 Pod 配置文件中設(shè)置了一個(gè)命令與兩個(gè)參數(shù):
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
restartPolicy: OnFailure
- 基于 YAML 文件創(chuàng)建一個(gè) Pod:
$ kubectl apply -f https://k8s.io/examples/pods/commands.yaml
- 獲取正在運(yùn)行的 Pods:
$ kubectl get pods
查詢結(jié)果顯示在 command-demo 這個(gè) Pod 下運(yùn)行的容器已經(jīng)啟動完成。
- 如果要獲取容器啟動時(shí)執(zhí)行命令的輸出結(jié)果,可以通過 Pod 的日志進(jìn)行查看:
$ kubectl logs command-demo
日志中顯示了 HOSTNAME 與 KUBERNETES_PORT 這兩個(gè)環(huán)境變量的值:
command-demo
tcp://10.3.240.1:443
1.2、使用環(huán)境變量來設(shè)置參數(shù)
在上面的示例中,我們直接將一串字符作為命令的參數(shù)。除此之外,我們還可以將環(huán)境變量作為命令的參數(shù)。
env:
- name: MESSAGE
value: "hello world"
command: ["/bin/echo"]
args: ["$(MESSAGE)"]
這意味著可以將那些用來設(shè)置環(huán)境變量的方法應(yīng)用于設(shè)置命令的參數(shù),其中包括了 ConfigMaps 與 Secrets。
1.3、在 Shell 來執(zhí)行命令
需要在 Shell 腳本中運(yùn)行命令。 例如,要執(zhí)行的命令可能由多個(gè)命令組合而成,或者它就是一個(gè) Shell 腳本。 這時(shí),就可以通過如下方式在 Shell 中執(zhí)行命令:
command: ["/bin/sh"]
args: ["-c", "while true; do echo hello; sleep 10;done"]
二、為容器定義相互依賴的環(huán)境變量
當(dāng)創(chuàng)建一個(gè) Pod 時(shí),你可以為運(yùn)行在 Pod 中的容器設(shè)置相互依賴的環(huán)境變量。 設(shè)置相互依賴的環(huán)境變量,你就可以在配置清單文件的 env 的 value 中使用 $(VAR_NAME)。
在本練習(xí)中,你會創(chuàng)建一個(gè)單容器的 Pod。 此 Pod 的配置文件定義了一個(gè)已定義常用用法的相互依賴的環(huán)境變量。 下面是目錄 pods/inject/dependent-envars.yaml
Pod 的配置清單:
apiVersion: v1
kind: Pod
metadata:
name: dependent-envars-demo
spec:
containers:
- name: dependent-envars-demo
args:
- while true; do echo -en '\n'; printf UNCHANGED_REFERENCE=$UNCHANGED_REFERENCE'\n'; printf SERVICE_ADDRESS=$SERVICE_ADDRESS'\n';printf ESCAPED_REFERENCE=$ESCAPED_REFERENCE'\n'; sleep 30; done;
command:
- sh
- -c
image: busybox:1.28
env:
- name: SERVICE_PORT
value: "80"
- name: SERVICE_IP
value: "172.17.0.1"
- name: UNCHANGED_REFERENCE
value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- name: PROTOCOL
value: "https"
- name: SERVICE_ADDRESS
value: "$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- name: ESCAPED_REFERENCE
value: "$$(PROTOCOL)://$(SERVICE_IP):$(SERVICE_PORT)"
- 依據(jù)清單創(chuàng)建 Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/dependent-envars.yaml
pod/dependent-envars-demo created
- 列出運(yùn)行的 Pod:
$ kubectl get pods dependent-envars-demo
NAME READY STATUS RESTARTS AGE
dependent-envars-demo 1/1 Running 0 9s
- 檢查 Pod 中運(yùn)行容器的日志:
$ kubectl logs pod/dependent-envars-demo
UNCHANGED_REFERENCE= ( P R O T O C O L ) : / / 172.17.0.1 : 80 S E R V I C E A D D R E S S = h t t p s : / / 172.17.0.1 : 80 E S C A P E D R E F E R E N C E = (PROTOCOL)://172.17.0.1:80 SERVICE_ADDRESS=https://172.17.0.1:80 ESCAPED_REFERENCE= (PROTOCOL)://172.17.0.1:80SERVICEA?DDRESS=https://172.17.0.1:80ESCAPEDR?EFERENCE=(PROTOCOL)??/172.17.0.1:80
如上所示,你已經(jīng)定義了 SERVICE_ADDRESS 的正確依賴引用, UNCHANGED_REFERENCE 的錯誤依賴引用, 并跳過了 ESCAPED_REFERENCE 的依賴引用。
如果環(huán)境變量被引用時(shí)已事先定義,則引用可以正確解析, 比如 SERVICE_ADDRESS 的例子。
當(dāng)環(huán)境變量未定義或僅包含部分變量時(shí),未定義的變量會被當(dāng)做普通字符串對待, 比如 UNCHANGED_REFERENCE 的例子。 注意,解析不正確的環(huán)境變量通常不會阻止容器啟動。
$(VAR_NAME) 這樣的語法可以用兩個(gè) $ 轉(zhuǎn)義,既:$$(VAR_NAME)。 無論引用的變量是否定義,轉(zhuǎn)義的引用永遠(yuǎn)不會展開。 這一點(diǎn)可以從上面 ESCAPED_REFERENCE 的例子得到印證。
三、為容器設(shè)置環(huán)境變量
創(chuàng)建 Pod 時(shí),可以為其下的容器設(shè)置環(huán)境變量。通過配置文件的 env 或者 envFrom 字段來設(shè)置環(huán)境變量。
本示例中,將創(chuàng)建一個(gè)只包含單個(gè)容器的 Pod。Pod 的配置文件中設(shè)置環(huán)境變量的名稱為 DEMO_GREETING, 其值為 “Hello from the environment”。
下面是目錄 pods/inject/envars.yaml
Pod 的配置清單:
apiVersion: v1
kind: Pod
metadata:
name: envar-demo
labels:
purpose: demonstrate-envars
spec:
containers:
- name: envar-demo-container
image: gcr.io/google-samples/node-hello:1.0
env:
- name: DEMO_GREETING
value: "Hello from the environment"
- name: DEMO_FAREWELL
value: "Such a sweet sorrow"
- 基于配置清單創(chuàng)建一個(gè) Pod:
$ kubectl apply -f https://k8s.io/examples/pods/inject/envars.yaml
- 獲取一下當(dāng)前正在運(yùn)行的 Pods 信息:
$ kubectl get pods -l purpose=demonstrate-envars
查詢結(jié)果應(yīng)為:
NAME READY STATUS RESTARTS AGE
envar-demo 1/1 Running 0 9s
- 列出 Pod 容器的環(huán)境變量:
$ kubectl exec envar-demo -- printenv
打印結(jié)果應(yīng)為:
NODE_VERSION=4.4.2
EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237
HOSTNAME=envar-demo
…
DEMO_GREETING=Hello from the environment
DEMO_FAREWELL=Such a sweet sorrow
3.1、在配置中使用環(huán)境變量
在 Pod 的配置中定義的環(huán)境變量可以在配置的其他地方使用, 例如可用在為 Pod 的容器設(shè)置的命令和參數(shù)中。 在下面的示例配置中,環(huán)境變量 GREETING ,HONORIFIC 和 NAME 分別設(shè)置為 Warm greetings to , The Most Honorable 和 Kubernetes。然后這些環(huán)境變量在傳遞給容器 env-print-demo 的 CLI 參數(shù)中使用。
apiVersion: v1
kind: Pod
metadata:
name: print-greeting
spec:
containers:
- name: env-print-demo
image: bash
env:
- name: GREETING
value: "Warm greetings to"
- name: HONORIFIC
value: "The Most Honorable"
- name: NAME
value: "Kubernetes"
command: ["echo"]
args: ["$(GREETING) $(HONORIFIC) $(NAME)"]
創(chuàng)建后,命令 echo Warm greetings to The Most Honorable Kubernetes
將在容器中運(yùn)行。文章來源:http://www.zghlxwxcb.cn/news/detail-787105.html
總結(jié)
看到這里,我想各位看官,已經(jīng)針對容器設(shè)置啟動時(shí)要執(zhí)行的命令和參數(shù)、定義相互依賴的環(huán)境變量、為容器設(shè)置環(huán)境變量,這三個(gè)配置設(shè)置的內(nèi)容學(xué)習(xí)了,下一篇我們將會針對本篇內(nèi)容的學(xué)習(xí)進(jìn)行實(shí)戰(zhàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-787105.html
到了這里,關(guān)于【云原生 | Kubernetes 系列】K8s 實(shí)戰(zhàn) 如何給應(yīng)用注入數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!