Kubernetes之ConfigMap
- 2020 年 3 月 27 日
- 筆記
1、何為configMap
kubernetes中提供了一個叫configMap的概念,為的就是讓鏡像和配置文件之間解耦,不需要在鏡像中打包配置文件,實現了鏡像的靈活性,因為一個configMap就是一系列配置資訊的集合,將來是可以直接注入到Pod中的容器供其使用。
2、創建configMap
你可以通過使用kubectl create configmap或者yaml方式來創建configMap。
2.1、通過--from-literal創建
命令格式:
$ kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] 示例:
1.創建命令
$ kubectl create configmap test-config --from-literal=Username=root --from-literal=Password=123456 2.結果如下data內容:
[root@hdss7-21 ~]# kubectl get configmap test-config -o yaml apiVersion: v1 data: Password: "123456" Username: root kind: ConfigMap metadata: creationTimestamp: "2020-03-27T12:25:59Z" name: test-config namespace: default resourceVersion: "98418" selfLink: /api/v1/namespaces/default/configmaps/test-config uid: 7ce2d3dd-6b0d-4fa2-bb09-0a353a3a137a 2.2、通過文件創建
我們可以指定文件創建configmap,系統會自動將文件的內容寫入到configmap的data欄位里。
命令格式:
$ kubectl create configmap NAME [--from-file=[key=]source] 示例:
1.db.properties文件內容
db.user = root db.pwd = 123456 db.host = 10.4.7.11 db.port = 3306 db.lib = devops 2.創建命令
$ kubectl create configmap db-config --from-file=./db.properties --from-file 可以有多個
3.結果如下data內容:
[root@hdss7-21 ~]# kubectl get configmap db-config -o yaml apiVersion: v1 data: db.properties: | db.user = root db.pwd = 123456 db.host = 10.4.7.11 db.port = 3306 db.lib = devops kind: ConfigMap metadata: creationTimestamp: "2020-03-27T12:33:57Z" name: db-config namespace: default resourceVersion: "99103" selfLink: /api/v1/namespaces/default/configmaps/db-config uid: a3b76fd8-bf2d-483b-a455-eb4fb48450cb 注意:我們可以看到指定文件創建時ConfigMap會創建一個key/value鍵值對,key是文件名,value是文件內容。
如果我們不想configmap中的key為默認的文件名,還可以在創建時自己指定key名字:
$ kubectl create configmap db-config --from-file=<key-name>=<path-to-file> 2.3、通過目錄創建
我們可以指定目錄創建configmap,系統會自動將指定目錄下的所有文件的內容寫入到configmap的data欄位里。
命令格式:
$ kubectl create configmap NAME [--from-file=[key=]source] 示例:
1.查看文件內容
[root@hdss7-21 ~]# echo "123" >config/a.ini [root@hdss7-21 ~]# echo "456" >config/b.ini 2.創建命令
$ kubectl create configmap ab-config --from-file=./config --from-file 可以有多個。
3.結果如下data內容:
[root@hdss7-21 ~]# kubectl get configmap ab-config -o yaml apiVersion: v1 data: a.ini: | 123 b.ini: | 456 kind: ConfigMap metadata: creationTimestamp: "2020-03-27T12:45:15Z" name: ab-config namespace: default resourceVersion: "100073" selfLink: /api/v1/namespaces/default/configmaps/ab-config uid: 0988dda0-c8b5-4944-ad16-cffba1d41bb3 注意:我們可以看到指定目錄創建時ConfigMap內容中的各個文件會創建一個key/value鍵值對,key是文件名,value是文件內容。
指定目錄時只會識別該目錄下的文件,而忽略子目錄。
2.4、yaml文件創建
1.創建cache-db-config.yaml文件
apiVersion: v1 kind: ConfigMap metadata: name: cache-db-config namespace: default data: redis.cnf: | redis.db = 3 redis.host = 127.0.0.1 redis.user = admin redis.pwd = admin123 redis.port = 2379 mysql.cnf: | mysql.db = devops mysql.host = 127.0.0.1 mysql.user = root mysql.pwd = root123 mysql.port = 3306 2.應用yaml
$ kubectl apply -f cache-db-config.yaml 3、使用ConfigMap
那麼前面介紹如何創建ConfigMap,但是怎麼使用尼?下面講解
使用ConfigMap三種方式:
- 第一種是通過環境變數的方式,直接傳遞給pod
- 使用configmap中指定的key
- 使用configmap中所有的key
- 第二種是通過在pod的命令行下運行的方式(啟動命令中)
- 第三種是作為volume的方式掛載到pod內
3.1、valueFrom方式
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.11 ports: - containerPort: 80 env: - name: User # pod容器中的環境變數名字 valueFrom: configMapKeyRef: name: test-config # configmap的名字 key: Username # configmap中定義的key - name: Pwd valueFrom: configMapKeyRef: name: test-config key: Password 驗證:
[root@hdss7-21 ~]# kubectl exec nginx-7cd5cbd997-zv6f4 printenv | egrep "User|Pwd" User=root Pwd=123456 3.2、掛載方式
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.11 ports: - containerPort: 80 volumeMounts: - name: ab mountPath: /etc/nginx/conf.d/ readOnly: true volumes: - name: ab configMap: # 存儲卷類型 name: ab-config 驗證:
[root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/a.ini 123 [root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/b.ini 456

