k8s 配置管理

k8s 配置管理

ConfigMap

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

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

常用创建configmap 方式

  # Create a new config map named my-config based on folder bar
  # 基于文件夹创建一个名为 my-config 的配置
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config with specified keys instead of file basenames on disk
  # 指定对应文件创建 --from-file=key1=/path/to/bar/file1.txt  key1 是重命名配置名
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  
  # Create a new config map named my-config with key1=config1 and key2=config2
  # 使用key1=config1 方式配置   这种很少用
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
  
  # Create a new config map named my-config from the key=value pairs in the file
  # 从文件中的 key=value 方式创建配置 
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config from an env file
  # 从env文件创建一个名为my-config的新配置映射  
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
kubectl get cm  # 查看configmap 配置
kubectl describe cm config_name # 查看 config_name 的配置信息

pod 中使用

需要先创建 configmap 直接用上述命令创建或者通过yaml文件都行

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: my-configmap  
data:  
  app_config.yml: |  
    database:  
      host: db.example.com  
      port: 5432  
      username: myuser  
      password: mypassword  
    other_setting: some_value  
   log_level: INFO

pod 中配置

# pod-using-configmap.yaml  
apiVersion: v1  
kind: Pod  
metadata:  
  name: my-pod  
spec:  
  containers:  
    - name: my-container  
      image: my-app-image  
      env:  
        # 使用 ConfigMap 中的单个值作为环境变量  
        - name: LOG_LEVEL  
          valueFrom:  
            configMapKeyRef:    
              name: my-configmap  
              key: log_level  
      volumeMounts:  
        # 将 ConfigMap 挂载为文件  
        - name: config-volume  
          mountPath: /etc/config  
      # 可以在命令中使用环境变量,或在应用中读取 /etc/config/app_config.yml  
      command: ["/bin/sh", "-c", "echo $LOG_LEVEL && cat /etc/config/app_config.yml"]  
  volumes:  
    - name: config-volume  
      configMap:  
        name: my-configmap  
        # 默认情况下,ConfigMap 中的所有 key 都会被挂载为文件,文件名与 key 相同  
        # 如果只想挂载部分 key,可以使用 items 字段来指定  
        # items:  
        #   - key: app_config.yml  
        #     path: app_config.yml

Secret

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

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

使用 kubectl create secret -h 查看

Available Commands:
  docker-registry Create a secret for use with a Docker registry # 使用最多
  generic         Create a secret from a local file, directory, or literal value
  tls             Create a TLS secret   # 配置 https 加密

其中 kubectl create secret generic --help 查看示例,构建 secret 对象, 和configmap 几乎没啥区别, 只是value 是 base64 编码后的数据而已

Examples:
  # Create a new secret named my-secret with keys for each file in folder bar
  kubectl create secret generic my-secret --from-file=path/to/bar
  
  # Create a new secret named my-secret with specified keys instead of names on disk
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa
--from-file=ssh-publickey=path/to/id_rsa.pub
  
  # Create a new secret named my-secret with key1=supersecret and key2=topsecret
  kubectl create secret generic my-secret --from-literal=key1=supersecret --from-literal=key2=topsecret
  
  # Create a new secret named my-secret using a combination of a file and a literal
  kubectl create secret generic my-secret --from-file=ssh-privatekey=path/to/id_rsa --from-literal=passphrase=topsecret
  
  # Create a new secret named my-secret from env files
  kubectl create secret generic my-secret --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env

docker-registry

通过docker-registry 来配置docker harbor 的账户密码, ip port 等信息

 # If you don't already have a .dockercfg file, you can create a dockercfg secret directly by using:
kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER
--docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
  
  # Create a new secret named my-secret from ~/.docker/config.json
  kubectl create secret docker-registry my-secret --from-file=.dockerconfigjson=path/to/.docker/config.json

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 中的文件名

配置热更新

我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?

这得分成几种情况:

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

对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置

但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可

使用方案

使用edit 修改

kubectl edit cm  configmap_name   # 修改后需要一定时间更新

通过replace替换

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

# 该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换

# 修改原配置文件后执行
kubectl create cm --from-file=nginx.conf --dry-run -o yaml | kubectl replace -f-   

不可变Secret 和 ConfigMap

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

apiVersion: v1
data:
  application.yaml: "spring:\n  application:\n    name: test-app\nserver:\n  port:
    8080\n  \n"
kind: ConfigMap
metadata:
  creationTimestamp: "2024-05-13T02:27:22Z"
  name: app-config
  namespace: default
immutable: true

相关推荐

  1. k8s 配置管理

    2024-05-14 08:06:09       3 阅读
  2. k8s配置资源管理

    2024-05-14 08:06:09       19 阅读

最近更新

  1. .Net Core WebAPI参数的传递方式

    2024-05-14 08:06:09       0 阅读
  2. QT--气泡框的实现

    2024-05-14 08:06:09       0 阅读
  3. LeetCode 968.监控二叉树 (hard)

    2024-05-14 08:06:09       0 阅读
  4. leetcode热题100.完全平方数(动态规划进阶)

    2024-05-14 08:06:09       0 阅读
  5. leetcode328-Odd Even Linked List

    2024-05-14 08:06:09       0 阅读
  6. C 语言设计模式(结构型)

    2024-05-14 08:06:09       0 阅读
  7. v-if 与 v-show(vue3条件渲染)

    2024-05-14 08:06:09       0 阅读
  8. kafka防止消息丢失配置

    2024-05-14 08:06:09       0 阅读

热门阅读

  1. Redis 5.0 Stream数据结构深入分析

    2024-05-14 08:06:09       3 阅读
  2. 力扣:93. 复原 IP 地址

    2024-05-14 08:06:09       4 阅读
  3. 数据库和Redis数据不一致的问题

    2024-05-14 08:06:09       3 阅读
  4. Rust 语言不支持 goto 语句

    2024-05-14 08:06:09       4 阅读
  5. ubuntu 24.04 devilspie 报错解决

    2024-05-14 08:06:09       3 阅读
  6. CircleCI的原理及应用详解(二)

    2024-05-14 08:06:09       3 阅读
  7. 10、Go Gin 连接Redis以及Cookie&Session

    2024-05-14 08:06:09       4 阅读
  8. 使用frp通过http访问内网web服务

    2024-05-14 08:06:09       3 阅读
  9. Nginx-01-Nginx 是什么? 能做什么?

    2024-05-14 08:06:09       7 阅读
  10. hdfs中的小知识(hadoop hdfs hive)

    2024-05-14 08:06:09       3 阅读
  11. springboot 注解(持续更新中)

    2024-05-14 08:06:09       7 阅读