Configmap存储特点
典型的使用场景
创建ConfigMap的四种方式
1. 使用字面值创建
mkdir configmap
cd configmap/
kubectl create configmap my-cm --from-literal=key1=cm1 --from-literal=key2=cm2 ##字面值创建,有两个键值:key1=cm1、key2=cm2
kubectl get cm ##查看cm
kubectl describe cm my-cm ##查看描述
2. 使用文件创建
kubectl create configmap my-cm1 --from-file=/etc/hosts
kubectl describe cm my-cm1
可见文件名为数据名称,文件内容为数据内容
3. 使用目录创建
mkdir test
cd test
echo 111 > key1
echo 222 > key2
echo 333 > key3
cd ..
kubectl create configmap my-cm2 --from-file=test
kubectl describe cm my-cm2
数据名称为目录中文件的名称,数据内容为文件所对应的内容
4. 编写configmap的yaml文件创建
vim cm1.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm1-config
data:
db_host: "172.25.0.250"
db_port: "3306"
kubectl apply -f cm1.yaml ##应用
kubectl describe cm cm1-config
如何使用configmap
示例使用用yaml文件创建的cm1-config
1. 使用configmap设置环境变量
vim pod1.yaml ##使用指定cm中的数据内容
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 ##指定cm
key: db_host ##指定cm中的数据
- name: key2
valueFrom:
configMapKeyRef:
name: cm1-config
key: db_port
restartPolicy: Never
kubectl apply -f pod1.yaml
kubectl logs pod1 ##查看日志
vim pod1.yaml ##继续编辑,直接指定cm
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: busyboxplus
command: ["/bin/sh", "-c", "env"]
envFrom:
- configMapRef: ##直接指定cm,数据名称即为变量名称
name: cm1-config
restartPolicy: Never
kubectl delete -f pod1.yaml
kubectl apply -f pod1.yaml
kubectl logs pod1
kubectl delete pod pod1
2. 使用conigmap设置命令行参数
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: busyboxplus
command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"] ##直接使用键值
envFrom:
- configMapRef:
name: cm1-config
restartPolicy: Never
kubectl apply -f pod2.yaml
kubectl logs pod2
kubectl delete -f pod2.yaml
3. 通过数据卷使用configmap
vim pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod3
spec:
containers:
- name: pod3
image: busyboxplus
command: ["/bin/sh", "-c", "ls -l /config"] ##执行命令
volumeMounts:
- name: config-volume
mountPath: /config ##容器内的挂载点
volumes:
- name: config-volume
configMap:
name: cm1-config ##要挂德cm
restartPolicy: Never
kubectl apply -f pod3.yaml
kubectl logs pod3
kubectl delete -f pod3.yaml
configmap热更新
以更新nginx的端口为例
vim nginx.conf
server {
listen 8000; ##端口
server_name _;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
kubectl create configmap nginx-conf --from-file=nginx.conf ##以该配置文件创建一个cm
vim nginx.yaml ##将配置文件挂载到nginx的配置文件目录
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d
volumes:
- name: config-volume
configMap:
name: nginx-conf
kubectl apply -f nginx.yaml
kubectl exec my-nginx-8d9fd4fb6-l6kvp -- ls /etc/nginx/conf.d ##在容器中执行ls命令
kubectl exec my-nginx-8d9fd4fb6-l6kvp -- cat /etc/nginx/conf.d/nginx.conf ##在容器中执行cat命令
访问该容器
因为nginx默认为80端口,但配置文件里写的是8000,所以直接访问ip会失败,访问8000端口才可以
kubectl edit cm nginx-conf ##更改cm内容
此nginx容器的配置文件是挂载的nginx-conf(cm),所以容器内文件也会改变(数据可能会有延迟)
现在只是改变了配置文件,若想让更改生效,还需重启服务
kubectl delete pod my-nginx-8d9fd4fb6-l6kvp ##删除pod,因为是控制器,所以会重新拉起一个新的pod。这个过程就相当于重启nginx
再次访问
端口以更改为8080(若不想让客户端访问容器的ip改变,可以创建一个svc调度器,让控制器的pod充当其后端。并且还这样可以暴露外部ip,供外部访问,在这里不再演示。)
除了删除pod,还有另外一个方法可以滚动更新pod
更改cm的数据内容,端口为8010
kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20211026"}}}}}' ##手动更新
再次访问试试
8081端口访问成功