configmap

1.作用

对于应用的可变配置在 Kubernetes 中是通过一个 ConfigMap 资源对象来实现的,我们知道许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息的需求,这些配置信息我们肯定不会直接写死到应用程序中去的,比如你一个应用连接一个 redis 服务,下一次想更换一个了的,还得重新去修改代码,重新制作一个镜像,这肯定是不可取的,而ConfigMap 就给我们提供了向容器中注入配置信息的能力,不仅可以用来保存单个属性,还可以用来保存整个配置文件,比如我们可以用来配置一个 redis 服务的访问地址,也可以用来保存整个 redis 的配置文件。接下来我们就来了解下 ConfigMap 这种资源对象的使用方法。

2.创建一个configmap

[root@k8s-master01 configmap]# cat cm-demo1.yaml 
kind: ConfigMap
apiVersion: v1
metadata:
  name: cm-demo
  namespace: default
data:
  data.1: hello
  data.2: world
  config: |
    property.1=value-1
    property.2=value-2
    property.3=value-3

[root@k8s-master01 configmap]# kubectl get configmaps 
NAME               DATA   AGE
cm-demo            3      7m26s


[root@k8s-master01 configmap]# kubectl describe configmaps  cm-demo 
Name:         cm-demo
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
config:
----
property.1=value-1
property.2=value-2
property.3=value-3

data.1:
----
hello
data.2:
----
world
Events:  <none>

3.我们可以可以从一个给定的目录来创建一个 ConfigMap 对象,比如我们有一个 testcm 的目录,该目录下面包含一些配置文件,redis 和 mysql 的连接信息

[root@k8s-master01 testcm]# cat redis.conf 
host=127.0.0.1
port=6379
[root@k8s-master01 testcm]# cat mysql.conf 
host=127.0.0.1
port=3306
[root@k8s-master01 configmap]# kubectl create configmap cm-demo2 --from-file=testcm/
configmap/cm-demo2 created
[root@k8s-master01 configmap]# kubectl get configmaps 
NAME               DATA   AGE
cm-demo            3      13m
cm-demo2           2      25s
game-config        2      22d
kube-root-ca.crt   1      71d
[root@k8s-master01 configmap]# kubectl  describe configmaps cm-demo2 
Name:         cm-demo2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
redis.conf:
----
host=127.0.0.1
port=6379

mysql.conf:
----
host=127.0.0.1
port=3306

Events:  <none>
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo2 -oyaml
apiVersion: v1
data:
  mysql.conf: |
    host=127.0.0.1
    port=3306
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2021-04-11T05:30:28Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:mysql.conf: {}
        f:redis.conf: {}
    manager: kubectl-create
    operation: Update
    time: "2021-04-11T05:30:28Z"
  name: cm-demo2
  namespace: default
  resourceVersion: "2856094"
  uid: 93937b91-6488-4a6f-8277-7e15a486b0ef

4.指定文件来创建

[root@k8s-master01 configmap]# kubectl create configmap  cm-demo3 --from-file=testcm/redis.conf 
configmap/cm-demo3 created
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo3 -oyaml
apiVersion: v1
data:
  redis.conf: |
    host=127.0.0.1
    port=6379
kind: ConfigMap
metadata:
  creationTimestamp: "2021-04-11T05:33:09Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:redis.conf: {}
    manager: kubectl-create
    operation: Update
    time: "2021-04-11T05:33:09Z"
  name: cm-demo3
  namespace: default
  resourceVersion: "2856476"
  uid: 26b0b246-606c-4077-aea5-494954787e1c

5.通过帮助文档我们可以看到我们还可以直接使用字符串进行创建,通过 --from-literal 参数传递配置信息,同样的,这个参数可以使用多次,格式如下:

[root@k8s-master01 configmap]# kubectl create configmap cm-demo4 --from-literal=db.host=localhost --from-literal=db.port=3306
configmap/cm-demo4 created
[root@k8s-master01 configmap]# kubectl get configmaps cm-demo4 -oyaml
apiVersion: v1
data:
  db.host: localhost
  db.port: "3306"
kind: ConfigMap
metadata:
  creationTimestamp: "2021-04-11T05:35:39Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:db.host: {}
        f:db.port: {}
    manager: kubectl-create
    operation: Update
    time: "2021-04-11T05:35:39Z"
  name: cm-demo4
  namespace: default
  resourceVersion: "2856827"
  uid: 43285a9c-d1ea-48b1-a311-1f630ea764d3

6.使用

ConfigMap 创建成功了,那么我们应该怎么在 Pod 中来使用呢?我们说 ConfigMap 这些配置数据可以通过很多种方式在 Pod 里使用,主要有以下几种方式:

设置环境变量的值
在容器里设置命令行参数
在数据卷里面挂载配置文件

非常常见的使用 ConfigMap 的方式:通过数据卷使用,在数据卷里面使用 ConfigMap,就是将文件填入数据卷,在这个文件中,键就是文件名,键值就是文件内容,如下资源对象所示:

apiVersion: v1
kind: Pod
metadata:
  name: testcm3-pod
spec:
  volumes:
    - name: config-volume
      configMap:
        name: cm-demo2
  containers:
    - name: testcm3
      image: busybox
      command: [ "/bin/sh", "-c", "cat /etc/config/redis.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
[root@k8s-master01 configmap]# kubectl apply -f cmtest3-pod.yaml 
pod/testcm3-pod created
[root@k8s-master01 configmap]# kubectl logs testcm3-pod 
host=127.0.0.1
port=6379

当然我们也可以在 ConfigMap 值被映射的数据卷里去控制路径,如下 Pod 定义:

apiVersion: v1
kind: Pod
metadata:
  name: testcm4-pod
spec:
  volumes:
    - name: config-volume
      configMap:
        name: cm-demo1
        items:
        - key: mysql.conf
          path: path/to/msyql.conf
  containers:
    - name: testcm4
      image: busybox
      command: [ "/bin/sh","-c","cat /etc/config/path/to/msyql.conf" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
[root@k8s-master01 configmap]# kubectl create -f cmtest4-pod.yaml 
pod/testcm4-pod created
[root@k8s-master01 configmap]# kubectl logs cmtest4
host=127.0.0.1
port=3306
原文地址:https://www.cnblogs.com/Applogize/p/14643673.html