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  

Tags: