pod中兩種特殊類型的存儲卷:secret,configMap
pod.spec.volumes.secret
pod.spec.volumes.configMap
多數情況下,這兩個存儲卷不是給pod做存儲空間來用的,而是給我們的管理員或者用戶提供了從集群外部向pod內部的應用注入配置信息的方式。
configMap里放的是配置信息
configMap的主要作用是:讓配置信息與鏡像文件結藕,配置信息可以通過configMap注入。
簡單來講,一個configMap就是一系列配置數據的集合,而這些數據將來可以注入到pod對象中的容器中,以供使用。
而注入方式有兩種:1,直接把configMap當存儲卷。2,使用env的envFrom應用configMap當中所保存的數據
在每一個configMap中所有的配置信息都保存為鍵值格式。
configMap屬於名稱空間級別的資源。
configMap里面的配置信息是明文的。
secret相對於configMap,功能上是相似的,但是secret是以其他編碼方式去記錄配置信息的,但是也可以被解讀,只不過有技術門檻,不是那么容易就被解讀的。
使用base64是可以解讀的:echo ******** | base64 -d
********是kubectl describe secret secretName -o yaml中的值的編碼
配置容器化應用的方式:
1.自定義命令行參數;
args:[ ]
2.把配置文件直接焙進鏡像;
3.環境變量;
(1)Cloud Native的應用程序一般可直接通過環境變量加載配置;
(2)通過entrypoint腳本來預處理變量為配置文件中的配置信息;
4.存儲卷;
pod資源環境變量的獲取方式:
在pod中我們要想通過環境變量傳遞內容、傳遞數據、傳遞信息給pod中的容器
我們需要在容器上使用env、value、或valueFrom來獲取數據;
在pod.spec.containers.env{name,value}/{valueFrom}
pod.spec.containers.env.valueFrom.{configMapKeyRef:configMap}/{fieldRef:引用配置文件的某個字段:metadata...}/{resourceFieldRef:資源限制}/{secretKeyRef:secret}
使用valueFrom方式獲取配置的方式:
pod.spec.containers.env.valueFrom.configMapKeyRef
pod.spec.containers.env.valueFrom.secretKeyRef
kubectl create configMap configMapName --from-file=key1=file1url --from-file=keyN=fileNurl 此時以文件名為key,以文件內容為value
詳情:kubectl create configmap --help
例:
創建一個pod,創建一個configMap,pod用env引用configMap定義的key和value。
1.先創建configMap
1 kubectl create cm cm-1 --from-literal=nginx_port=80 --from-literal=server_name=myapp.smbands.com 2 kubectl describe cm cm-1
3 Name: cm-1
4 Namespace: default
5 Labels: <none>
6 Annotations: <none>
7
8 Data 9 ====
10 nginx_port: 11 ----
12 80
13 server_name: 14 ----
15 myapp.smbands.com 16 Events: <none>
2.創建pod
1 vim myapp-pod.yaml 2 apiVersion: apps/v1 3 kind: Deployment 4 metadata: 5 name: myapp-demo 6 namespace: default
7 spec: 8 replicas: 1
9 selector: 10 matchLabels: 11 app: myapp 12 template: 13 metadata: 14 labels: 15 app: myapp 16 spec: 17 containers: 18 - name: myapp 19 image: ikubernetes/myapp:v1 20 imagePullPolicy: IfNotPresent 21 ports: 22 - name: http 23 containerPort: 80
24 env: 25 - name: NGINX_SERVER_PORT 26 valueFrom: 27 configMapKeyRef: 28 name: cm-1
29 key: nginx_port 30 - name: NGINX_SERVER_NAME 31 valueFrom: 32 configMapKeyRef: 33 name: cm-1
34 key: server_name
3.運行pod查看env
1 kubectl apply -f myapp-pod.yaml 2 kubectl exec myapp-pod-5db6d54bb7-rjhkz -- printenv 3 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 4 HOSTNAME=myapp-demo-5db6d54bb7-rjhkz 5 NGINX_SERVER_PORT=80
6 NGINX_SERVER_NAME=myapp.smbands.com
當我們使用環境變量注入時,只在pod啟動時加載生效
如上示例如果更改configMap中的key或value,容器中的env只會在重啟容器時生效。
當然我們可以使用存儲卷方式來實時獲取configMap里的數據。
只不過存儲卷方式,configMap掛載到pod中的某個目錄下每個鍵成為文件名,對應值成為文件內容。也就是說,把configMap中的鍵值以文件方式掛載到pod中。
例:創建一個pod,創建一個configMap,pod使用掛載卷方式引用configMap里的主機配置內容,pod運行后可直接使用指定主機訪問。
1.創建configMap:
1 vim www.config 2 server { 3 server_name myapp.smbands.com; 4 listen 80; 5 root /data/web/html; 6 } 7 kubectl create cm cm-2 --from-file=www.conf 8 kubectl describe cm cm-2
9 Name: cm-2
10 Namespace: default
11 Labels: <none>
12 Annotations: <none>
13
14 Data 15 ====
16 www.conf: 17 ----
18 server { 19 server_name myapp.smbands.com; 20 listen 80; 21 root /data/web/html; 22 } 23
24 Events: <none>
2.創建pod
1 vim myapp-pod-1.yaml 2 apiVersion: apps/v1 3 kind: Deployment 4 metadata: 5 name: myapp-1
6 namespace: default
7 spec: 8 replicas: 1
9 selector: 10 matchLabels: 11 app: myapp 12 template: 13 metadata: 14 labels: 15 app: myapp 16 spec: 17 containers: 18 - name: myapp 19 image: ikubernetes/myapp:v1 20 imagePullPolicy: IfNotPresent 21 ports: 22 - name: http 23 containerPort: 80
24 volumeMounts: 25 - name: wwwconf 26 mountPath: /etc/nginx/conf.d/
27 volumes: 28 - name: wwwconf 29 configMap: 30 name: cm-2
3.啟動pod,查看掛載點目錄。
1 kubectl apply -f myapp-pod-1.yaml 2 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf 3 server { 4 server_name myapp.smbands.com; 5 listen 80; 6 root /data/web/html; 7 }
此時可以修改hosts文件,在發布路徑下寫測試頁,然后就可以curl myapp.smbands.com
4.修改configMap cm-2的listen 80 為listen 8080
kubectl edit cm cm-2 修改80為8080
等待片刻,再查看
1 kubectl exec myapp-1-5b5fc74c6-jd2b7 -- cat /etc/nginx/conf.d/www.conf 2 server { 3 server_name myapp.smbands.com; 4 listen 8080; 5 root /data/web/html; 6 }
注意:這里儲存卷掛載方式可以實時注入信息,但是不一定注入的信息都能生效。
比如此例,雖然cm-2修改為8080,pod中的配置文件也同步為8080,但是nginx的監聽地址還是80,需要重載配置文件才能生效。