K8s存储-----(一)Configmap配置管理
1 Configmap的介绍
Configmap用于保存配置数据,以键值对形式存储;configMap 资源提供了向 Pod 注入配置数据的方法。旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。
典型的使用场景:
- 填充环境变量的值
- 设置容器内的命令行参数
- 填充卷的配置文件
2 创建ConfigMap的方式
2.1 使用字面值创建
(1)创建ConfigMap:
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
(2)查看名为my-config 的 configmap的详细信息:
kubectl describe cm my-config
2.2 使用文件创建
(1)创建ConfigMap:
kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
## key的名称是文件名称,value的值是这个文件的内容
(2)查看名为my-config-2 的 configmap的详细信息:
kubectl describe cm my-config-2
2.3 使用目录创建
(1)创建ConfigMap:
kubectl create configmap my-config-3 --from-file=test
## 目录中的文件名为key,文件内容是value
(2)查看名为my-config-3 的 configmap的详细信息:
kubectl describe cm my-config-3
2.4 编写configmap的yaml文件
(1)编辑yaml文件:vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
- 应用文件:
kubectl create -f cm1.yaml
(2)查看名为cm1-config 的 configmap的详细信息:
kubectl describe cm cm1-config
3 如何使用configmap
3.1 通过环境变量的方式直接传递给pod
(1)使用configmap设置环境变量
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busyboxplus
command: ["/bin/sh", "-c", "env"] ## 打印环境变量
env:
- name: key1
valueFrom: ## 值来自哪
configMapKeyRef:
name: cm1-config
key: db_host
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never ## 运行完结束
(2)应用文件:kubectl apply -f pod1.yml
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 13s
[root@server2 ~]# kubectl logs pod1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod1
SHLVL=1
HOME=/
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
key1=172.25.0.250
key2=3306
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
(3)应用文件创建pod:kubectl apply -f pod2.yml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busybox
command: ["/bin/sh", "-c", "env"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
[root@server2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 0 3m46s
pod2 0/1 Completed 0 6s
[root@server2 ~]# kubectl logs pod2
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod2
SHLVL=1
HOME=/
db_port=3306
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
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
db_host=172.25.0.250
3.2 通过在pod的命令行下运行的方式
(1)应用文件:kubectl apply -f pod3.yml
,创建pod3
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busyboxplus
## 输出变量的值
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
- 查看pod3的日志信息:
kubectl logs pod3
2.3 作为volume的方式挂载到pod内
(1)应用文件:kubectl apply -f pod4.yml
apiVersion: v1
kind: Pod
metadata:
name: pod4
spec:
containers:
- name: pod4
image: busyboxplus
command: ["/bin/sh", "-c", "ls -l /config"]
volumeMounts:
- name: config-volume
mountPath: /config ## 如果容器中没有此目录会创建
volumes:
- name: config-volume
configMap: ## 当挂载名为config-volume映射到cm1-config
name: cm1-config
restartPolicy: Never
- 查看pod4的信息:
kubectl logs pod4
4 configmap热更新
(1)应用文件:kubectl apply -f pod1.yml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busyboxplus
stdin: true
tty: true
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: cm1-config
(2)查看pod的信息:kubectl get pod
- 进入容器的交互界面,读取/congig全部的内容
kubectl attach pod1 -it
(3)编辑cm: kubectl edit cm cm1-config
,修改cm1-config的信息
- 进入容器的交互界面,读取/congig全部的内容:
kubectl attach pod1 -it
,修改并未生效
- configmap热更新后,并不会触发相关Pod的滚动更新,需要手动触发:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginx-conf
vim default.conf
default.conf
server {
listen 8080;
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
创建configmap:kubectl create configmap nginx-config --from-file=default.conf
- 应用文件:
kubectl apply -f demo.yml
- 查看pod的信息:
kubectl get pod
- 查看pod的详细信息:
kubectl describe pod demo-75679c99b4-fs68p
,nginx服务的配置目录成功挂载
测试:
(1)进入容器的shell的交互环境:kubectl exec -it demo-75679c99b4-fs68p -- sh
- 查看nginx服务的端口:cd /etc/nginx/conf.d/
- 查看pod的详细信息:
kubectl get pod -o wide
- 访问容器的8080端口:
curl 10.244.22.16:8080
(2)修改nginx服务的配置文件:kubectl edit cm nginx-config
- 查看nginx-config 的详细信息:
kubectl describe cm nginx-config
- configmap热更新已生效,但访问Pod的8080端口人然可以访问
进入容器的shell的交互环境:kubectl exec -it demo-75679c99b4-fs68p -- sh
(3)解决方法一
- 需要手动触发Pod滚动更新, 这样才能再次加载nginx.conf配置文件
(4) 解决方法2:打补丁
kubectl patch deployments.apps demo --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210219"}}}}}'
- 查看pod的详细信息:
kubectl get pod -o wide
- 测试:
- 查看nginx的配置信息:
kubectl edit cm nginx-config
- 查看 nginx-config的详细信息:
kubectl describe cm nginx-config
- 删除pod:
kubectl delete pod demo-5756f5b97-hwhlm
,控制器会生成新的pod