文章目录

  • 一 、configMap
  • 1.使用目录创建
  • 查看效果
  • 2.使用文件创建
  • 3.使用字面值创建
  • 4.使用configmap中的数值来定义容器的环境变量
  • 演示效果
  • 5.用configmap设置命令行参数
  • 演示效果
  • 6.通过数据卷插件使用configmap
  • 演示效果
  • 7.configMap的热更新
  • 查看效果
  • 8.ConfigMap更新后滚动更新pod


一 、configMap

许多应用程序会从配置文件 、命令行参数或者环境变量中读取配置信息,configMap api给我们提供了向容器中注入配置信息的机制,configMap可以用来保持单个属性,也可以用来保持多个配置文件。

1.使用目录创建

–from-file:指定在目录下所有文件都会被用在configMap里面创建一个键值对,键的名字就是文件名,值就是文件的内容。

[root@k8s-master-01 configmap]# vim game.properties 

enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBAS
secret.code.allowed=true
secret.code.lives=30


[root@k8s-master-01 configmap]# vim ui.properties 

color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
查看效果
[root@k8s-master-01 mnt]# kubectl create configmap game.conf --from-file=./configmap/
configmap/game.conf created
[root@k8s-master-01 mnt]# kubectl get configmaps 
NAME               DATA   AGE
game.conf          2      8s
kube-root-ca.crt   1      20d
[root@k8s-master-01 mnt]# kubectl get configmaps game.conf 
NAME        DATA   AGE
game.conf   2      83s
[root@k8s-master-01 mnt]# kubectl get configmaps game.conf -o yaml
apiVersion: v1
data:
  game.properties: |+
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBAS
    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: "2021-12-25T06:10:29Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:game.properties: {}
        f:ui.properties: {}
    manager: kubectl-create
    operation: Update
    time: "2021-12-25T06:10:29Z"
  name: game.conf
  namespace: default
  resourceVersion: "425995"
  uid: da26013e-febd-4bab-b3d1-b2c3f9607633

2.使用文件创建

–from-file:这个参数可以使用多次,你可以使用两次分别指定上个实例中的两个配置文件,效果和指定目录是一样的。

[root@k8s-master-01 mnt]# kubectl create configmap game-conf2 --from-file=./configmap/game.properties 
configmap/game-conf2 created
[root@k8s-master-01 mnt]# kubectl get configmaps 
NAME               DATA   AGE
game-conf2         1      8s
game.conf          2      5m29s
kube-root-ca.crt   1      20d
[root@k8s-master-01 mnt]# kubectl get configmaps game-conf2 
NAME         DATA   AGE
game-conf2   1      14s
[root@k8s-master-01 mnt]# kubectl get configmaps game-conf2 -o yaml
apiVersion: v1
data:
  game.properties: |+
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBAS
    secret.code.allowed=true
    secret.code.lives=30


kind: ConfigMap
metadata:
  creationTimestamp: "2021-12-25T06:15:50Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:game.properties: {}
    manager: kubectl-create
    operation: Update
    time: "2021-12-25T06:15:50Z"
  name: game-conf2
  namespace: default
  resourceVersion: "426491"
  uid: 626801e3-c6af-444c-9449-a4ad84e60654

3.使用字面值创建

使用文字值创建,利用–from-literal 参数传递配置信息,该参数可以使用多次。

[root@k8s-master-01 mnt]# kubectl create configmap specila-config --from-literal=specila.how=very --from-literal=specila.type=charm
configmap/special-config created
[root@k8s-master-01 mnt]# kubectl get configmaps 
NAME               DATA   AGE
game-conf2         1      3m34s
game.conf          2      8m55s
kube-root-ca.crt   1      20d
special-config     2      5s
[root@k8s-master-01 mnt]# kubectl get configmaps special-config 
NAME             DATA   AGE
special-config   2      12s
[root@k8s-master-01 mnt]# kubectl get configmaps special-config  -o yaml
apiVersion: v1
data:
  special.type: charm
  specila.how: very
kind: ConfigMap
metadata:
  creationTimestamp: "2021-12-25T06:19:19Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:special.type: {}
        f:specila.how: {}
    manager: kubectl-create
    operation: Update
    time: "2021-12-25T06:19:19Z"
  name: special-config
  namespace: default
  resourceVersion: "426813"
  uid: 64a641ae-860f-4dc5-be6f-3e6d83b8eda4
[root@k8s-master-01 mnt]# kubectl describe configmaps special-config 
Name:         special-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
special.type:
----
charm              #键值
specila.how:       #键名
----
very
Events:  <none>

4.使用configmap中的数值来定义容器的环境变量

[root@k8s-master-01 mnt]# vim env-config.yaml 

apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
~     



---
[root@k8s-master-01 mnt]# vim env-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: nginx
      command: [ "/bin/sh","-c","env"]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: specila-config
              key: specila.how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: specila-config
              key: specila.type
      envFrom:
        - configMapRef:
            name: env-config
  restartPolicy: Never
~
演示效果
[root@k8s-master-01 mnt]# kubectl get cm
NAME               DATA   AGE
env-config         1      34m
game-conf2         1      3h16m
game.conf          2      3h21m
kube-root-ca.crt   1      20d
specila-config     2      35m
[root@k8s-master-01 mnt]# kubectl describe cm specila-config 
Name:         specila-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

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

[root@k8s-master-01 mnt]# kubectl apply -f env-pod.yaml 
pod/dapi-test-pod created
[root@k8s-master-01 mnt]# kubectl get pods
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          8m52s
[root@k8s-master-01 mnt]# kubectl logs dapi-test-pod
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=dapi-test-pod
HOME=/root
PKG_RELEASE=1~bullseye
SPECIAL_TYPE_KEY=charm
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.21.4
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.7.0
KUBERNETES_PORT_443_TCP_PROTO=tcp
SPECIAL_LEVEL_KEY=very
log_level=INFO
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

5.用configmap设置命令行参数

apiVersion: v1
kind: ConfigMap
metadata:
  name: specila-config
  namespace: default
data:
  specila.how: very
  specila.type: charm


---
[root@k8s-master-01 mnt]# vim env-1.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-pod
      image: nginx
      command: [ "/bin/sh","-c","echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: specila-config
              key: specila.how
        - name: SPECIAL_TYPE_KEY
          valueFrom:
            configMapKeyRef:
              name: specila-config
              key: specila.type
  restartPolicy: Never
演示效果
[root@k8s-master-01 mnt]# kubectl get cm
NAME               DATA   AGE
env-config         1      54m
game-conf2         1      3h36m
game.conf          2      3h41m
kube-root-ca.crt   1      20d
specila-config     2      54m
[root@k8s-master-01 mnt]# kubectl apply -f env-1.yaml 
pod/test-pod created

[root@k8s-master-01 mnt]# kubectl get pods
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          32m
test-pod        0/1     Completed   0          9s
[root@k8s-master-01 mnt]# kubectl logs test-pod
very charm

6.通过数据卷插件使用configmap

apiVersion: v1
kind: ConfigMap
metadata:
  name: specila-config
  namespace: default
data:
  specila.how: very
  specila.type: charm


在数据卷里面使用configmap,有不同的选项,最基本的就是将文件填入到数据卷中,键是文件名,键值是文件内容。

---
apiVersion: v1
kind: Pod
metadata:
  name: dapi-pod
spec:
  containers:
    - name: test-pod11
      image: nginx
      command: [ "/bin/sh","-c","sleep 600" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: specila-config
  restartPolicy: Never
演示效果
[root@k8s-master-01 mnt]# kubectl get pods
NAME            READY   STATUS      RESTARTS   AGE
dapi-pod        1/1     Running     0          24s
dapi-test-pod   0/1     Completed   0          43m
test-pod        0/1     Completed   0          11m
[root@k8s-master-01 mnt]# kubectl exec -it dapi-pod -- /bin/sh
# cd /etc/config
# ls
specila.how  specila.type
# cat specila.how
very
# cat specila.type
charm# 
# 
#

7.configMap的热更新

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
  namespace: default
data:
  log_level: INFO

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      name: my-nginx
  template:
    metadata:
      labels:
        name: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: wangyanglinux/myapp:v1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: log-config
查看效果
[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# 
[root@k8s-master-01 mnt]# 
[root@k8s-master-01 mnt]# 
[root@k8s-master-01 mnt]# kubectl get cm
NAME               DATA   AGE
kube-root-ca.crt   1      51m
log-config         1      6m2s

#修改configmap
[root@k8s-master-01 mnt]# kubectl edit cm log-config 
configmap/log-config edited

#查看info----》debug的
[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level


INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
INFO[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
DEBUG[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
DEBUG[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_level
DEBUG[root@k8s-master-01 mnt]# kubectl exec -it my-nginx-76b6998ccc-vbk72 -- cat /etc/config/log_leve

注意:configmap更新后并不会让pod重载这个文件

特别注意:configmap如果以env的方式挂载到容器,修改configmap并不会实现热更新

8.ConfigMap更新后滚动更新pod

更新ConfigMap后目前并不会触发pod的滚动更新,可以通过修改pod annotations 的方式强制触发滚动更新。

kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {metadta: {"annotations": {version/config": "20190411"}}}}}'


20190411:代表时间

这个例子里我们在.`spec.template.metadata.annotations`中添加`version/config`,每次通过修改`version/config`来触发滚动更新。


注意:
更新ConfigMap后:
使用改ConfigMap挂载的`env`不会同步更新

使用ConfigMap挂载的`volume`中的数据需要一段时间才能同步更新(10秒)