# 命令格式 kubectl create configmap <映射名称> <数据源> # <映射名称> 是为 ConfigMap 指定的名称,<数据源> 是要从中提取数据的目录、 文件或者字面值。
1)kubectl describe 2)kubectl get
# 创建本地目录 mkdir -p configure-pod-container/configmap/ # 将实例文件下载到 `configure-pod-container/configmap/` 目录 wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties # 创建 configmap [root@vm21 yaml]# kubectl create configmap game-config --from-file=configure-pod-container/configmap/ configmap/game-config created # 查看configmap [root@vm21 yaml]# kubectl get configmap game-config NAME DATA AGE game-config 2 23s # 查看game-config内容 [root@vm21 yaml]# kubectl describe configmap game-config Name: game-config Namespace: default Labels:Annotations: 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 BinaryData ==== Events: # 以yaml格式输出game-config内容 [root@vm21 yaml]# kubectl get configmap game-config -o yaml 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: "2022-04-10T12:49:45Z" name: game-config namespace: default resourceVersion: "7531" uid: 0f84e076-f5c7-42a7-8dee-5e5a349f9c1e
# 生成game-config2,可以连续指定多个--from-file [root@vm21 yaml]# kubectl create configmap game-config2 --from-file=configure-pod-container/configmap/ui.properties configmap/game-config2 created # 查看game-config2 [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config 2 6m58s game-config2 1 11s kube-root-ca.crt 1 83m # 查看game-config2描述 [root@vm21 yaml]# kubectl describe configmap game-config2 Name: game-config2 Namespace: default Labels:Annotations: Data ==== ui.properties: ---- color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice BinaryData ==== Events: # 以yaml格式输出game-config2内容 [root@vm21 yaml]# kubectl get configmap game-config2 -o yaml apiVersion: v1 data: ui.properties: | color.good=purple color.bad=yellow allow.textmode=true how.nice.to.look=fairlyNice kind: ConfigMap metadata: creationTimestamp: "2022-04-10T12:56:32Z" name: game-config2 namespace: default resourceVersion: "8103" uid: 01fd7498-c4d2-4692-97bf-f93d1dc09e67 # 下载示例环境文件 wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties # 显示env文件内容 [root@vm21 yaml]# cat configure-pod-container/configmap/game-env-file.properties enemies=aliens lives=3 allowed="true" # 从环境文件创建 ConfigMap [root@vm21 yaml]# kubectl create configmap game-config-3 --from-env-file=configure-pod-container/configmap/game-env-file.properties configmap/game-config-3 created # 查看已生成的configmap [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config 2 19m game-config-3 3 10s game-config2 1 12m kube-root-ca.crt 1 95m # 查看game-config-3描述 [root@vm21 yaml]# kubectl describe configmap game-config-3 Name: game-config-3 Namespace: default Labels: Annotations: Data ==== allowed: ---- "true" enemies: ---- aliens lives: ---- 3 BinaryData ==== Events: # 以yaml格式描述game-config-3 [root@vm21 yaml]# kubectl get configmap game-config-3 -o yaml apiVersion: v1 data: allowed: '"true"' enemies: aliens lives: "3" kind: ConfigMap metadata: creationTimestamp: "2022-04-10T13:08:35Z" name: game-config-3 namespace: default resourceVersion: "9120" uid: 88161d80-c0b4-4a7b-9e3d-f1e56f17d545 # 当多次使用 --from-env-file 来从多个数据源创建 ConfigMap 时,仅仅最后一个 env 文件有效 # 定义从文件创建 ConfigMap 时要使用的键,格式如下: kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径> # [root@vm21 yaml]# kubectl create configmap game-config-4 --from-file=game-special-key=configure-pod-container/configmap/game.properties configmap/game-config-4 created [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config 2 23m game-config-3 3 4m44s game-config-4 1 9s game-config2 1 16m kube-root-ca.crt 1 99m [root@vm21 yaml]# kubectl describe configmap game-config-4 Name: game-config-4 Namespace: default Labels: Annotations: Data ==== game-special-key: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 BinaryData ==== Events: [root@vm21 yaml]# kubectl get configmap game-config-4 -o yaml apiVersion: v1 data: game-special-key: |- 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: "2022-04-10T13:13:10Z" name: game-config-4 namespace: default resourceVersion: "9503" uid: c4fb1651-b8c9-450d-861f-224265fc03da
[root@vm21 yaml]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm configmap/special-config created [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config 2 28m game-config-3 3 9m28s game-config-4 1 4m53s game-config2 1 21m kube-root-ca.crt 1 104m special-config 2 7s [root@vm21 yaml]# kubectl describe configmap special-config Name: special-config Namespace: default Labels:Annotations: Data ==== special.how: ---- very special.type: ---- charm BinaryData ==== Events: [root@vm21 yaml]# kubectl get configmap special-config -o yaml apiVersion: v1 data: special.how: very special.type: charm kind: ConfigMap metadata: creationTimestamp: "2022-04-10T13:17:56Z" name: special-config namespace: default resourceVersion: "9900" uid: a9331311-c7b4-4098-b59d-01f77d3e4b24
[root@vm21 configmap]# mkdir -p /opt/yaml/configure-pod-container/configmap/kubectl [root@vm21 configmap]# cp /opt/yaml/configure-pod-container/configmap/game.properties /opt/yaml/configure-pod-container/configmap/kubectl/ [root@vm21 yaml]# kubectl apply -k . configmap/game-config-4-tbg7c4gc77 created [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config-4-tbg7c4gc77 1 11s kube-root-ca.crt 1 125m [root@vm21 yaml]# kubectl describe configmap/game-config-4-tbg7c4gc77 Name: game-config-4-tbg7c4gc77 Namespace: default Labels:Annotations: 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 BinaryData ==== Events: [root@vm21 yaml]# kubectl get configmap/game-config-4-tbg7c4gc77 -o yaml 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: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"game.properties":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.passphrase=UUDDLRLRBABAS\nsecret.code.allowed=true\nsecret.code.lives=30"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"game-config-4-tbg7c4gc77","namespace":"default"}} creationTimestamp: "2022-04-10T13:38:33Z" name: game-config-4-tbg7c4gc77 namespace: default resourceVersion: "11578" uid: a2bdac5c-5b6b-4683-b23b-512981210187 # 请注意,生成的 ConfigMap 名称具有通过对内容进行散列而附加的后缀, 这样可以确保每次修改内容时都会生成新的 ConfigMap。 # 定义从文件生成 ConfigMap 时要使用的键 # 在 ConfigMap 生成器中,你可以定义一个非文件名的键名。 # 例如,从 configure-pod-container/configmap/game.properties 文件生成 ConfigMap, 但使用 game-special-key 作为键名: cat < ./kustomization.yaml configMapGenerator: - name: game-config-5 files: - game-special-key=configure-pod-container/configmap/kubectl/game.properties EOF [root@vm21 yaml]# kubectl apply -k ./ configmap/game-config-5-tfhf8f4fkf created [root@vm21 yaml]# kubectl get configmap NAME DATA AGE game-config-4-tbg7c4gc77 1 7m11s game-config-5-tfhf8f4fkf 1 9s kube-root-ca.crt 1 132m [root@vm21 yaml]# kubectl describe configmap/game-config-5-tfhf8f4fkf Name: game-config-5-tfhf8f4fkf Namespace: default Labels: Annotations: Data ==== game-special-key: ---- enemies=aliens lives=3 enemies.cheat=true enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=true secret.code.lives=30 BinaryData ==== Events: [root@vm21 yaml]# kubectl get configmap/game-config-5-tfhf8f4fkf -o yaml apiVersion: v1 data: game-special-key: |- 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: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","data":{"game-special-key":"enemies=aliens\nlives=3\nenemies.cheat=true\nenemies.cheat.level=noGoodRotten\nsecret.code.passphrase=UUDDLRLRBABAS\nsecret.code.allowed=true\nsecret.code.lives=30"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"game-config-5-tfhf8f4fkf","namespace":"default"}} creationTimestamp: "2022-04-10T13:45:35Z" name: game-config-5-tfhf8f4fkf namespace: default resourceVersion: "12242" uid: 4647a12d-780c-456c-87a6-044d12c5c3b9
# 1.在 ConfigMap 中将环境变量定义为键值对: kubectl create configmap special-config --from-literal=special.how=very # 2.将 ConfigMap 中定义的 special.how 赋值给 Pod 规约中的 SPECIAL_LEVEL_KEY 环境变量 vi example-pod.yaml apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: busybox:latest #可以到https://hub.docker.com/搜索镜像包 command: [ "/bin/sh", "-c", "env" ] env: # 定义环境变量 - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how restartPolicy: Never # kubectl create -f example-pod.yaml
vi pod-configmap-volume-specific-key.yaml --- apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: SPECIAL_LEVEL: very SPECIAL_TYPE: charm --- # 使用存储在 ConfigMap 中的数据填充卷 apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh", "-c", "ls /etc/config/" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: # 提供包含要添加到容器中的文件的 ConfigMap 的名称 name: special-config restartPolicy: Never --- # 使用存储在 ConfigMap 中的数据填充卷 apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: k8s.gcr.io/busybox command: [ "/bin/sh","-c","cat /etc/config/keys" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config items: - key: SPECIAL_LEVEL path: keys restartPolicy: Never # 创建容器 kubectl apply -f pod-configmap-volume-specific-key.yaml
接下来,使用上述已讲过的内容,亲自实践部署一个redis容器
cd /opt/yaml/redis cat <example-redis-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: example-redis-config data: redis-config: "" EOF
[root@vm21 yaml]# kubectl apply -f example-redis-config.yaml configmap/example-redis-config created
cd /opt/yaml/redis vi redis-pod.yaml apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis:5.0.4 command: - redis-server - "/redis-master/redis.conf" env: - name: MASTER value: "true" ports: - containerPort: 6379 resources: limits: cpu: "0.1" volumeMounts: - mountPath: /redis-master-data name: data - mountPath: /redis-master name: config volumes: - name: data emptyDir: {} - name: config configMap: name: example-redis-config items: - key: redis-config path: redis.conf
[root@vm21 redis]# kubectl apply -f redis-pod.yaml pod/redis created
[root@vm21 redis]# kubectl get pods -n default NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 2m21s
[root@vm21 redis]# kubectl describe configmap/example-redis-config Name: example-redis-config Namespace: default Labels:Annotations: Data ==== redis-config: ---- BinaryData ==== Events:
[root@vm21 redis]# kubectl exec -it redis -- redis-cli # 查看 maxmemory 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "0" # 查看maxmemory-policy 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "noeviction"
cd /opt/yaml/redis vi example-redis-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: example-redis-config data: redis-config: | maxmemory 2mb maxmemory-policy allkeys-lru
[root@vm21 redis]# kubectl apply -f example-redis-config.yaml configmap/example-redis-config configured
[root@vm21 redis]# kubectl describe configmap/example-redis-config Name: example-redis-config Namespace: default Labels:Annotations: Data ==== redis-config: ---- maxmemory 2mb maxmemory-policy allkeys-lru BinaryData ==== Events:
[root@vm21 redis]# kubectl exec -it redis -- redis-cli 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "0" 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "noeviction" # 配置值未更改,因为需要重新启动 Pod 才能从关联的 ConfigMap 中获取更新的值。
# 删除已有容器 [root@vm21 redis]# kubectl delete pod redis pod "redis" deleted # 重新创建容器 [root@vm21 redis]# kubectl apply -f redis-pod.yaml pod/redis created
[root@vm21 redis]# kubectl exec -it redis -- redis-cli 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "2097152" 127.0.0.1:6379> CONFIG GET maxmemory-policy 1) "maxmemory-policy" 2) "allkeys-lru"
# 清理pod [root@vm21 redis]# kubectl delete -f redis-pod.yaml pod "redis" deleted # 清理configmap [root@vm21 redis]# kubectl delete -f example-redis-config.yaml configmap "example-redis-config" deleted