Kubernetes(k8s)之Configmap配置管理

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes(k8s)之Configmap配置管理相关的知识,希望对你有一定的参考价值。

镜像和配置文件的解耦

应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。从Kubernetes1.2开始提供了一种统一的应用配置管理方案一ConfigMap

ConfigMap作用

Configmap用于保存配置数据,以键值对形式存储
configMap 资源提供了向 Pod 注入配置数据的方法
旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性

ConfigMap应用场景

(1)生成为容器内的环境变量。
(2)设置容器启动命令的启动参数(需设置为环境变量)。
(3)以Volume的形式挂载为容器内部的文件或目录。
ConfigMap以一个 或多个key:value的形式保存在Kubermetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容(例如Iserver.xml=< ?x… )可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。

创建ConfigMap的方式

1、使用字面值创建

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

有两个键值对,如图标注

2、使用文件创建

kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
key键的名称是文件名称,value的值是这个文件的内容

一个键值对,如图标注,值就是文件内容

和原文件内容一致

3、使用目录创建

kubectl create configmap my-config-3 --from-file=test
目录中的文件名为key,文件内容是value

新建一个目录,在里边放入一些内容(相当于配置文件)

下图标注有问题,一个键值对,键是目录,值是目录下的内容

4、编写configmap的yaml文件创建

创建cm的yaml配置文件内容如下

vim cm1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.38.250"
  db_port: "3306"

应用文件,cm创建成功

如何使用configmap

1、通过环境变量的方式直接传递给pod

编写配置文件,内容如下

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busybox
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: key1			#定义环境变量的名称
          valueFrom:			#key1对应的value
            configMapKeyRef:
              name: cm1-config	#环境变量的值取自cm1-config,我们在上边创建的cm
              key: db_host		#key是cm1-config中的db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

应用文件创建pod,查看日志可以看到键值对

查看详细描述效果一样

2、通过在pod的命令行下运行的方式

编写配置文件,内容如下

$ vim pod1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]		#获取环境变量
      envFrom:					#用于在容器中填充环境变量的源列表
        - configMapRef:
            name: cm1-config	#选择一个ConfigMap来填充环境具有的变量。cm1-config的键值对作为环境变量
  restartPolicy: Never			#重启策略:永不

创建pod

可以看到键值对和cm1-config的一致

3、作为volume的方式挂载到pod内

编写配置文件,内容如下:
没有指定items(将字符串键映射到卷内的路径),在引用ConfigMap时不指定items(如果未指定,则引用的ConfigMap的数据字段中的每个键值对将作为文件投影到卷中,该文件的名称为键,内容为值),则使用volumeMount方式在容器内的目录下为每个item都生成一个 文件名为key的文件。

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      command: ["/bin/sh", "-c", "cat /config/db_host"]		#只要cm1-config的db_host这个key
      volumeMounts:
      - name: config-volume		#引用卷的名称
        mountPath: /config		#挂载到容器内的目录
  volumes:
    - name: config-volume		#定义volume的名称
      configMap:
        name: cm1-config		#使用我们前面创建的cm1-config	
  restartPolicy: Never

查看日志得到我们想要的value

使用ConfigMap的限制条件

使用ConfigMap的限制条件如下:
1、ConfigMap必须在Pod之前创建
2、ConfigMap受Namespace限制, 只有处于相同Namespace中的Pod才可以引用它
3、ConfigMap中的配额管理还未能实现。
4、kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通过–manifest- url或- config自动创建的静态Pod将无法引用ConfigMap。
5、在Pod对ConfigMap进行挂载(volumeMount) 操作时,在容器内部只能挂载为“目录”,无法挂载为“文件”。在挂载到容器内部后,在目录下将包含ConfigMap定义的每个item,如果在该目录下原来还有其他文件,则容器内的该目录将被挂载的ConfigMap覆盖。

热更新

实现修改配置文件可以做到动态更新。

演示:
创建配置nginx的cm,首先我们要有一个nginx的简单的配置文件nginx.conf,内容如下:

server {
    listen       8000;		#该配置文件主要是设置端口
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.html;
    }
}

接下来将配置文件nginx.conf作为键值对创建cm,使用如下命令:

kubectl create configmap nginxconf --from-file=nginx.conf		#这是使用文件的方式创建configmap


接下来创建控制器,使用volumemount的方式使用上面创建的cm,nginx.yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
          - name: config-volume
            mountPath: /etc/nginx/conf.d	#容器内挂载路径
      volumes:
        - name: config-volume
          configMap:
            name: nginxconf		#使用nginxconf这个cm

应用文件创建出pod

查看ip

使用我们设置的端口访问没有问题

修改nginx.conf里的端口为8080

Pod数据并不会实时更新,需要等待几秒,可以使用命令kubectl edit cm nginxconf查看是否更新完成。
configmap热更新后,并不会触发相关Pod的滚动更新,需要手动触发,使用以下命令:

kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210730"}}}}}'
#version值一旦变动就会实现更新

但使用手动出发更新较慢,还是直接删除掉pod重新创建来的快,建议直接删除重新创建,如下,访问8080没有问题,热更新完成!

以上是关于Kubernetes(k8s)之Configmap配置管理的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 数据持久化之Configmap

k8s之安全信息(secret)及配置信息(configmap)管理

#yyds干货盘点#spring-cloud-kubernetes与k8s的configmap

k8s 意外集锦 - configmap 挂载 目录 只读

Kubernetes(k8s)配置管理ConfigMap&Secret

#yyds干货盘点#spring-cloud-kubernetes自动同步k8s的configmap更新