1 Configmap的介绍

Configmap用于保存配置数据,以键值对形式存储;configMap 资源提供了向 Pod 注入配置数据的方法。旨在让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。

典型的使用场景:

  • 填充环境变量的值
  • 设置容器内的命令行参数
  • 填充卷的配置文件

2 创建ConfigMap的方式

2.1 使用字面值创建

(1)创建ConfigMap:

kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2

(2)查看名为my-config 的 configmap的详细信息:

kubectl describe cm my-config 

在这里插入图片描述

2.2 使用文件创建

(1)创建ConfigMap:

kubectl create configmap my-config-2 --from-file=/etc/resolv.conf
## key的名称是文件名称,value的值是这个文件的内容

(2)查看名为my-config-2 的 configmap的详细信息:

kubectl describe cm my-config-2 

在这里插入图片描述
在这里插入图片描述

2.3 使用目录创建

在这里插入图片描述
(1)创建ConfigMap:

kubectl create configmap my-config-3 --from-file=test
## 目录中的文件名为key,文件内容是value

(2)查看名为my-config-3 的 configmap的详细信息:

kubectl describe cm my-config-3

在这里插入图片描述

2.4 编写configmap的yaml文件

(1)编辑yaml文件:vim cm1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.0.250"
  db_port: "3306"
  • 应用文件:kubectl create -f cm1.yaml

(2)查看名为cm1-config 的 configmap的详细信息:

kubectl describe cm cm1-config 

在这里插入图片描述

3 如何使用configmap

3.1 通过环境变量的方式直接传递给pod

(1)使用configmap设置环境变量

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"] ## 打印环境变量
      env:
        - name: key1
          valueFrom:  ## 值来自哪
            configMapKeyRef:
              name: cm1-config
              key: db_host
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never  ## 运行完结束

(2)应用文件:kubectl apply -f pod1.yml

[root@server2 ~]# kubectl get pod
NAME   READY   STATUS      RESTARTS   AGE
pod1   0/1     Completed   0          13s
[root@server2 ~]# kubectl logs pod1 
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=pod1
SHLVL=1
HOME=/
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
key1=172.25.0.250
key2=3306
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1

(3)应用文件创建pod:kubectl apply -f pod2.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busybox
      command: ["/bin/sh", "-c", "env"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never
[root@server2 ~]# kubectl get pod
NAME   READY   STATUS      RESTARTS   AGE
pod1   0/1     Completed   0          3m46s
pod2   0/1     Completed   0          6s
[root@server2 ~]# kubectl logs pod2
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT=443
HOSTNAME=pod2
SHLVL=1
HOME=/
db_port=3306
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_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_PORT_HTTPS=443
PWD=/
KUBERNETES_SERVICE_HOST=10.96.0.1
db_host=172.25.0.250

3.2 通过在pod的命令行下运行的方式

(1)应用文件:kubectl apply -f pod3.yml ,创建pod3

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      ## 输出变量的值
      command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never
  • 查看pod3的日志信息:kubectl logs pod3

在这里插入图片描述

2.3 作为volume的方式挂载到pod内

(1)应用文件:kubectl apply -f pod4.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod4
spec:
  containers:
    - name: pod4
      image: busyboxplus
      command: ["/bin/sh", "-c", "ls -l /config"]
      volumeMounts:
      - name: config-volume
        mountPath: /config  ## 如果容器中没有此目录会创建
  volumes:
    - name: config-volume
      configMap: ## 当挂载名为config-volume映射到cm1-config
        name: cm1-config
  restartPolicy: Never
  • 查看pod4的信息:kubectl logs pod4

kubectl apply -f pod4.yml

4 configmap热更新

(1)应用文件:kubectl apply -f pod1.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      stdin: true
      tty: true
      volumeMounts:
      - name: config-volume
        mountPath: /config
  volumes:
    - name: config-volume
      configMap:
        name: cm1-config

(2)查看pod的信息:kubectl get pod

在这里插入图片描述

  • 进入容器的交互界面,读取/congig全部的内容
kubectl attach pod1 -it

在这里插入图片描述

(3)编辑cm: kubectl edit cm cm1-config ,修改cm1-config的信息

在这里插入图片描述

  • 进入容器的交互界面,读取/congig全部的内容:kubectl attach pod1 -it,修改并未生效

在这里插入图片描述

  • configmap热更新后,并不会触发相关Pod的滚动更新,需要手动触发:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginx-conf

vim default.conf

default.conf 
server {
    listen       8080;
    server_name  _;

    location / {
        root /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

创建configmap:kubectl create configmap nginx-config --from-file=default.conf
在这里插入图片描述

  • 应用文件:kubectl apply -f demo.yml
  • 查看pod的信息:kubectl get pod

在这里插入图片描述

  • 查看pod的详细信息:kubectl describe pod demo-75679c99b4-fs68p,nginx服务的配置目录成功挂载

在这里插入图片描述
测试:

(1)进入容器的shell的交互环境:kubectl exec -it demo-75679c99b4-fs68p -- sh

  • 查看nginx服务的端口:cd /etc/nginx/conf.d/

在这里插入图片描述

  • 查看pod的详细信息:kubectl get pod -o wide
  • 访问容器的8080端口:curl 10.244.22.16:8080

在这里插入图片描述

(2)修改nginx服务的配置文件:kubectl edit cm nginx-config
在这里插入图片描述

  • 查看nginx-config 的详细信息:kubectl describe cm nginx-config

在这里插入图片描述

  • configmap热更新已生效,但访问Pod的8080端口人然可以访问

在这里插入图片描述

进入容器的shell的交互环境:kubectl exec -it demo-75679c99b4-fs68p -- sh

在这里插入图片描述

(3)解决方法一

  • 需要手动触发Pod滚动更新, 这样才能再次加载nginx.conf配置文件

在这里插入图片描述

(4) 解决方法2:打补丁

kubectl patch deployments.apps demo --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20210219"}}}}}'

在这里插入图片描述

  • 查看pod的详细信息:kubectl get pod -o wide

在这里插入图片描述

  • 测试:
  • 查看nginx的配置信息:kubectl edit cm nginx-config

在这里插入图片描述

  • 查看 nginx-config的详细信息:kubectl describe cm nginx-config

在这里插入图片描述

  • 删除pod:kubectl delete pod demo-5756f5b97-hwhlm,控制器会生成新的pod

在这里插入图片描述

Logo

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

更多推荐