配置存储:ConfigMap、Secret
前言
前面介绍过的各种存储主要都是做数据的持久化,本节介绍的ConfigMap和Secret主要用于配置文件存储,或者环境变量的配置。
ConfigMap
创建ConfigMap后,数据实际会存储在K8s中(Etcd)Etcd,然后通过创建Pod时引用该数据。
应用场景:应用程序配置
Pod使用configmap数据有两种方式:
- 变量注入
- 数据卷挂载
yaml
# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
data:
# 类属性键;每一个键都映射到一个简单的值
abcd: "1234"
cdef: "5678"
# 类文件键
redis.properties: |
port: 6379
host: 192.168.31.10
#configmap pod引用#
apiVersion: v1
kind: Pod
metadata:
name: configmap-demo-pod
spec:
containers:
- name: configmap-pod
image: nginx
env:
- name: ABCD # pod中环境变量 - echo $ABCD
valueFrom:
configMapKeyRef:
name: configmap-demo # 与configmap.name一致
key: abcd # 取值的key
- name: CDEF # pod中环境变量 - echo $CDEF
valueFrom:
configMapKeyRef:
name: configmap-demo # 与configmap.name一致
key: cdef # 取值的key
volumeMounts:
- name: config
mountPath: "/config"
readOnly: true
volumes:
- name: config
configMap:
name: configmap-demo # 与configmap.name一致
# 来自 ConfigMap 的一组键,将被创建为文件
items:
- key: "redis.properties" # 对用configmap的key名称
path: "redis.properties" # 文件名字,/config/redis.properties
bash
# kubectl apply -f configmap.yaml
configmap/configmap-demo created
# kubectl get configmap
NAME DATA AGE
configmap-demo 3 5s
# kubectl apply -f configmap-pod.yaml
pod/configmap-demo-pod configured
# kubectl exec -it configmap-demo-pod -- bash
root@configmap-demo-pod:/# ls /config
redis.properties
root@configmap-demo-pod:/# echo $ABCD
1234
root@configmap-demo-pod:/# echo $CDEF
5678
root@configmap-demo-pod:/# cat /config/redis.properties
port: 6379
host: 192.168.31.10
这里使用了两种挂载方式,环境变量和配置文件。
被挂载的 ConfigMap 内容会被自动更新当卷中使用的 ConfigMap 被更新时,所投射的键最终也会被更新。
Kubelet 组件会在每次周期性同步时检查所挂载的 ConfigMap 是否为最新。Kubelet 使用的是其本地的高速缓存来获得 ConfigMap 的当前值。高速缓存的类型可以通过 KubeletConfiguration 结构,ConfigMapAndSecretChangeDetectionStrategy 字段来配置。
Secret
与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。
应用场景:凭据
kubectl create secret 支持三种数据类型:
- docker-registry:存储镜像仓库认证信息
- generic:从文件、目录或者字符串创建,例如存储用户名密码
- tls:存储证书,例如HTTPS证书
bash
# echo -n 'admin' | base64
YWRtaW4=
# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
yaml
# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-user-pass
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
# cat secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-demo-pod
spec:
containers:
- name: secret-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-dbusername
bash
# kubectl exec -it secret-demo-pod -- bash
root@secret-demo-pod:/# echo $USER $PASS
admin 1f2d1e2e67df
root@secret-demo-pod:/# cat /config/my-dbusername
admin
这里也是使用了两种挂载方式,一种是环境变量,一种是作为文件挂载