secret和configmap可以理解爲特殊的存儲卷,但是它們不是給Pod提供存儲功能的,而是提供了從集羣外部向集羣內部的應用注入配置信息的功能。ConfigMap扮演了K8S集羣中配置中心的角色。ConfigMap定義了Pod的配置信息,可以以存儲卷的形式掛載至Pod中的應用程序配置文件目錄,從configmap中讀取配置信息;也可以基於環境變量的形式,從ConfigMap中獲取變量注入到Pod容器中使用。但是ConfigMap是明文保存的,如果用來保存數據庫賬號密碼這樣敏感信息,就非常不安全。一般這樣的敏感信息配置是通過secret
來保存。secret
的功能和ConfigMap一樣,不過secret是通過Base64的編碼機制保存配置信息。
1. 通過命令行創建ConfigMap
- 第1種.使用
nginx_port=8080
和nginx_server_name=myapp.lemon.com
創建名爲my-config
的新ConfigMap
[root@s1 ~]# kubectl create configmap my-config --from-literal=nginx_port=8080 --from-literal=nginx_server_name=myapp.lemon.com
configmap/my-config created
- 第2種.創建一個新ConfigMap名爲my-www,指定配置文件內容爲www.conf
[root@s1 ~]# cat www.conf
server {
listen 8080;
server_name myapp02.lemon.com;
root /data/www;
}
[root@s1 ~]# kubectl create configmap my-www --from-file=./www.conf
configmap/my-www created
2. 通過yaml文件創建ConfigMap
編輯文件:nginx-cm.yaml
[root@s1 ~]# vim nginx-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-cm-yaml
namespace: default
data:
nginx_server_port: "8088"
nginx_server_name: "myapp01.lemon.com"
注意:如上,
ConfigMap
的清單文件相對較簡單,它沒有spec
字段,data
字段的內容就是配置信息數據,配置信息數據的值必須用引號包含(如:nginx_server_port: "8088"
),否則創建時會報錯。
根據清單文件創建ConfigMap
[root@s1 ~]# kubectl apply -f nginx-cm.yaml
configmap/nginx-cm-yaml created
獲取前兩步創建的ConfigMap
[root@s1 ~]# kubectl get cm
NAME DATA AGE
my-config 2 51m
my-www 1 15m
nginx-cm-yaml 2 49m
注意:
cm
爲configmap
的簡寫。可通過kubectl api-resources
命令查看K8S所有資源和對應簡寫。
使用ConfigMap
從ConfigMap中獲取配置信息的方法有兩種:
- 一種是利用環境變量將配置信息注入Pod容器中的方式,這種方式只在Pod創建的時候生效,這就意味着在ConfigMap中的修改配置信息後,更新的配置不能被已經創建Pod容器所應用。
- 另一種是將ConfigMap做爲存儲卷掛載至Pod容器內,這樣在修改ConfigMap配置信息後,Pod容器中的配置也會隨之更新,不過這個過程會有稍微的延遲。
先來看看通過環境變量注入配置信息的方式:
[root@s1 ~]# vim pod-configmap-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-configmap
labels:
name: myapp-configmap
config: configmap
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
env:
- name: NGINX_SERVER_PORT
valueFrom:
configMapKeyRef:
name: my-config
key: nginx_port
- name: NGINX_SERVER_NAME # 傳入Pod容器中的變量名爲NGINX_SERVER_NAME,值爲
valueFrom:
configMapKeyRef:
name: my-config # 選擇需要的configmap的名稱
key: nginx_server_name
要點:
NGINX_SERVER_PORT
和NGINX_SERVER_NAME
是傳入Pod容器內的變量名,它的值是從名爲my-config(ConfigMap)中對應的KEY獲取。NGINX_SERVER_NAME=nginx_server_name=myapp.lemon.com
應用清單文件創建Pod:
[root@s1 ~]# kubectl apply -f pod-configmap-env.yaml
pod/myapp-configmap created
進入Pod容器中驗證變量是否存在:
從上圖可以看出變量已經傳入Pod容器中了。
接下來再看一下把ConfigMap當作存儲卷掛載至Pod中的用法:
[root@s1 ~]# vim pod-configmap-vol-2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-configmap-vol-2
labels:
name: pod-configmap-vol-2
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: my-cm-www
mountPath: /etc/nginx/conf.d/ # 將名爲my-www的configmap掛載至Pod容器的這個目錄下。
volumes:
- name: my-cm-www
configMap: # 存儲卷類型選configMap
name: my-www # 選擇一個configmap
應用清單文件創建Pod:
[root@s1 ~]# kubectl apply -f pod-configmap-vol-2.yaml
pod/pod-configmap-vol-2 created
進入名爲pod-configmap-vol-2的Pod中驗證:
[root@s1 ~]# kubectl exec -it pod-configmap-vol-2 -- /bin/sh
/ #
/ # cd /etc/nginx/conf.d/
/etc/nginx/conf.d # ls
www.conf
/etc/nginx/conf.d # cat www.conf
server {
listen 8080;
server_name myapp02.lemon.com;
root /data/www;
}
/etc/nginx/conf.d # nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
從上圖中可以看出ConfigMap已經掛載至Pod容器中了。
secret功能和configmap一樣,只不過secret配置中心存儲的配置文件不是明文的,一般將連接數據庫的密碼、私鑰等寫在secret中。