一、ConfigMap
使用 kubectl create configmap -h 查看示例,构建 configmap 对象
1) 基于文件夹,加载文件夹下所有配置文件,创建
kubectl create configmap <configmapName> --from-file=<dirPath>
2) 指定配置文件,创建(常用)
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt
--from-file=key2=/path/to/bar/file2.txt
查看
kubectl get cm
查看内容
kubectl describe cm test-env-config
案例1:使用键值对类型的ConfigMap 添加到env文件内
# 创建键值对类型的ConfigMap
kubectl create configmap test-env-config --from-literal=JAVA_OPTS_TEST='-Xms512m -Xmx512m' --from-literal=APP_NAME=springboot-env-test
# 查看键值对内容
kubectl describe cm test-env-config
Name: test-env-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
APP_NAME:
----
springboot-env-test
JAVA_OPTS_TEST:
----
-Xms512m -Xmx512m
BinaryData
====
Events: <none>
使用:
案例2:使用文件类型的ConfigMap 添加到指定目录内
使用:
二、加密数据配置 Secret
与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。
在创建 Secret 时,要注意如果要加密的字符中,包含了有特殊字符,需要使用转义符转移,例如 $ 转移后为 $,也可以对特殊字符使用单引号描述,这样就不需要转移例如 1$289*-! 转换为 ‘1$289*-!’
[root@k8s-master config]# kubectl create secret docker-registry harbor-secret --docker-username=admin --docker-password=wolfcode --docker-email=liugang@wolfcode.cn --docker-server=192.168.100.100:8858
secret/harbor-secret created
[root@k8s-master config]# kubectl describe secret harbor-secretName: harbor-secret
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 137 bytes
[root@k8s-master config]# kubectl edit secret harbor-secret
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyIxOTIuMTY4LjEwMC4xMDA6ODg1OCI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJ3b2xmY29kZSIsImVtYWlsIjoibGl1Z2FuZ0B3b2xmY29kZS5jbiIsImF1dGgiOiJZV1J0YVc0NmQyOXNabU52WkdVPSJ9fX0=
kind: Secret
metadata:
creationTimestamp: "2023-08-24T00:09:20Z"
name: harbor-secret
namespace: default
resourceVersion: "302170"
uid: 28fa824f-34c7-4b40-a472-01e0e33bfcbd
type: kubernetes.io/dockerconfigjson
使用
拉取私有仓库镜像,需要登录用户密码,使用Secret配置
三、SubPath 的使用
使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
配置方式:
定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:
......
volumeMounts:
- mountPath: /etc/nginx/nginx.conf # 挂载到哪里
name: nginx-conf # 使用哪个 configmap 或 secret
subPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:
name: nginx-conf # configMap 名字
items: # subPath 配置
key: nginx.conf # configMap 中的文件名
path: etc/nginx/nginx.conf # subPath 路径
四、配置的热更新
我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?
这得分成几种情况:
1)默认方式:会更新,更新周期是更新时间 + 缓存时间
2)subPath:不会更新
3)变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的
对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置。但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可
热更新的方式:
1)通过 edit 命令直接修改 configmap
kubectl edit cm <configmapName>
2)通过 replace 替换
kubectl create cm --from-file=nginx.conf --dry-run -o yaml | kubectl replace -f-
由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file 参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现
该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换
五、不可变的 Secret 和 ConfigMap
对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改