K8s configmap和secret

secret和configmap可以理解爲特殊的存儲卷,但是它們不是給Pod提供存儲功能的,而是提供了從集羣外部向集羣內部的應用注入配置信息的功能。ConfigMap扮演了K8S集羣中配置中心的角色。ConfigMap定義了Pod的配置信息,可以以存儲卷的形式掛載至Pod中的應用程序配置文件目錄,從configmap中讀取配置信息;也可以基於環境變量的形式,從ConfigMap中獲取變量注入到Pod容器中使用。但是ConfigMap是明文保存的,如果用來保存數據庫賬號密碼這樣敏感信息,就非常不安全。一般這樣的敏感信息配置是通過secret來保存。secret的功能和ConfigMap一樣,不過secret是通過Base64的編碼機制保存配置信息。

1. 通過命令行創建ConfigMap

  • 第1種.使用nginx_port=8080nginx_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

注意:cmconfigmap的簡寫。可通過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_PORTNGINX_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中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章