配置与存储 —— 配置管理

一、ConfigMap(明文数据配置)

一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。

一)创建 configmap 对象

使用 kubectl create configmap -h 查看示例,构建 configmap 对象

# 在当前目录创建test目录,并在下面创建 db.properties,内容
# username=root
# password=admin
# 1、基于文件夹的方法:在当前目录执行下列命令,并指定 --from-file 为 test/ 文件夹
kubectl create configmap test-dir-config --from-file=test/
# 2、基于文件的方法(常用)
kubectl create configmap spring-boot-test-yaml --from-file=/var/docker/k8s/config/application.yaml
kubectl create configmap spring-boot-test-alises-yaml --from-file=app.yml=/var/docker/k8s/config/application.yaml
kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
# 3、基于键值对
kubectl create configmap test-key-value-config --from-literal=username=root --from-literal=passwork=admin

二)使用 ConfigMap

1. 加载指定 configMap 的环境变量的形式

apiVersion: v1
kind: Pod
metadata:
  name: test-env-po
spec:
  restartPolicy: Never
  containers:
    - name: env-test
      image: alpine
      command: ["/bin/sh","-c","env;sleep 3600"]
      imagePullPolicy: IfNotPresent
      env:
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config   # configMap的名字
            key: JAVA_OPTS_TEST     # 表示从 name的 configMap 中获取名字为 key 的 value,将其赋值给本地环境变量 JAVA_VM_OPTS
      - name: APP
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            key: APP_NAME

2. 挂载数据卷的形式

apiVersion: v1
kind: Pod
metadata:
  name: test-configfile-po
spec:
  restartPolicy: Never
  containers:
    - name: config-test
      image: alpine
      command: ["/bin/sh","-c","sleep 3600"]
      imagePullPolicy: IfNotPresent
      volumeMounts:  # 加载数据卷
      - name: db-config    # 表示加载 volumes 属性中哪个数据卷
        mountPath: "/usr/local/mysql/conf"    # 想要将数据卷中的文件加载到哪个目录下
        readOnly: true  # 是否只读
  volumes:       # 数据卷挂载,比如:configmap 和 secret
    - name: db-config    # 数据卷的名字
      configMap:         # 数据卷对应的类型为 ConfigMap
        name: test-dir-config     # configMap 的名字,必须和想要加载的 ConfigMap 相同
        items:   # 将 configMap中的key进行映射,如果不指定,默认将configMap中所有key全部转换为一个个同名的文件
        - key: "db.properties"     # configMap中的key
          path: "db.properties"    # 将该key的值转换为文件

二、Secret(加密数据配置)

与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。
在创建 Secret 时,要注意如果要加密的字符中,包含了有特殊字符,需要使用转义符转移,例如 $ 转移后为 $,也可以对特殊字符使用单引号描述,这样就不需要转移例如 1$289-! 转换为 '1$289-!'

一)创建

# base64,基于值的方法创建,默认是通过Base64进行编码“加密”
kubectl create secret generic orig-secret --from-literal=username=admin --from-literal=password=sfdwertwe
# docker-registry,基于docker仓库的方式创建,也是一个Base64
kubectl create secret docker-registry harbor-secret --docker-username=admin --docker-password=Harbor12345 --docker-email=123@163.com
# tls,基于https加密算法生成的

二)使用

1、创建harbor

使用https启动

2、基于docker仓库的方式创建 secret 资源

# 默认docker仓库地址
kubectl create secret docker-registry harbor-secret --docker-username=admin --docker-password=Harbor12345 --docker-email=123@163.com
# 指定仓库地址
kubectl create secret docker-registry harbor-secret --docker-username=admin --docker-password=Harbor12345 --docker-email=123@163.com --docker-server=192.168.52.14:8858

3、将 nginx 上传到 harbor

已准备有nginx镜像

# 1、为nginx镜像打标签
docker tag nginx:1.9.1 192.168.52.14:8858/opensource/nginx:1.9.1

# 2、登录harbor仓库(需要harbor使用https启动)
docker login -uadmin 192.168.52.14:8858
>> 输入harbor密码

# 3、上传私有镜像
docker push 192.168.52.14:8858/opensource/nginx:1.9.1

# 4、删除镜像
docker rmi 192.168.52.14:8858/opensource/nginx:1.9.1

# 5、docker退出
docker logout

docker退出后,再pull会报权限错误。
而且我们想创建一个 pod 基于 192.168.52.14:8858/opensource/nginx:1.9.1,就会创建失败
这里 我们可以使用 imagePullSecrets 来配置登录 docker registry仓库的 secret

apiVersion: v1
kind: Pod
metadata:
  name: private-image-pull-pod
spec:
  imagePullSecrets:    # 配置登录docker registry 仓库的 secret!!!!!!!!!!!!!!!!!!!
  - name: harbor-secret
  restartPolicy: Never
  containers:
    - name: nginx
      image: 192.168.52.14:8858/opensource/nginx:1.9.1   # 这个是刚刚上传到harbor的私有镜像
      command: ["/bin/sh","-c","sleep 3600"]
      imagePullPolicy: IfNotPresent
      env:
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config   # configMap的名字
            key: JAVA_OPTS_TEST     # 表示从 name的 configMap 中获取名字为 key 的 value,将其赋值给本地环境变量 JAVA_VM_OPTS
      - name: APP
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            key: APP_NAME
      volumeMounts:  # 加载数据卷
      - name: db-config    # 表示加载 volumes 属性中哪个数据卷
        mountPath: "/usr/local/mysql/conf"    # 想要将数据卷中的文件加载到哪个目录下
        readOnly: true  # 是否只读
  volumes:       # 数据卷挂载,比如:configmap 和 secret
    - name: db-config    # 数据卷的名字
      configMap:         # 数据卷对应的类型为 ConfigMap
        name: test-dir-config     # configMap 的名字,必须和想要加载的 ConfigMap 相同
        items:   # 将 configMap中的key进行映射,如果不指定,默认将configMap中所有key全部转换为一个个同名的文件
        - key: "db.properties"     # configMap中的key
          path: "db.properties"    # 将该key的值转换为文件

这里再 kubectl create -f private-image-pull-pod.yaml 就是创建成功,是重新从 harbor 拉取的 192.168.52.14:8858/opensource/nginx:1.9.1 镜像。

三、SubPath 的使用

使用 ConfigMap 或 Secret 挂载到目录或者文件时,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath

配置方式:

  1. 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
  2. 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:
  ......
  volumeMounts:      # 挂载数据卷
  - name: config-volume    # 数据卷名称
    mountPath: /etc/nginx/nginx.conf      # 挂载的路径
    subPath: etc/nginx/nginx.conf         # 与 volumes.[0].items.path 相同
volumes:   # 数据卷定义
- name: nginx-conf  # 数据卷名称
  configMap:        # 数据卷类型为 configMap
    name: nginx-conf-cm    # configMap 名字
    items:       # 要将configMap中的哪些数据挂载进来
    - key: nginx.conf    # configMap 中的文件名
      path: etc/nginx/nginx.conf           # subPath 路径

四、配置的热更新

我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?
这得分成几种情况:

  • 默认方式:会更新,更新周期是更新时间 + 缓存时间
  • subPath:不会更新
  • 变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的

对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置
但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可

通过软连接 替代 subPath 作用

图片描述

postStart

图片描述

一)通过 edit 命令直接修改 configmap

修改 configmap 容器内读到的内容,过一会就自动变动

二)通过 replace 替换

由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file 参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现

# 该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据,通过 - 将当前输出变为当前命令的输入,即可实现替换
kubectl create cm --from-file=nginx.conf --dry-run -oyaml | kubectl replace -f-

五、不可变的 Secret 和 ConfigMap

对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改

# 在 configMap 中加入 immutable: true
kubectl edit cm test-dir-config

加入后就不可修改

图片描述
posted @ 2023-10-15 00:04  yifanSJ  阅读(53)  评论(0编辑  收藏  举报