(五)k8s实战-配置管理

一、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>

使用:
(五)k8s实战-配置管理_第1张图片

案例2:使用文件类型的ConfigMap 添加到指定目录内

(五)k8s实战-配置管理_第2张图片
使用:
(五)k8s实战-配置管理_第3张图片

二、加密数据配置 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 [email protected] --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配置
(五)k8s实战-配置管理_第4张图片

三、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 来禁止修改

你可能感兴趣的:(kubernetes,容器,云原生)