k8s configMap

k8s configMap

ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制,ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象

ConfigMap 的创建

根据文件夹创建cm

# 创建
kubectl create cm cm名 --from-file=目录名 -n namespace
# 该目录下的每个文件被定义为一个键值对,其中文件名作为键,文件内容作为值

# 查看
kuebctl get cm cm名 -n namespace
kubectl describe cm cm名 -n namespace

# 删除
kubectl delete cm cm名 -n namespace
//也可以这样写,重新定义文件名字
rancher kubectl create configmap game-config -n ecs-dev --from-file=alex=alex

—from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键的名字就是文件名,值就是文件的内容

image

使用文件创建

只要指定为一个文件就可以从单个文件中创建 ConfigMap
—from-file 这个参数可以使用多次,你可以使用两次分别指定上个实例中的那两个配置文件,效果就跟指定整个目录是一样的

# 创建,configmap简写为cm
# 第一种是将文件名作为键,文件内容作为值
kubectl create cm configmap名 --from-file=文件名 --from-file=文件名 ... -n namespace
# 第二种,不以文件名作为键,自定义键
kubectl create cm configmap名 --from-file=键值1=文件名 --from-file=键值2=文件名 ... -n namespace
# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace
# 删除
kubectl delete cm cm名 -n namespace
kubectl delete cm --all -n namespace # 删除所有cm

命令行声明键值对创建configmap

# 创建
kubectl create cm cm名 --from-literal=键1=值1 --from-literal=键2=值2 ... -n namespace

# 查看
kuebctl get cm -n namespace
kubectl describe cm cm名 -n namespace

# 删除
kubectl delete cm cm名 -n namespace

通过资源清单文件创建configmap

# 资源清单文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: 
  namespace:
data:
  key1: value1
  key2: value2
  ...

# 下面是嵌套写法
data:
  key1: 
    key2:value2
    key3:value2
  ...

# 创建
kubectl create -f 资源清单文件
kubectl apply -f 资源清单文件

# 查看
kubectl describe cm cm名 -n namespace
kubectl describe -f 资源清单文件

# 删除
kubectl delete cm cm名 -n namespace
kubectl delete -f 资源清单文件

Pod 中使用 ConfigMap

使用 ConfigMap 来替代环境变量

apiVersion: v1
kind: ConfigMap
metadata:
  name: literal-config
  namespace: default
data:
  name: dave
  password: pass
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
apiVersion: v1
kind: Pod
metadata:
  name: cm-env-test-pod
spec:
  containers:
    - name: test-container
      image: wangyanglinux/myapp:v1
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: USERNAME  //定义环境变量的key
          valueFrom:      //value来源
            configMapKeyRef:    //value来源configMap
              name: literal-config   //configMap里面的名字  kubectl get cm
              key: name		//literal-config 这个里面的name对应的value
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: password
      envFrom:		//将configmap env-config里面的key-value全部注入到容器中
        - configMapRef:	
            name: env-config
  restartPolicy: Never //永不重启,容器死了就死了

用 ConfigMap 设置命令行参数

apiVersion: v1
kind: Pod
metadata:
  name: cm-command-dapi-test-pod
spec:
  containers:
    - name: test-container
      image: wangyanglinux/myapp:v1
      command: [ "/bin/sh", "-c", "echo $(USERNAME) $(PASSWORD)" ]
      env:
        - name: USERNAME
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: name
        - name: PASSWORD
          valueFrom:
            configMapKeyRef:
              name: literal-config
              key: password
  restartPolicy: Never

通过数据卷插件使用ConfigMap挂载多个配置文件

在数据卷里面使用这个 ConfigMap,有不同的选项。最基本的就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容

    spec:
      containers:
      - name: <APP_NAME>
        image: <HARBOR>/<PROJECT>/<APP_NAME>:<BUILD_TAG>
        imagePullPolicy: Always
        volumeMounts:
        - name: wxpay-key		//对应下面创建的卷
          mountPath: "/app/key/apiclient_key.pem"		//指定配置文件存放到容器的哪个位置
          subPath: apiclient_key.pem	//重新指定文件名称,防止文件冲突
        - name: wxpay-cert
          mountPath: "/app/cert/apiclient_cert.pem"
          subPath: apiclient_cert.pem
        ports:
        - name: http
          containerPort: 8080
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          periodSeconds: 30
          failureThreshold: 3
          timeoutSeconds: 20
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          periodSeconds: 30
          failureThreshold: 3
          timeoutSeconds: 20
      volumes:
        - name: wxpay-key		//在这里定义卷,可以和上面匹配关联到一起
          configMap:
            name: soi-chat-wxpay-key-cm		//kubectl get cm获取到的configmap名称
        - name: wxpay-cert
          configMap:
            name: soi-chat-wxpay-cert-cm

热更新

ConfigMap 的热更新

像这种文件注入到环境里面去的,不是挂载进去的,批量化注入,可以缓解磁盘的IO

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config		//configMap的名字
  namespace: default
data:
  log_level: INFO  //configMap里面的key,value
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hot-update
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: wangyanglinux/myapp:v1
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume		//调用volume里面的config-volume
          mountPath: /etc/config	//把内容放到 /etc/config里面
      volumes:
        - name: config-volume  	//起一个名字config-volume关联configMap
          configMap:
            name: log-config   //configMap的名字
//实时刷新查看挂载进去的value
while 2>1;do kubectl exec hot-update-c484b98b4-fmh4x -- cat /etc/config/log_level;sleep 1;date;done

修改 ConfigMap

kubectl edit configmap log-config

把INFO改成ERROR,注意有没有nginx里面的annotations: 里面是否有INFO,有的话也要改成ERROR
image
再次刷新查看

while 2>1;do kubectl exec hot-update-c484b98b4-fmh4x -- cat /etc/config/log_level;sleep 1;date;done

等待几秒~几十秒,可以看到日志开始打印ERROR,因为是注入的,并不是挂载的,减小磁盘IO
image

ConfigMap 更新后滚动更新 Pod

更新 ConfigMap 目前并不会触发相关 Pod 的滚动更新,可以通过修改 pod annotations 的方式强制触发滚动更新

kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20190411" }}}}}'

这个例子里我们在 .spec.template.metadata.annotations 中添加 version/config,每次通过修改 version/config 来触发滚动更新

!!! 更新 ConfigMap 后:

  • 使用该 ConfigMap 挂载的 Env 不会同步更新
  • 使用该 ConfigMap 挂载的 Volume 中的数据需要一段时间(实测大概10秒)才能同步更新

不可变更的ConfigMap

Kubernetes还提供了一种将ConfigMap设置为不可变更的特性(也支持Secret)。对于大量使用ConfigMap的集群(至少有数万个各不相同的ConfigMap给Pod挂载)而言,禁止更改ConfigMap的数据有以下好处:

保护应用,使之免受意外(不需要的)更新所带来的负面影响;
大幅降低对kube-apiserver的压力,从而提升集群性能。这是因为系统会关闭对已标记为不可变更的ConfigMap的监控。
我们可以通过将immutable字段设置为true创建不可变更的ConfigMap。

apiVersion: v1
kind: ConfigMap
metadata:
  ...
data:
  ...
immutable: true

要注意的是,一旦某ConfigMap被标记为不可变更,则无法逆转这一变化,也无法更改data或binaryData字段的内容。只能删除并重建ConfigMap。因为现有的Pod会维护一个已被删除的ConfigMap的挂载点,建议重新创建这些Pods

posted @ 2022-07-15 01:16  liwenchao1995  阅读(63)  评论(0编辑  收藏  举报