Kubernetes 中用于配置的资源对象——ConfigMap/Secret
一、存在背景
- 配置的必要性。在软件世界里,基本上所有的应用或者服务都需要配置文件来管理服务的一些关键配置,方便应用的维护和管理。不管是我们的前端、后端,还是缓存、数据库、消息队列等。
- Kubernetes 中将所有要管理的目标都为其创建了相应的 API 资源对象。服务配置对应的资源对象就是 ConfigMap/Secret。这两种资源对象分别是为了管理明文配置和加密配置。
- ConfigMap/Secret 资源对象的必要性。我们虽然可以通过直接将配置文件打包进镜像的方式使用配置文件,但是对于配置的修改和管理很不方便,也违背一切资源对象化的设计理念。
二、明文配置对象 ConfigMap
2.1 创建 ConfigMap
资源对象文件模版
在linux 终端中执行以下命令获取 ConfigMap
资源对象文件模版:
kubectl create cm test-cm --from-literal=k=v --dry-run=client -o yaml
然后可以在当前目录下得到了一个configMap
资源对象在 yaml 文件中的定义。
–from-literal 选项表示在资源对象模版文件的生成要包含具体数据
2.2 ConfigMap
资源对象定义
apiVersion: v1 # ConfigMap资源对象版本
kind: ConfigMap
metadata:
name: test-cm
data: # 开始定义具体的配置数据
port: '8080'
database: 'mysql'
path: '/opt/source/api'
saying: |
hello, code slave.
2.3 创建、观察 ConfigMap
资源对象
使用以下命令创建、观察ConfigMap
资源对象:
kubectl apply -f test-cm.yaml # 创建该yaml文件中定义的configmap
kubectl get cm test-cm # 获取configmap配置信息
kubectl describe cm test-cm # 获取configmap详细状态信息
三、加密配置对象 Secret
Secret
资源对象包含了下面4个更精细的子类别,我们先来看一般类型机密信息。
- 用于私有镜像仓库的认证信息;
- 身份认证的凭证信息;
- HTTPS协议需要的证书和私钥;
- 一般类型的机密信息,如账号密码等;
3.1 创建Secret
资源对象模版文件
kubectl create secret generic test-secret --from-literal=key=value --dry-run=client -o yaml
然后可以在当前目录下得到了一个secret
资源对象在 yaml 文件中的定义。
3.2 Secret
资源对象定义
除了在创建模版文件时指定的配置外,自己又额外的添加了2个配置项;
apiVersion: v1
kind: Secret
metadata:
name: test-secret
data:
key: dmFsdWU= # value
port: ODA4MA== # 8080
pwd: MTIzNDU2 # 123456
同时我们要注意,我们传入的的key-value对中的 value 被以 base64
编码的形式保存在文件中。所以,我们在手动编写是也可以直接使用 echo -n {encode_content} | base64
命令编码后复制到文件。
3.3 创建、观察Secret
资源对象
使用如下命令创建、观察Secret
资源对象:
kubectl apply -f test-Secret.yaml # 创建该yaml文件中定义的configmap
kubectl get Secret test-Secret # 获取configmap配置信息
kubectl describe Secret test-Secret # 获取configmap详细状态信息
四、如何使用ConfigMap
和 Secret
我们使用ConfigMap
和 Secret
的场景一般有2种,一种是在创建环境变量时,引用他们其中的值;一种是在创建数据卷时,在数据卷中引用他们。
4.1 在创建环境变量时引用
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- env:
- name: PORT
valueFrom: #指定环境变量值的来源,可以是configMapKeyRef或secretKeyRef
configMapKeyRef: #表示环境变量值来自configmap
name: test-cm # 指定使用哪一个configmap对象
key: port # 指定该configmap对象下哪个key对应的值
- name: PASSWORD
valueFrom:
secretKeyRef: #表示环境变量值来自secret
name: test-secret # 指定使用哪一个secret对象
key: pwd # 指定该secret对象下哪个key对应的值
image: busybox
name: busy
imagePullPolicy: IfNotPresent
command: ["/bin/sleep", "1000"]
在将该pod运行起来后,我们可以进入该Pod 查看环境变量是否生效:
进入pod:
kubectl exec -it test-pod -- sh
查看环境变量:
echo $PORT
4.2 在创建的数据卷中引用
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
volumes: # 在该Pod中定义2个数据卷
- name: cm-vol #定义一个名为cm-vol的数据卷
configMap: # 该数据卷引用了一个configMap
name: test-cm #引用的configMap名为test-cm
- name: secret-vol #定义一个名为secret-vol的数据卷
secret: # 该数据卷引用了一个secret
secretName: test-secret #引用的configMap名为test-secret
containers:
- volumeMounts: #该Pod绑定了2个数据卷
- mountPath: /home/app/cm-conf #第一个数据卷的绑定路径
name: cm-vol # 引用的数据卷
- mountPath: /home/app/sec-conf
name: sec-vol
image: busybox
name: busy
imagePullPolicy: IfNotPresent
command: ["/bin/sleep", "1000"]
在该Pod 运行起来之后,我们可以进入该Pod 内部,在数据卷的绑定目录下,查看数据卷的具体情况。
kubectl apply -f pod-volume.yaml # 运行文件中定义的Pod
kubectl exec -it pod-volume -- sh # 使用该命令进入Pod
cd /home/app/cm-conf #到数据卷cm-vol挂载的目录下
我们可以看到,在数据卷下,每一项配置都变成一个文件。