k8s---Configmap

Configmap配置管理

Configmap存储特点

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

典型的使用场景

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

创建ConfigMap的四种方式

1. 使用字面值创建

mkdir configmap

cd configmap/

kubectl create configmap my-cm --from-literal=key1=cm1 --from-literal=key2=cm2    ##字面值创建,有两个键值:key1=cm1、key2=cm2

kubectl get cm    ##查看cm

kubectl describe cm my-cm    ##查看描述

k8s---Configmap_第1张图片

2. 使用文件创建

kubectl create configmap my-cm1 --from-file=/etc/hosts     

kubectl describe cm my-cm1

k8s---Configmap_第2张图片

可见文件名为数据名称,文件内容为数据内容

3. 使用目录创建

mkdir test

cd test

echo 111 > key1

echo 222 > key2

echo 333 > key3

cd ..

kubectl create configmap my-cm2 --from-file=test

kubectl describe cm my-cm2

k8s---Configmap_第3张图片

数据名称为目录中文件的名称,数据内容为文件所对应的内容

4. 编写configmap的yaml文件创建

vim cm1.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm1-config
data:
  db_host: "172.25.0.250"
  db_port: "3306"

kubectl apply -f cm1.yaml    ##应用

kubectl describe cm cm1-config

k8s---Configmap_第4张图片

如何使用configmap

示例使用用yaml文件创建的cm1-config 

1.  使用configmap设置环境变量

vim pod1.yaml     ##使用指定cm中的数据内容

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    ##指定cm
              key: db_host        ##指定cm中的数据
        - name: key2
          valueFrom:
            configMapKeyRef:
              name: cm1-config
              key: db_port
  restartPolicy: Never

kubectl apply -f pod1.yaml

kubectl logs pod1     ##查看日志

k8s---Configmap_第5张图片

vim pod1.yaml    ##继续编辑,直接指定cm

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: pod1
      image: busyboxplus
      command: ["/bin/sh", "-c", "env"]
      envFrom:
        - configMapRef:         ##直接指定cm,数据名称即为变量名称
            name: cm1-config
  restartPolicy: Never

kubectl delete -f pod1.yaml

kubectl apply -f pod1.yaml

kubectl logs pod1

k8s---Configmap_第6张图片

 kubectl delete pod pod1

2. 使用conigmap设置命令行参数

vim pod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
    - name: pod2
      image: busyboxplus
      command: ["/bin/sh", "-c", "echo $(db_host) $(db_port)"]    ##直接使用键值
      envFrom:
        - configMapRef:
            name: cm1-config
  restartPolicy: Never

kubectl apply -f pod2.yaml

kubectl logs pod2

kubectl delete -f pod2.yaml

3. 通过数据卷使用configmap

vim pod3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod3
spec:
  containers:
    - name: pod3
      image: busyboxplus
      command: ["/bin/sh", "-c", "ls -l /config"]    ##执行命令
      volumeMounts:
      - name: config-volume
        mountPath: /config                           ##容器内的挂载点
  volumes:
    - name: config-volume
      configMap:
        name: cm1-config                             ##要挂德cm
  restartPolicy: Never

kubectl apply -f pod3.yaml

kubectl logs pod3

kubectl delete -f pod3.yaml

configmap热更新

以更新nginx的端口为例

vim nginx.conf

server {
    listen       8000;        ##端口
    server_name  _;

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

kubectl create configmap nginx-conf --from-file=nginx.conf   ##以该配置文件创建一个cm

vim nginx.yaml     ##将配置文件挂载到nginx的配置文件目录

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          volumeMounts:
          - name: config-volume
            mountPath: /etc/nginx/conf.d
      volumes:
        - name: config-volume
          configMap:
            name: nginx-conf

kubectl apply -f nginx.yaml

kubectl exec my-nginx-8d9fd4fb6-l6kvp -- ls /etc/nginx/conf.d     ##在容器中执行ls命令

kubectl exec my-nginx-8d9fd4fb6-l6kvp -- cat /etc/nginx/conf.d/nginx.conf     ##在容器中执行cat命令

k8s---Configmap_第7张图片

访问该容器

k8s---Configmap_第8张图片

因为nginx默认为80端口,但配置文件里写的是8000,所以直接访问ip会失败,访问8000端口才可以

kubectl edit cm nginx-conf     ##更改cm内容

k8s---Configmap_第9张图片

k8s---Configmap_第10张图片

此nginx容器的配置文件是挂载的nginx-conf(cm),所以容器内文件也会改变(数据可能会有延迟)

现在只是改变了配置文件,若想让更改生效,还需重启服务

kubectl delete pod my-nginx-8d9fd4fb6-l6kvp     ##删除pod,因为是控制器,所以会重新拉起一个新的pod。这个过程就相当于重启nginx

再次访问

k8s---Configmap_第11张图片

端口以更改为8080(若不想让客户端访问容器的ip改变,可以创建一个svc调度器,让控制器的pod充当其后端。并且还这样可以暴露外部ip,供外部访问,在这里不再演示。)

除了删除pod,还有另外一个方法可以滚动更新pod

k8s---Configmap_第12张图片

更改cm的数据内容,端口为8010

kubectl patch deployments.apps my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20211026"}}}}}'     ##手动更新

再次访问试试

k8s---Configmap_第13张图片

8081端口访问成功 

你可能感兴趣的:(kubernetes,容器)