配置管理中心 configmap
configmap 注入方式有两种:1.一种将 configMap 做为存储卷。2.一种是将 configMap 通过 env 中 configMapKeyRef 注入到容器中
1.创建
1.1-命令行直接创建
[root@xksmaster1 02_Service]# kubectl create configmap tomcat-config --from-literal=tomcat_port=8080 --from-literal=server_name=myapp.tomcat.com configmap/tomcat-config created [root@xksmaster1 02_Service]# kubectl describe cm tomcat-config Name: tomcat-config Namespace: default Labels: <none> Annotations: <none> Data ==== server_name: ---- myapp.tomcat.com tomcat_port: ---- 8080 Events: <none>
1.2-通过文件创建 configmap
[root@xksmaster1 03_ConfigMap]# vim nginx.conf [root@xksmaster1 03_ConfigMap]# kubectl create configmap www-nginx --from-file=www=./nginx.conf configmap/www-nginx created [root@xksmaster1 03_ConfigMap]# kubectl describe configmap www-nginx Name: www-nginx Namespace: default Labels: <none> Annotations: <none> Data ==== www: ---- server { server_name www.nginx.com; listen 80; root /home/nginx/www/ } Events: <none> You have new mail in /var/spool/mail/root
1.3-指定目录创建 configmap
[root@xksmaster1 03_ConfigMap]# mkdir configmap_dir [root@xksmaster1 03_ConfigMap]# cd configmap_dir/ [root@xksmaster1 configmap_dir]# vim my-server.cnf
server-id=1 [root@xksmaster1 configmap_dir]# vim my-slave.cnf
server-id=2 [root@xksmaster1 configmap_dir]# pwd /root/K8S/03_ConfigMap/configmap_dir [root@xksmaster1 configmap_dir]# kubectl create configmap mysql-config --from-file=/root/K8S/03_ConfigMap/configmap_dir configmap/mysql-config created [root@xksmaster1 configmap_dir]# kubectl describe configmap mysql-config Name: mysql-config Namespace: default Labels: <none> Annotations: <none> Data ==== my-server.cnf: ---- server-id=1 my-slave.cnf: ---- server-id=2 Events: <none>
1.4-编写 configmap 资源清单 YAML 文件
[root@xksmaster1 configmap_dir]# vim mysql-configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: mysql labels: app: mysql data: master.cnf: | [mysqld] log-bin log_bin_trust_function_creators=1 lower_case_table_names=1 slave.cnf: | [mysqld] super-read-only log_bin_trust_function_creators=1
[root@xksmaster1 configmap_dir]# kubectl apply -f mysql-configmap.yaml
configmap/mysql created
[root@xksmaster1 configmap_dir]# kubectl describe configmap mysql
Name: mysql
Namespace: default
Labels: app=mysql
Annotations: <none>
Data
====
master.cnf:
----
[mysqld]
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
slave.cnf:
----
[mysqld]
super-read-only
log_bin_trust_function_creators=1
Events: <none>
2.使用ConfigMap
2.1 通过环境变量引入:使用 configMapKeyRef
[root@xksmaster1 03_ConfigMap]# kubectl apply -f mysql-configmap2.yaml configmap/mysql unchanged [root@xksmaster1 03_ConfigMap]# kubectl describe cm mysql Name: mysql Namespace: default Labels: app=mysql Annotations: <none> Data ==== log: ---- 1 lower: ---- 1 Events: <none>
[root@xksmaster1 03_ConfigMap]# vim mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
spec:
containers:
- name: mysql
image: busybox
command: [ "/bin/sh", "-c", "sleep 3600" ]
env:
- name: log_bin #定义环境变量 log_bin
valueFrom:
configMapKeyRef:
name: mysql #指定 configmap 的名字
key: log #指定 configmap 中的 key
- name: lower #定义环境变量 lower
valueFrom:
configMapKeyRef:
name: mysql
key: lower
restartPolicy: Never
[root@xksmaster1 03_ConfigMap]# kubectl apply -f mysql-pod.yaml pod/mysql-pod created [root@xksmaster1 03_ConfigMap]# kubectl get pods NAME READY STATUS RESTARTS AGE demo-pod 2/2 Running 46 41h dig 1/1 Running 17 17h my-nginx-69f769d56f-zfw92 1/1 Running 0 17h my-nginx-69f769d56f-zjg5r 1/1 Running 0 17h mysql-pod 1/1 Running 0 78s [root@xksmaster1 03_ConfigMap]# kubectl exec -it mysql-pod sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # printenv | grep log log_bin=1 / # printenv | grep lower lower=1
2.2 通过环境变量引入:使用 envfrom
vim mysql-pod-envfrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod-envfrom
spec:
containers:
- name: mysql
image: busybox
imagePullPolicy: IfNotPresent
command: [ "/bin/sh", "-c", "sleep 3600" ]
envFrom:
- configMapRef:
name: mysql #指定 configmap 的名字
restartPolicy: Never
[root@xksmaster1 03_ConfigMap]# kubectl apply -f mysql-pod-envfrom.yaml pod/mysql-pod-envfrom created [root@xksmaster1 03_ConfigMap]# kubectl exec -it mysql-pod-envfrom -- /bin/sh / # printenv | grep log log=1 / # printenv | grep lower lower=1
2.3 把 configmap 做成 volume,挂载到 pod
[root@xksmaster1 03_ConfigMap]# vim mysql-configmap-volume.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config-volume
labels:
app: mysql
data:
log: "1"
lower: "1"
my.cnf: |
[mysqld]
Welcome=xks
[root@xksmaster1 03_ConfigMap]# kubectl apply -f mysql-configmap-volume.yaml configmap/mysql-config-volume created
[root@xksmaster1 03_ConfigMap]# vim mysql-pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod-volume
spec:
containers:
- name: mysql
image: busybox
command: [ "/bin/sh","-c","sleep 3600" ]
volumeMounts:
- name: mysql-config
mountPath: /tmp/config
volumes:
- name: mysql-config
configMap:
name: mysql-config-volume
restartPolicy: Never
[root@xksmaster1 03_ConfigMap]# kubectl apply -f mysql-pod-volume.yaml pod/mysql-pod-volume created [root@xksmaster1 03_ConfigMap]# kubectl get pod NAME READY STATUS RESTARTS AGE demo-pod 2/2 Running 46 42h dig 1/1 Running 18 18h my-nginx-69f769d56f-zfw92 1/1 Running 0 18h my-nginx-69f769d56f-zjg5r 1/1 Running 0 18h mysql-pod 1/1 Running 0 58m mysql-pod-envfrom 1/1 Running 0 11m mysql-pod-volume 1/1 Running 0 50s [root@xksmaster1 03_ConfigMap]# kubectl exec -it mysql-pod-volume -- /bin/sh / # cd /tmp/config/ /tmp/config # ls log lower my.cnf /tmp/config # cat my.cnf [mysqld] Welcome=xks /tmp/config # cat log /tmp/config # cat lower 1/tmp/config #
3. Configmap 热更新
kubectl edit configmap mysql
更新 ConfigMap 后:
使用该 ConfigMap 挂载的 env 、envFrom 不会同步更新。
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概 10 秒)才能同 步更新。