Kubernetes K8S storage ConfigMap detailed explanation

Related content link to the original text:
Kubernetes K8S storage ConfigMap detailed

ConfigMap overview

ConfigMap is an API object used to store non-confidential data in key-value pairs. It can be used as environment variable, command line parameter or configuration file in storage volume.

ConfigMap decouples the environment configuration information from the container image, making it easy to modify the application configuration. You can use the Secret object when you need to store confidential information.

Note: ConfigMap does not provide confidentiality or encryption functions. If the data you want to store is confidential, please use Secret; or use other third-party tools to ensure the privacy of the data instead of ConfigMap.

ConfigMap creation method

Create from catalog

Configuration file directory

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# ll /root/k8s_practice/storage/configmap    # 配置文件存在哪个目录下
total 8
-rw-r--r-- 1 root root 159 Jun  7 14:52 game.properties
-rw-r--r-- 1 root root  83 Jun  7 14:53 ui.properties
[root@k8s-master storage]#
[root@k8s-master storage]# cat configmap/game.properties    # 涉及文件1
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30

[root@k8s-master storage]#
[root@k8s-master storage]# cat configmap/ui.properties   # 涉及文件2
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

Create ConfigMap and view status

[root@k8s-master storage]# kubectl create configmap game-config --from-file=/root/k8s_practice/storage/configmap
configmap/game-config created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap
NAME          DATA   AGE
game-config   2      14s

View what data the ConfigMap has

[root@k8s-master storage]# kubectl get configmap -o yaml   ##### 查看方式1
apiVersion: v1
items:
- apiVersion: v1
  data:
    game.properties: |+   ##### 本段最后有一行空格,+ 表示保留字符串行末尾的换行
      enemies=aliens
      lives=3
      enemies.cheat=true
      enemies.cheat.level=noGoodRotten
      secret.code.passphrase=UUDDLRLRBABAs
      secret.code.allowed=true
      secret.code.lives=30

    ui.properties: |
      color.good=purple
      color.bad=yellow
      allow.textmode=true
      how.nice.to.look=fairlyNice
  kind: ConfigMap
  metadata:
    creationTimestamp: "2020-06-07T06:57:28Z"
    name: game-config
    namespace: default
    resourceVersion: "889177"
    selfLink: /api/v1/namespaces/default/configmaps/game-config
    uid: 6952ac85-ded0-4c5e-89fd-b0c6f0546ecf
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap game-config   ##### 查看方式2
Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30


ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice

Events:  <none>

Create from file

Configuration file location

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat /root/k8s_practice/storage/configmap/game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30

Create ConfigMap and view status

[root@k8s-master storage]# kubectl create configmap game-config-2 --from-file=/root/k8s_practice/storage/configmap/game.properties
configmap/game-config-2 created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap game-config-2
NAME            DATA   AGE
game-config-2   1      29s

View what data the ConfigMap has

[root@k8s-master storage]# kubectl get configmap game-config-2 -o yaml   ##### 查看方式1
apiVersion: v1
data:
  game.properties: |+   ##### 本段最后有一行空格,+ 表示保留字符串行末尾的换行
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAs
    secret.code.allowed=true
    secret.code.lives=30

kind: ConfigMap
metadata:
  creationTimestamp: "2020-06-07T07:05:47Z"
  name: game-config-2
  namespace: default
  resourceVersion: "890437"
  selfLink: /api/v1/namespaces/default/configmaps/game-config-2
  uid: 02d99802-c23f-45ad-b4e1-dea9bcb166d8
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap game-config-2    ##### 查看方式2
Name:         game-config-2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAs
secret.code.allowed=true
secret.code.lives=30


Events:  <none>

Create via command line

Create ConfigMap and view status

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# kubectl create configmap special-config --from-literal=special.how=very --from-literal="special.type=charm"
configmap/special-config created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap special-config
NAME             DATA   AGE
special-config   2      23s

View what data the ConfigMap has

[root@k8s-master storage]# kubectl get configmap special-config -o yaml    ##### 查看方式1
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2020-06-07T09:32:04Z"
  name: special-config
  namespace: default
  resourceVersion: "912702"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: 76698e78-1380-4826-b5ac-d9c81f746eac
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap special-config    ##### 查看方式2
Name:         special-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
special.how:
----
very
special.type:
----
charm
Events:  <none>

Created by yaml file

yaml file

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "3"
  ui_properties_file_name: 'user-interface.properties'
  #
  # 类文件键
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true	

Create ConfigMap and view status

[root@k8s-master storage]# kubectl apply -f configmap.yaml
configmap/configmap-demo created
[root@k8s-master storage]# kubectl get configmap configmap-demo
NAME             DATA   AGE
configmap-demo   4      2m59s

View what data the ConfigMap has

[root@k8s-master storage]# kubectl get configmap configmap-demo -o yaml    ##### 查看方式1
apiVersion: v1
data:
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  player_initial_lives: "3"
  ui_properties_file_name: user-interface.properties
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"game.properties":"enemy.types=aliens,monsters\nplayer.maximum-lives=5\n","player_initial_lives":"3","ui_properties_file_name":"user-interface.properties","user-interface.properties":"color.good=purple\ncolor.bad=yellow\nallow.textmode=true\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"configmap-demo","namespace":"default"}}
  creationTimestamp: "2020-06-07T11:36:46Z"
  name: configmap-demo
  namespace: default
  resourceVersion: "931685"
  selfLink: /api/v1/namespaces/default/configmaps/configmap-demo
  uid: fdad7000-87bd-4b72-be98-40dd8fe6400a
[root@k8s-master storage]#
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl describe configmap configmap-demo     ##### 查看方式2
Name:         configmap-demo
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {
    
    "apiVersion":"v1","data":{
    
    "game.properties":"enemy.types=aliens,monsters\nplayer.maximum-lives=5\n","player_initial_lives":"3","ui_proper...

Data
====
game.properties:
----
enemy.types=aliens,monsters
player.maximum-lives=5

player_initial_lives:
----
3
ui_properties_file_name:
----
user-interface.properties
user-interface.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true

Events:  <none>

Use ConfigMap in Pod

How to use the above ConfigMap information in Pod.

Currently existing ConfigMap

[root@k8s-master storage]# kubectl get configmap
NAME             DATA   AGE
configmap-demo   4      30m
game-config      2      5h9m
game-config-2    1      5h1m
special-config   2      5m48s

Use ConfigMap to replace environment variables

yaml file

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-env
spec:
  containers:
  - name: myapp
    image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
    command: ["/bin/sh", "-c", "env"]
    ### 引用方式1
    env:
    - name: SPECAIL_HOW_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config   ### 这个name的值来自 ConfigMap
          key: special.how       ### 这个key的值为需要取值的键
    - name: SPECAIL_TPYE_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.type
    ### 引用方式2
    envFrom:
    - configMapRef:
        name: game-config-2   ### 这个name的值来自 ConfigMap
    restartPolicy: Never

Start the pod and check the status

[root@k8s-master storage]# kubectl apply -f pod_configmap_env.yaml
pod/pod-configmap-env created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME                READY   STATUS      RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
pod-configmap-env   0/1     Completed   0          6s    10.244.2.147   k8s-node02   <none>           <none>

View print log

[root@k8s-master storage]# kubectl logs pod-configmap-env
MYAPP_SVC_PORT_80_TCP_ADDR=10.98.57.156
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
MYAPP_SVC_PORT_80_TCP_PORT=80
HOSTNAME=pod-configmap-env
SHLVL=1
MYAPP_SVC_PORT_80_TCP_PROTO=tcp
HOME=/root
SPECAIL_HOW_KEY=very  ### 来自ConfigMap
game.properties=enemies=aliens  ### 来自ConfigMap
lives=3  ### 来自ConfigMap
enemies.cheat=true  ### 来自ConfigMap
enemies.cheat.level=noGoodRotten  ### 来自ConfigMap
secret.code.passphrase=UUDDLRLRBABAs  ### 来自ConfigMap
secret.code.allowed=true  ### 来自ConfigMap
secret.code.lives=30  ### 来自ConfigMap


SPECAIL_TPYE_KEY=charm  ### 来自ConfigMap
MYAPP_SVC_PORT_80_TCP=tcp://10.98.57.156:80
NGINX_VERSION=1.12.2
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
MYAPP_SVC_SERVICE_HOST=10.98.57.156
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
MYAPP_SVC_SERVICE_PORT=80
MYAPP_SVC_PORT=tcp://10.98.57.156:80

Use ConfigMap to set command line parameters

yaml file

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_cmd.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-cmd
spec:
  containers:
  - name: myapp
    image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
    command: ["/bin/sh", "-c", "echo \"===$(SPECAIL_HOW_KEY)===$(SPECAIL_TPYE_KEY)===\""]
    env:
    - name: SPECAIL_HOW_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.how
    - name: SPECAIL_TPYE_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.type
  restartPolicy: Never

Start the pod and check the status

[root@k8s-master storage]# kubectl apply -f pod_configmap_cmd.yaml
pod/pod-configmap-cmd created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME                READY   STATUS      RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
pod-configmap-cmd   0/1     Completed   0          5s    10.244.4.125   k8s-node01   <none>           <none>

View print log

[root@k8s-master storage]# kubectl logs pod-configmap-cmd
===very===charm===

Use ConfigMap through data volume plug-in [recommended]

To use ConfigMap in the data volume, the most basic thing is to fill the file into the data volume. In this file, the key is the file name [first-level key], and the key value is the file content.

yaml file

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap-volume
spec:
  containers:
  - name: myapp
    image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
    #command: ["/bin/sh", "-c", "ls -l /etc/config/"]
    command: ["/bin/sh", "-c", "sleep 600"]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: configmap-demo
  restartPolicy: Never

Start the pod and check the status

[root@k8s-master storage]# kubectl apply -f pod_configmap_volume.yaml
pod/pod-configmap-volume created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME                   READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
pod-configmap-volume   1/1     Running   0          5s    10.244.2.153   k8s-node02   <none>           <none>

Enter pod and view

[root@k8s-master storage]# kubectl exec -it pod-configmap-volume sh
/ # ls /etc/config
game.properties            player_initial_lives       ui_properties_file_name    user-interface.properties
/ #
/ #
/ #
/ # cat /etc/config/player_initial_lives
3/ #
/ #
/ #
/ # cat /etc/config/ui_properties_file_name
user-interface.properties/ #
/ #
/ #
/ # cat /etc/config/game.properties
enemy.types=aliens,monsters
player.maximum-lives=5
/ #
/ #
/ # cat /etc/config/user-interface.properties
color.good=purple
color.bad=yellow
allow.textmode=true

ConfigMap hot update

Ready to work

yaml file

[root@k8s-master storage]# pwd
/root/k8s_practice/storage
[root@k8s-master storage]# cat pod_configmap_hot.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: v1
  template:
    metadata:
      labels:
        app: myapp
        release: v1
        env: test
    spec:
      containers:
      - name: myapp
        image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
          name: log-config

Apply yaml file and view status

[root@k8s-master storage]# kubectl apply -f pod_configmap_hot.yaml
configmap/log-config created
deployment.apps/myapp-deploy created
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get configmap log-config
NAME         DATA   AGE
log-config   1      21s
[root@k8s-master storage]#
[root@k8s-master storage]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
myapp-deploy-58ff9c997-drhwk   1/1     Running   0          30s   10.244.2.154   k8s-node02   <none>           <none>
myapp-deploy-58ff9c997-n68j2   1/1     Running   0          30s   10.244.4.126   k8s-node01   <none>           <none>

View ConfigMap information

[root@k8s-master storage]# kubectl get configmap log-config -o yaml
apiVersion: v1
data:
  log_level: INFO
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"log_level":"INFO"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
  creationTimestamp: "2020-06-07T16:08:11Z"
  name: log-config
  namespace: default
  resourceVersion: "971348"
  selfLink: /api/v1/namespaces/default/configmaps/log-config
  uid: 7e78e1d7-12de-4601-9915-cefbc96ca305

View the ConfigMap information in the pod

[root@k8s-master storage]# kubectl exec -it myapp-deploy-58ff9c997-drhwk -- cat /etc/config/log_level
INFO

Hot update

Modify ConfigMap

[root@k8s-master storage]# kubectl edit configmap log-config     ### 将 INFO 改为了 DEBUG
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  log_level: DEBUG
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {
    
    "apiVersion":"v1","data":{
    
    "log_level":"DEBUG"},"kind":"ConfigMap","metadata":{
    
    "annotations":{
    
    },"name":"log-config","namespace":"default"}}
  creationTimestamp: "2020-06-07T16:08:11Z"
  name: log-config
  namespace: default
  resourceVersion: "971348"
  selfLink: /api/v1/namespaces/default/configmaps/log-config
  uid: 7e78e1d7-12de-4601-9915-cefbc96ca305

View ConfigMap information

[root@k8s-master storage]# kubectl get configmap log-config -o yaml
apiVersion: v1
data:
  log_level: DEBUG
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"log_level":"DEBUG"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"log-config","namespace":"default"}}
  creationTimestamp: "2020-06-07T16:08:11Z"
  name: log-config
  namespace: default
  resourceVersion: "972893"
  selfLink: /api/v1/namespaces/default/configmaps/log-config
  uid: 7e78e1d7-12de-4601-9915-cefbc96ca305

About 10 seconds later, check the ConfigMap information in the pod again

[root@k8s-master storage]# kubectl exec -it myapp-deploy-58ff9c997-drhwk -- cat /etc/config/log_level
DEBUG

It can be seen that a hot update has been completed

Guess you like

Origin blog.csdn.net/An1090239782/article/details/110927454