1. 程式人生 > >Kubernetes 之ConfigMap

Kubernetes 之ConfigMap

目錄

  • 1、何為configMap
  • 2、建立configMap
    • 2.1、通過--from-literal建立
    • 2.2、通過檔案建立
    • 2.3、通過目錄建立
    • 2.4、yaml檔案建立
  • 3、使用ConfigMap
    • 3.1、valueFrom方式
    • 3.2、掛載方式

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