一,configmao 简介
ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制大对象
使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性
二,使用 ConfigMap 的限制条件
ConfigMap 需要在 Pod 启动前创建出来。
只有当 ConfigMap 和 Pod 处于同一 NameSpace(命名空间)时,Pod 才可以引用它。
当 Pod 对 ConfigMap 进行挂载(VolumeMount)操作时,在容器内部只能挂载为目录,并不能挂载为文件。
同时,当挂载已经存在的目录时,且目录内含有其它文件,ConfigMap 会将其覆盖掉。
三,configmap 的三种创建方式
1)使用目录创建
kubectl create configmap nginx-html --from-file=/etc/nginx/html
--from-file:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。
2)使用文件创建
[root@localhost ~]# kubectl create configmap index-html --from-file=/etc/nginx/html/index.html
在创建时,可以使用多个 --from-file 命令;
如:kubctl create configmap index-html --from-file=1.txt --from-file=2.txt
3)使用字面值创建
kubectl create configmap dashboard
--from-literal=dashboard.username=root --from-literal=dashboard.password=123123
使用文字值创建,利用 —from-literal 参数传递配置信息,该参数可以使用多次
一般来说使用文件创建的方法用的还是比较多的;因为某些场景下可能需要将配置文件,挂载到容器内部。当然,我们也可以使用数据卷挂载的方式,来实现容器与配置文件的解耦。
四,使用pod配置configmap的三种方式
1)使用 ConfigMap 来替代环境变量
指的是针对于该pod的环境变量
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: nginx:alpine
command: [ "/bin/sh", "-c", "env" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.how
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
envFrom:
- configMapRef:
name: env-config
restartPolicy: Never
2) 用 ConfigMap 设置命令行参数
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
3) 通过数据卷插件使用ConfigMap
在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod11
spec:
containers:
- name: test-container
image: nginx:alpine
command: [ "/bin/sh", "-c", "sleep 900" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: special-config
restartPolicy: Never
更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新
kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations":
{"version/config": 20190411" }}}}}'
我们在 .spec.template.metadata.annotations 中添加 version/config ,每次通过修改
version/config 来触发滚动更新
!!! 更新 ConfigMap 后:
使用该 ConfigMap 挂载的 Env 不会同步更新
使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新
五,secret
Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret 可以以 Volume 或者环境变量的方式使用
Secret 有三种类型:
Service Account :用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod 的/run/secrets/kubernetes.io/serviceaccount 目录中
Opaque :base64编码格式的Secret,用来存储密码、密钥等
kubernetes.io/dockerconfigjson :用来存储私有 docker registry 的认证信息
六,secret的三种类型创建方式
1) Service Account 用来访问 Kubernetes API,由 Kubernetes 自动创建,并且会自动挂载到 Pod的 /run/secrets/kubernetes.io/serviceaccount 目录中
$kubectl exec nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
2) Opaque Secret
Opaque 类型的数据是一个 map 类型,要求 value 是 base64 编码格式:
$ echo -n "admin" | base64
YWRtaW4=
$ echo -n "1f2d1e2e67df" | base64
MWYyZDFlMmU2N2Rm
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
username: YWRtaW4=
七,secret的使用方式
1、将 Secret 挂载到 Volume 中
在Pod中以文件的形式使用secret
- 创建一个Secret,多个Pod可以引用同一个Secret
- 修改Pod的定义,在
spec.volumes[]
加一个volume,给这个volume起个名字,spec.volumes[].secret.secretName
记录的是要引用的Secret名字 - 在每个需要使用Secret的容器中添加一项
spec.containers[].volumeMounts[]
,指定spec.containers[].volumeMounts[].readOnly = true
,spec.containers[].volumeMounts[].mountPath
要指向一个未被使用的系统路径。 - 修改镜像或者命令行使系统可以找到上一步指定的路径。此时Secret中
data
字段的每一个key都是指定路径下面的一个文件名
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
2,以环境变量的形式使用Secret
- 创建一个Secret,多个Pod可以引用同一个Secret
- 修改pod的定义,定义环境变量并使用
env[].valueFrom.secretKeyRef
指定secret和相应的key - 修改镜像或命令行,让它们可以读到环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
在容器中可以读取环境变量
$ echo $SECRET_USERNAME
admin
$ echo $SECRET_PASSWORD
1f2d1e2e67df
八,区别
secret功能和configmap一样,只不过secret配置中心存储的配置文件不是明文的,一般将连接数据库的密码、私钥等写在secret中