文章目录
- 一 、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秒)