简单介绍

ConfigMap也是k8s中的一大资源对象,它以键值对的方式预先定义好配置存储,在Pod中就可以使用ConfigMap获取配置到环境变量中,当然它也可以是一个配置文件,通过挂载的方式动态挂载到Pod目录中,实现配置与容器的分离

既然是一个资源对象,可以通过写Yaml指定kind的方式创建。

编写 ConfigMap Yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap-base
data:
  appVersion: 1.0.0
  jdkVersion: "1.8" #不能是number,如果符合number类型就加个引号
  env: prod
  logDir: /var/data
  logLevel: info
  1err_config: err #定义一个不合规范的key,看能否使用,貌似现在可以以数字开头了

通过Yaml方式创建

[root@master configMap]# kubectl create -f kube-configMap.yml         
configmap/configmap-base created

查看 ConfigMap

[root@master configMap]# kubectl get configmap configmap-base -o yaml
apiVersion: v1
data:
  1err_config: err
  appVersion: 1.0.0
  env: prod
  jdkVersion: "1.8"
  logDir: /var/data
  logLevel: info
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-09T15:19:07Z"
  name: configmap-base
  namespace: default
  resourceVersion: "1082049"
  uid: 6470a340-0375-43c1-86fc-0814e218e7f2

查看描述

如果创建失败的配置会在 Events 有提示。

[root@master configMap]# kubectl describe configmap configmap-base
Name:         configmap-base
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
1err_config:
----
err
appVersion:
----
1.0.0
env:
----
prod
jdkVersion:
----
1.8
logDir:
----
/var/data
logLevel:
----
info

BinaryData
====

Events:  <none>

在Pod中使用ConfigMap

ValueFrom方式

这种方式每次只能将一个key加载到环境变量,需要多个key可以多写几个ValueFrom

编写Pod Yaml

kube-configMap-valueFrom.yml

apiVersion: v1
kind: Pod
metadata:
  name: configmap-valuefrom
spec:
  containers:
  - name: configmap-base-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","env"]
    env:
    - name: APP_VERSION
      valueFrom:
        configMapKeyRef:
          name: configmap-base
          key: appVersion
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: configmap-base
          key: logLevel
    - name: LOG_LEVEL
      valueFrom:
        configMapKeyRef:
          name: configmap-base
          key: logLevel
  restartPolicy: Never

创建Pod

[root@master configMap]# kubectl create -f kube-configMap-valueFrom.yml
pod/configmap-valuefrom created

Pod 使用 /bin/sh -c env 打印了环境变量,查看Pod 的日志

[root@master configMap]# kubectl logs configmap-valuefrom              
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
LOG_LEVEL=info
HOSTNAME=configmap-valuefrom
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
ERR_CONFIG=err
APP_VERSION=1.0.0

LOG_LEVEL,APP_VERSION,ERR_CONFIG均已获取到

但是这种方式挺麻烦的,用一个配置一个,如果有100个都需要使用那就显得有点配置多余。

1.6版本以后引入了envFrom,可以加载整个configmap到环境变量中

envfrom

编写Pod yaml,使用envFrom直接将 configmap-base 所有内容加载至环境变量

apiVersion: v1
kind: Pod
metadata:
  name: configmap-envfrom
spec:
  containers:
  - name: configmap-base-busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","env"]
    envFrom:
    - configMapRef:
        name: configmap-base
  restartPolicy: Never

查看Pod的日志信息,

[root@master configMap]# kubectl logs configmap-envfrom
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
appVersion=1.0.0
HOSTNAME=configmap-envfrom
SHLVL=1
HOME=/root
logLevel=info
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
jdkVersion=1.8
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
env=prod
logDir=/var/data
1err_config=err

可以看到,所有的配置都在环境变量中,这种方式方便了不少,实际中大部分情况都会使用这种方式。

通过命令行方式创建ConfigMap

from-literal

在命令行直接指定key-value

[root@master configMap]# kubectl create configmap configmap-literal --from-literal=role=slave --from-literal=mode=cluster
configmap/configmap-literal created

查看创建好的configmap详细信息,最终还是保存在了 data 下面

[root@master configMap]# kubectl get configmap configmap-literal -o yaml
apiVersion: v1
data:
  mode: cluster
  role: slave
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-07T18:25:46Z"
  name: configmap-literal
  namespace: default
  resourceVersion: "855425"
  uid: 9d06ca90-e5a4-42c6-a5fa-2bb42b101f0a

–from-file

通过指定一个目录或者文件的方式创建ConfigMap

如果是文件,以文件名作为key,文件的所有内容作为value

如果是目录,目录下所有文件都会加载,每个文件分别以文件名key,内容为value

在 /root/k8s/configMap/dir 下main创建两个文件

index.html

cat <<EOF > /root/k8s/configMap/dir/index.html
welcome to use configMap
I'm index111
EOF

index2.html

cat <<EOF > /root/k8s/configMap/dir/index2.html
welcome to use configMap
I'm index222
EOF

通过 --from-file 指定 /root/k8s/configMap/dir 目录

[root@master dir]# kubectl create configmap configmap-file --from-file=/root/k8s/configMap/dir
configmap/configmap-file created

查看configmap详细信息,发现data中 多了两个key,两个key的名字就是该目录下的两个文件名,value就是该文件的内容

[root@master dir]# kubectl get configmap configmap-file -o yaml
apiVersion: v1
data:
  index.html: |
    welcome to use configMap
    I'm index111
  index2.html: |
    welcome to use configMap
    I'm index222
kind: ConfigMap
metadata:
  creationTimestamp: "2022-11-09T19:29:24Z"
  name: configmap-file
  namespace: default
  resourceVersion: "860848"
  uid: d5dce3f2-882e-4764-b038-ced95c966b40

volumeMount

配置挂载

在 volumes 中也可以使用 configMap,通过指定 configmap中的key 并且将value挂载到某个目录中。

编写Pod Yaml

kube-configMap-volumeMount.yml

apiVersion: v1
kind: Pod
metadata:
  name: configmap-volumemount
spec:
  containers:
  - name: configmap-volumemount-nginx
    image: nginx
    ports: 
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: index
      mountPath: /usr/share/nginx/html #nginx的index页面访问目录
  volumes:
  - name: index
    configMap:
      name: configmap-file
      items:
      - key: index.html #configmap中的key
        path: index.html #挂载后的文件名
      - key: index2.html
        path: index2.html

创建

[root@master configMap]# kubectl create -f kube-configMap-volumeMount.yml
pod/configmap-volumemount created

由于将文件挂载到了 nginx 的 /usr/share/nginx/html目录,如果成功挂载,应该是可以访问到。

直接访问容器

[root@master configMap]# kubectl exec -it configmap-volumemount -- curl 127.0.0.1
welcome to use configMap
I'm index111
[root@master configMap]# kubectl exec -it configmap-volumemount -- curl 127.0.0.1/index2.html
welcome to use configMap
I'm index222

index.html与index2.html都能正确访问的,并且内容正确。


到这就简单介绍完了ConfigMap,大家如果没有分布式配置中心,又需要配置与容器分离,可以尝试这种方式。

欢迎关注,学习不迷路!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐