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