管理应用程序配置
769字约3分钟
2024-09-29
ConfigMap
创建ConfigMap后,数据实际会存储在K8s中Etcd,然后通过创建Pod时引用该数据。
应用场景:应用程序配置
Pod使用configmap数据有两种方式:
变量注入
数据卷挂载
两种数据类型:
键值
多行数据
#解释
apiVersion: v1
kind: Pod
metadata:
#pod的名字
name: configmap-demo-pod
spec:
containers:
- name: demo
image: alpine
#用进程夯筑容器不让它退出
command: ["sleep", "3600"]
env:
# 定义环境变量
# 请注意这里和 ConfigMap中的键名是不一样的(自定义键的名字)
- name: ABC
valueFrom:
configMapKeyRef:
# 这个值来自 ConfigMa(comfigmap的名字)
name: configmap-demo
# 需要取值的键
key: abc
- name: CDE
valueFrom:
configMapKeyRef:
name: configmap-demo
key: cde
volumeMounts:
#引用下面数据卷的名字
- name: config
#挂载到容器中哪个目录下(一般是指你的应用程序配置文件存放目录)
mountPath: "/config"
readOnly: true
volumes:
# 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
- name: config #数据卷的名字
configMap:
# 提供你想要挂载的 ConfigMap 的名字
name: configmap-demo
# 来自 ConfigMap 的一组键,将被创建为文件
items:
- key: "redis.properties"
path: "redis.properties" #挂载到/config目录下的文件名
vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
data:
abc: "123"
cde: "456"
redis.properties: |
port: 6379
host: 192.168.0.11
vim configmap-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: demo
image: nginx
env:
- name: ABC
valueFrom:
configMapKeyRef:
name: configmap-demo
key: abc
- name: CDE
valueFrom:
configMapKeyRef:
name: configmap-demo
key: cde
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
configMap:
name: configmap-demo
items:
- key: "redis.properties"
path: "redis.properties"
验证查看
kubectl apply -f configmap.yaml
kubectl apply -f configmap-demo-pod.yaml
kubectl get configmaps
kubectl exec -it configmap-demo-pod -- bash #进入pod中测试是否注入变量和挂载
#echo $ABC
#echo $CDE
#ls /config/
参考链接:https://kubernetes.io/zh/docs/concepts/configuration/configmap/
Secret
与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。
应用场景:凭据
kubectl create secret 支持三种数据类型:
docker-registry(kubernetes.io/dockerconfigjson):存储镜像仓库认证信息
generic(Opaque):存储密码、密钥等
tls(kubernetes.io/tls):存储TLS证书
Pod使用Secret数据与ConfigMap方式一样。
第一步:将用户名密码进行编码
[root@k8s-node1 ~]# echo -n 'admin' |base64
YWRtaW4=
[root@k8s-node1 ~]# echo -n '123.com' |base64
MTIzLmNvbQ==
第二步:将编码后值放到Secret
vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque
data:
username: YWRtaW4=
password: MTIzLmNvbQ==
vim secret-demo-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-demo-pod
spec:
containers:
- name: demo
image: nginx
env:
- name: USER
valueFrom:
secretKeyRef:
name: db-user-pass
key: username
- name: PASS
valueFrom:
secretKeyRef:
name: db-user-pass
key: password
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
secret:
secretName: db-user-pass
items:
- key: username
path: my-username
- key: password
path: my-password
验证查看
kubectl apply -f secret.yaml
kubectl apply -f secret-demo-pod.yaml
kubectl get secrets
kubectl exec -it secret-demo-pod -- bash #进入pod中测试是否注入变量和挂载
#echo $USER
#echo $PASS
#ls /config/
参考链接:https://kubernetes.io/zh/docs/concepts/configuration/secret/
应用程序如何动态更新配置
应用程序动态更新配置方案:
当ConfigMap发生变更时,应用程序自动感知动态加载(需要程序自身支持)
触发滚动更新,即重启服务