Kubernetes之ConfigMap

C#

浏览数:44

2020-6-13

AD:资源代下载服务

目录

1、何为configMap

kubernetes中提供了一个叫configMap的概念,为的就是让镜像和配置文件之间解耦,不需要在镜像中打包配置文件,实现了镜像的灵活性,因为一个configMap就是一系列配置信息的集合,将来是可以直接注入到Pod中的容器供其使用。

2、创建configMap

你可以通过使用kubectl create configmap或者yaml方式来创建configMap。

2.1、通过–from-literal创建

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source] [--from-literal=key1=value1] 

示例:

1.创建命令

$ kubectl create configmap test-config --from-literal=Username=root --from-literal=Password=123456

2.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap test-config -o yaml
apiVersion: v1
data:
  Password: "123456"
  Username: root
kind: ConfigMap
metadata:
  creationTimestamp: "2020-03-27T12:25:59Z"
  name: test-config
  namespace: default
  resourceVersion: "98418"
  selfLink: /api/v1/namespaces/default/configmaps/test-config
  uid: 7ce2d3dd-6b0d-4fa2-bb09-0a353a3a137a

2.2、通过文件创建

我们可以指定文件创建configmap,系统会自动将文件的内容写入到configmap的data字段里。

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source]

示例:

1.db.properties文件内容

db.user = root
db.pwd  = 123456
db.host = 10.4.7.11
db.port = 3306
db.lib  = devops

2.创建命令

$ kubectl create configmap db-config --from-file=./db.properties

–from-file 可以有多个

3.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap db-config -o yaml
apiVersion: v1
data:
  db.properties: |
    db.user = root
    db.pwd  = 123456
    db.host = 10.4.7.11
    db.port = 3306
    db.lib  = devops
kind: ConfigMap
metadata:
  creationTimestamp: "2020-03-27T12:33:57Z"
  name: db-config
  namespace: default
  resourceVersion: "99103"
  selfLink: /api/v1/namespaces/default/configmaps/db-config
  uid: a3b76fd8-bf2d-483b-a455-eb4fb48450cb

注意:我们可以看到指定文件创建时ConfigMap会创建一个key/value键值对,key是文件名,value是文件内容。

如果我们不想configmap中的key为默认的文件名,还可以在创建时自己指定key名字:

$ kubectl create configmap db-config --from-file=<key-name>=<path-to-file>

2.3、通过目录创建

我们可以指定目录创建configmap,系统会自动将指定目录下的所有文件的内容写入到configmap的data字段里。

命令格式:

$ kubectl create configmap NAME [--from-file=[key=]source]

示例:

1.查看文件内容

[root@hdss7-21 ~]# echo "123" >config/a.ini
[root@hdss7-21 ~]# echo "456" >config/b.ini

2.创建命令

$ kubectl create configmap ab-config --from-file=./config

–from-file 可以有多个。

3.结果如下data内容:

[root@hdss7-21 ~]# kubectl get configmap ab-config -o yaml
apiVersion: v1
data:
  a.ini: |
    123
  b.ini: |
    456
kind: ConfigMap
metadata:
  creationTimestamp: "2020-03-27T12:45:15Z"
  name: ab-config
  namespace: default
  resourceVersion: "100073"
  selfLink: /api/v1/namespaces/default/configmaps/ab-config
  uid: 0988dda0-c8b5-4944-ad16-cffba1d41bb3

注意:我们可以看到指定目录创建时ConfigMap内容中的各个文件会创建一个key/value键值对,key是文件名,value是文件内容。

指定目录时只会识别该目录下的文件,而忽略子目录。

2.4、yaml文件创建

1.创建cache-db-config.yaml文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: cache-db-config
  namespace: default
data:
  redis.cnf: |
    redis.db = 3
    redis.host = 127.0.0.1
    redis.user = admin
    redis.pwd  = admin123
    redis.port = 2379
  mysql.cnf: |
    mysql.db = devops
    mysql.host = 127.0.0.1
    mysql.user = root
    mysql.pwd  = root123
    mysql.port = 3306

2.应用yaml

$ kubectl apply -f cache-db-config.yaml

3、使用ConfigMap

那么前面介绍如何创建ConfigMap,但是怎么使用尼?下面讲解

使用ConfigMap三种方式:

  • 第一种是通过环境变量的方式,直接传递给pod
    • 使用configmap中指定的key
    • 使用configmap中所有的key
  • 第二种是通过在pod的命令行下运行的方式(启动命令中)
  • 第三种是作为volume的方式挂载到pod内

3.1、valueFrom方式

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80
        env: 
        - name: User  # pod容器中的环境变量名字
          valueFrom:
            configMapKeyRef:
              name: test-config       # configmap的名字
              key: Username           # configmap中定义的key    
        - name: Pwd
          valueFrom:
            configMapKeyRef:
              name: test-config  
              key: Password

验证:

[root@hdss7-21 ~]# kubectl exec nginx-7cd5cbd997-zv6f4  printenv | egrep "User|Pwd"
User=root
Pwd=123456

3.2、挂载方式

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.11
        ports:
        - containerPort: 80
        volumeMounts:            
        - name: ab           
          mountPath: /etc/nginx/conf.d/
          readOnly: true   
      volumes:                
      - name: ab 
        configMap:        # 存储卷类型   
          name: ab-config

验证:

[root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/a.ini
123
[root@hdss7-21 ~]# kubectl exec nginx-574c65d5b4-57j2p cat /etc/nginx/conf.d/b.ini
456

作者:jasonminghao