Skip to content

K8s Configuration

ConfigMap

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

创建

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

  # Create a new config map named my-config based on folder test
  kubectl create configmap my-config --from-file=path/to/test
1. 创建一个文件夹test,里面创建一个文件:db.properties,内容如下
[root@k8s-master test]# cd ..
[root@k8s-master config]# cd test
[root@k8s-master test]# cat db.properties
username=root
password=admin
2. 创建一个名为"test-dir-config"的ConfigMap ,文件来源test/
kubectl create configmap test-dir-config --from-file=test/
查看创建的ConfigMap信息

kubectl get cm
kubectl describe test-dir-config

使用ConfigMap

创建一个pod yaml文件,进行调用名为test-dir-config的ConfigMap文件(上面创建的cm)

apiVersion: v1
kind: Pod
metadata: 
  name: test-configfile-pod
spec:
  containers:
    - name: config-test
      image: alpine
      command: ["/bin/sh","-c","sleep 3600"]
      imagePullPolicy: IfNotPresent
      env: 
      - name: JAVA_VM_OPTS
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            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
        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的值转换为文件

进入该创建的pod中检验ConfigMap是否生效

kubectl exec -it test-configfile-pod -- sh
[root@k8s-master config]# kubectl exec -it test-configfile-pod -- sh
/ # cd /usr/local/mysql/conf
/usr/local/mysql/conf # ls
db.properties
/usr/local/mysql/conf # cat db.properties 
username=root
password=admin

加密数据配置Secret

与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。

  • 常见一个Secret
    kubectl create secret generic <secret-name> --from-literal=username=admin --from-literal=password=abc123
    
  • 查看Secret
    kubectl describe secret/<sercret-name>
    

在创建 Secret 时,要注意如果要加密的字符中,包含了有特殊字符,需要使用转义符转移,例如 $ 转移后为 \$,也可以对特殊字符使用单引号描述,这样就不需要转移例如 1$289-! 转换为 '1$289-!'

[root@k8s-master config]# echo 'YWRtaW4tLwo=' | base64 --decode
admin-/
[root@k8s-master config]# echo admin-/ | base64
YWRtaW4tLwo=
[root@k8s-master config]# echo admin@!-/ | base64
-bash: !-/: event not found
[root@k8s-master config]# echo 'admin@!-/' | base64
YWRtaW5AIS0vCg==
[root@k8s-master config]# echo 'YWRtaW5AIS0vCg==' |base64 --decode
admin@!-/

SubPath的使用

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

配置方式:

  1. 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
  2. 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同

containers: ...... volumeMounts: - mountPath: /etc/nginx/nginx.conf # 挂载到哪里 name: config-volume # 使用哪个 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 路径

配置的热更新

通过edit命令直接修改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 来禁止修改