theboyaply
theboyaply
发布于 2020-03-30 / 591 阅读
0
0

k8s configMap介绍

k8s configMap介绍

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

configMap 四种创建方式

使用目录创建

创建一个目录,并在里面创建两个文件:

[root@k8s-master01 ~]# mkdir configmapDir
[root@k8s-master01 ~]# cd configmapDir/
[root@k8s-master01 configmapDir]# pwd
/root/configmapDir

[root@k8s-master01 configmapDir]# vim fileOne.properties

[root@k8s-master01 configmapDir]# cat fileOne.properties 
name=tom
agr=24
gender=man

[root@k8s-master01 configmapDir]# vim fileTwo.properties
[root@k8s-master01 configmapDir]# cat fileTwo.properties 
color=red
number=10

创建 configMap:

[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-directory --from-file=/root/configmapDir
configmap/cm-by-directory created

[root@k8s-master01 configmapDir]# kubectl get cm
NAME              DATA   AGE
cm-by-directory   2      11m

其中 --from-file:指定创建方式以及所在文件所在目录。该目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对,键就是文件的名字,值就是文件的内容。

使用文件创建

我们使用上面例子中的 fileOne.properties 文件来创建:

[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-file --from-file=/root/configmapDir/fileOne.properties
configmap/cm-by-file created

[root@k8s-master01 configmapDir]# kubectl get cm
NAME              DATA   AGE
cm-by-directory   2      11m
cm-by-file        1      4s

--from-file 可以被使用多次,这个例子中,如果我们将 fileOne.propertiesfileTwo.properties 都指定了的话,那么效果和指定整个目录一样。

使用字面值创建

和上面两个例子使用的关键字不一样,这里使用 --from-literal 参数传递配置信息,该参数可以使用多次。如:

[root@k8s-master01 configmapDir]# kubectl create configmap cm-by-literal --from-literal=name=tom --from-literal=age=24
configmap/cm-by-literal created

[root@k8s-master01 configmapDir]# kubectl get cm
NAME              DATA   AGE
cm-by-directory   2      16m
cm-by-file        1      5m55s
cm-by-literal     2      4s

使用 yaml 创建

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

保存为 special.yaml,并执行:

kubectl apply -f special.yaml

Pod 中使用 configMap

使用 configMap 注入环境变量

special-config.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  special.type: charm

log-level-config.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-level-config
  namespace: default
data:
  log_level: INFO

创建上面两个 configMap:

[root@k8s-master01 configmapDir]# kubectl apply -f log-level-config.yaml  
configmap/log-level-config created

[root@k8s-master01 configmapDir]# kubectl apply -f special-config.yaml 
configmap/special-config created

编写 Pod 资源清单(cm-env-pod.yaml):

apiVersion: v1
kind: Pod
metadata:
  name: cm-env-pod
  namespace: default
spec:
  restartPolicy: Never
  containers:
  - name: nginx-container
    image: hub.xixihaha.com/library/mynginx:v1
    command: ['sh', '-c', 'env']
    envFrom:
    - configMapRef:
        name: log-level-config
    env:
    - name: SPECIAL_HOW_STR
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.how
    - name: SPECIAL_TYPE_STR
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.type

说明,上面共使用了两种方式注入环境变量:

  • command:输出容器的环境变量。

  • spec.envFrom:指定一个 configMap,并使用 configMap 的 key 和 value 作为环境变量的 key 和 value。

  • spec.env:name 为环境变量的 key,valueFrom 指定使用哪个 configMap 以及哪个 key 的值。

创建 Pod 并查看输出的环境变量:

[root@k8s-master01 ~]# kubectl apply -f cm-env-pod.yaml 
pod/cm-env-pod created

[root@k8s-master01 ~]# kubectl get pod 
NAME         READY   STATUS      RESTARTS   AGE
cm-env-pod   0/1     Completed   0          5s

[root@k8s-master01 ~]# kubectl log cm-env-pod
log is DEPRECATED and will be removed in a future version. Use logs instead.
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=cm-env-pod
HOME=/root
PKG_RELEASE=1~buster
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
NGINX_VERSION=1.17.9
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SPECIAL_HOW_STR=very
KUBERNETES_PORT_443_TCP_PORT=443
NJS_VERSION=0.3.9
KUBERNETES_PORT_443_TCP_PROTO=tcp
SPECIAL_TYPE_STR=charm
log_level=INFO
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

数据卷挂载

apiVersion: v1
kind: Pod
metadata:
  name: volume-config-pod
  namespace: default
spec:
  restartPolicy: Never
  containers:
  - name: nginx-container
    image: hub.xixihaha.com/library/mynginx:v1
    command: ['sh', '-c', 'sleep 3600']
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: special-config

说明:

  • spec.volumes.name:定义一个数据卷,名称为 config-volume
  • spec.volumes.configMap.name:数据卷关联的 configMap 名称,这里使用上面例子中创建的 special-config。
  • spec.containers.volumeMounts.name:数据卷名称。
  • spec.containers.volumeMounts.mountPath:数据卷挂载的容器内路径。

创建 Pod 并进入容器查看挂载的目录内容:

[root@k8s-master01 ~]# kubectl apply -f volume-config-pod.yaml 
pod/volume-config-pod created

[root@k8s-master01 ~]# kubectl get pod
NAME                READY   STATUS      RESTARTS   AGE
volume-config-pod   1/1     Running     0          3s

[root@k8s-master01 ~]# kubectl exec volume-config-pod -it /bin/bash
root@volume-config-pod:/# cd /etc/config
root@volume-config-pod:/etc/config# ls
special.how  special.type
root@volume-config-pod:/etc/config# cat special.how
very
root@volume-config-pod:/etc/config# cat special.type
charm
root@volume-config-pod:/etc/config# 

从结果可以看见,configMap(special-config)中的内容:

data:
  special.how: very
  special.type: charm

在挂载数据卷后,容器内部将 configMap 的 key 作为文件名,value 作为文件内容,创建成一个个的文件。

查看 configMap 信息

查看所有 configMap:

[root@k8s-master01 configmapDir]# kubectl get cm -n default
NAME              DATA   AGE
cm-by-directory   2      4s

查看 configMap 内容:

[root@k8s-master01 configmapDir]# kubectl describe cm cm-by-directory
Name:         cm-by-directory
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
fileOne.properties:
----
name=tom
agr=24
gender=man

fileTwo.properties:
----
color=red
number=10

Events:  <none>

查看 configMap yaml 内容:

[root@k8s-master01 configmapDir]# kubectl get cm cm-by-directory -o yaml
apiVersion: v1
data:
  fileOne.properties: |
    name=tom
    agr=24
    gender=man
  fileTwo.properties: |
    color=red
    number=10
kind: ConfigMap
metadata:
  creationTimestamp: "2020-03-30T03:33:51Z"
  name: cm-by-directory
  namespace: default
  resourceVersion: "204260"
  selfLink: /api/v1/namespaces/default/configmaps/cm-by-directory
  uid: 2ce09007-f6fa-42cc-8f4f-7fc115034b6d

-- end --


评论