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 支持三种数据类型:

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发生变更时,应用程序自动感知动态加载(需要程序自身支持)

  • 触发滚动更新,即重启服务