Kubernetes—配置管理ConfigMap

1 ConfigMap介紹

1.1 概述

  在部署應用程序時,咱們都會涉及到應用的配置,在容器中,如Docker容器中,若是將配置文件打入容器鏡像,這種行爲等同於寫死配置,每次修改完配置,鏡像就得從新構建。固然,咱們也能夠經過掛載包含該文件的捲進行配置管理和修改。而在k8s中,咱們要講一種更好的方式,即ConfigMap,這種資源對象的出現,更是極大的方便了應用程序的配置管理。
  ConfigMap是一個或多個key/value的形式保存在k8s中,內部能夠管理變量也能夠管理完整的配置文件內容。shell

1.2 用法

  1. 生成容器內的環境變量,在pod中能夠經過spec.env或者spec.envFrom進行引用。
  2. 設置容器啓動命令的啓動參數,前提是設置爲環境變量。
  3. 以卷volume的方式掛載到容器內部的文件或目錄,經過spec.volumes引用。

2 ConfigMap用法

在使用命令的時候注意單詞: configmap等價於cm,cm算是簡寫,相似於deployment能夠使用命令時寫成deploy,service能夠寫成svc,namespace能夠寫成ns,pod能夠寫成po。vim

2.1 建立

1)yaml文件方式建立
樣例:api

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-test01
data:
  appconf01: value01
  appconf02: value02

命令:
$ kubectl create -f configmap-test01.yamltomcat

2)命令行方式建立bash

  • 讀取文件方式(也能夠是目錄)經過--from-file參數從文件中讀取。能夠指定key的名稱,若不指定,則默認使用文件名爲key。
    如當前目錄有一個配置文件爲test.properties
key01:value01
key02:value02
conf01: value03

$ kubectl create cm cm-test-file --from-file=test.propertiesapp

  • 指定參數方式,經過--from-literal指定keyxx=valuexx建立confimap中的data內配置屬性。
    $ kubectl create configmap cm-test-literal --from-literal=key01=value01 --from-literal=key02=value02

2.2 查詢

1)查看configmap列表
$ kubectl get cmui

[root@k8s /cm/test]#  kubectl get cm
NAME        DATA      AGE
cm-test-file      1         1m
cm-test-literal   2         2s
cm-test01         2         1h

2)查看configmap詳情
$ kubectl describe cm cm-test01spa

[root@k8s /cm/test]#  kubectl describe cm cm-test01
Name:           cm-test01
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>

Data
====
appconf01:
----
value01
appconf02:
----
value02

$ kubectl describe configmap cm-test-file命令行

[root@k8s /cm/test]#  kubectl describe configmap cm-test-file
Name:           cm-test-file
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>

Data
====
test.properties:
----
key01:value01
key02:value02
conf01: value03

$ kubectl describe cm cm-test-literalrest

[root@k8s /cm/test]#  kubectl describe cm cm-test-literal
Name:           cm-test-literal
Namespace:      system-pro
Labels:         <none>
Annotations:    <none>

Data
====
key01:
----
value01
key02:
----
value02

3)查看yaml輸出
$ kubectl get cm cm-test01 -o yaml

[root@k8s /cm/test]#  kubectl get cm cm-test01 -o yaml
apiVersion: v1
data:
  appconf01: value01
  appconf02: value02
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T13:06:21Z
  name: cm-test01
  namespace: system-pro
  resourceVersion: "594861"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test01
  uid: 6f5e7efb-652b-11ea-adf9-fa163e4464a5

$ kubectl get configmap cm-test-file -o yaml

[root@k8s /cm/test]#  kubectl get configmap cm-test-file -o yaml
apiVersion: v1
data:
  test.properties: |
    key01:value01
    key02:value02
    conf01: value03
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T14:29:30Z
  name: cm-test-file
  namespace: system-pro
  resourceVersion: "598548"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-file
  uid: 0d226ad2-6537-11ea-adf9-fa163e4464a5

$ kubectl get cm cm-test-literal -o yaml

[root@k8s /cm/test]#  kubectl get cm cm-test-literal -o yaml
apiVersion: v1
data:
  key01: value01
  key02: value02
kind: ConfigMap
metadata:
  creationTimestamp: 2020-03-13T14:30:57Z
  name: cm-test-literal
  namespace: system-pro
  resourceVersion: "598613"
  selfLink: /api/v1/namespaces/system-pro/configmaps/cm-test-literal
  uid: 412affd4-6537-11ea-adf9-fa163e4464a5

2.3 更新

1)edit
$ kubectl edit cm cm-test01
在這裏插入圖片描述
經過kubectl describe cm cm-test01查看更新是否生效
在這裏插入圖片描述
2)apply
直接更改yaml文件裏面的值,經過kubectl apply -f configmap-test01.yaml從新發布一遍進行更新。

2.4 刪除

1)經過yaml文件的方式刪除
$ kubectl delete -f configmap-test01.yaml

2)直接刪除資源
$ kubectl delete cm cm-test01

3 ConfigMap和Pod的使用

容器應用對ConfigMap的使用主要是兩種:
1)經過環境變量獲取ConfigMap的內容:spec.envspec.envFrom
2)經過卷volume掛載的方式將ConfigMap的內容掛載到容器內部的文件或目錄:spec.volumes

如下內容均以上述的ConfigMap資源cm-test01爲例

3.1 環境變量方式

spec.env方式

1)建立pod

[root@k8s /cm/test]#  vim pod-test01.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test001
spec:
  containers:
  - name: cm-test
    image: tomcat:8
    command: [ "/bin/sh", "-c", "env | grep APP"]
    env:
    - name: APPCONF01       # 定義環境變量的名稱
      valueFrom:            # key 「appconf01」的值獲取
        configMapKeyRef:
          name: cm-test01   # 環境變量的值來自於configmap cm-test01
          key: appconf01    # configmap中的配置key爲appconf01
    - name: APPCONF02       # 定義環境變量的名稱
      valueFrom:            # key 「appconf02」的值獲取
        configMapKeyRef:
          name: cm-test01   # 環境變量的值來自於configmap cm-test01
          key: appconf02    # configmap中的配置key爲appconf02
  restartPolicy: Never      # 重啓策略:從不。

執行建立pod:
$ kubectl create -f pod-test01.yaml

2)查看pod
$ kubectl get pods

[root@k8s /cm/test]#  kubectl get pods
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          1h

3)查看pod日誌
$ kubectl logs cm-pod-test001

[root@k8s /cm/test]#  kubectl logs cm-pod-test001
APPCONF01=value01
APPCONF02=value02

說明容器內部的環境變量使用ConfigMap中進行讀取的。

spec.envFrom方式

1)建立pod
yaml文件

[root@k8s /cm/test]#  vim pod-test02.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test002
spec:
  containers:
  - name: cm-test2
    image: tomcat:8
    command: [ "/bin/sh", "-c", "env"]
    envFrom:
    - configMapRef:
      name: cm-test01   # 根據ConfigMap cm-test01資源自動生成環境變量
  restartPolicy: Never

執行建立pod:
$ kubectl create -f pod-test02.yaml

2)查看pod
$ kubectl get po

[root@k8s /cm/test]#  kubectl get po
NAME             READY     STATUS      RESTARTS   AGE
cm-pod-test001   0/1       Completed   0          2h
cm-pod-test002   0/1       Completed   0          1h

注意:
環境變量的名稱受限制:[a-zA-Z][a-zA-Z0-9_]*,不能以數字或非法字符開頭。

3.2 卷掛載方式

指定items

[root@k8s /cm/test]#  vim pod-test03.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test003
spec:
  containers:
  - name: cm-test3
    image: tomcat:8
    volumeMounts:
    - name: vm-01-1
      mountPath: /conf
  volumes:
  - name: vm-01-1
    configMap:
      name: cm-test-file
      items:
      - key: key-testproperties
        path: test.properties
  restartPolicy: Never

不指定items

[root@k8s /cm/test]#  vim pod-test04.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-pod-test004
spec:
  containers:
  - name: cm-test4
    image: tomcat:8
    volumeMounts:
    - name: vm-02-2
      mountPath: /conf
  volumes:
  - name: vm-02-2
    configMap:
      name: cm-test-file
  restartPolicy: Never

進入容器中查看
$ kubectl exec -it cm-pod-test004 -c cm-test4 -- bash
進入容器後,ls /conf查看是否有test.properties文件。

[root@k8s /cm/test]#  kubectl exec -it cm-pod-test004 -c cm-test4  -- bash
root@cm-pod-test004:/usr/local/tomcat# ls /conf
test.properties

補充

關於--from-file的方式的建立指定key和不指定key的區別
1)不指定key名
建立:
$ kubectl create cm cm-test-file --from-file=test.properties
輸出:
$ kubectl get cm cm-test-file -o yaml
在這裏插入圖片描述
2)指定key
建立:
$ kubectl create cm cm-test-file02 --from-file=tp=test.properties
輸出:
$ kubectl get cm cm-test-file -o yaml
在這裏插入圖片描述 若指定key的名稱,configmap中將會使用指定名稱;若不指定,則默認使用文件名爲key。

相關文章
相關標籤/搜索