k8s configmap的简单使用

发布时间 2023-10-18 11:05:59作者: 南风丶轻语

k8s ConfigMap

背景

​ 当我们制作docker镜像时,一般容器内的服务是需要配置文件的。制作时,有一个默认的配置文件(也可能没有)。

​ 我们使用docker镜像时,通常会挂载一些路径,路径中则包含了服务需要的配置文件。这样就把配置文件和docker镜像解耦了

​ 在k8s中,我们可以通过configmap的方式,达到上面的解耦目的。

介绍

​ k8s的configmap,简单来说,就是用来保存键值对的配置。

创建

​ 创建configmap有以下几种方式

指定键值对方式

直接在命令行中通过--from-literal参数,显示写出要保存的键值对

例子

创建命令

kubectl create configmap myconfigmap --from-literal=user=admin --from-literal=pass=111111

image-20230925110421455

查看configmap

kubectl describe configmap myconfigmap

image-20230925110711681

指定文件方式

直接在命令行中通过--from-file指定文件,默认的key是文件名,默认value是文件的内容

例子

kubectl create configmap configmap2  --from-file=config1.txt --from-file=config2.txt

image-20230925111459102

查看configmap

kubectl describe configmap configmap2

image-20230925111547673

可以指定key,而不是使用默认的文件名

kubectl create configmap configmap3  --from-file=config1=config1.txt --from-file=config2=config2.txt

image-20230925112033147

指定目录方式

和指定文件方式一致,只不过给定的参数--from-file是目录

目录结构

image-20230925152357552

kubectl create configmap configmap4 --from-file=config_path

查看configmap

image-20230925152428020

依旧以文件名为key,文件内容为value

通过yml文件创建

可以通过在yml中写入键值对的方式创建

config3.yml

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap2
  namespace: default
data:
  cache_host: memcached-gcxt #普通的键值对写法
  cache_port: "11211" #普通的键值对写法
  cache_prefix: gcxt #普通的键值对写法
  my.cnf: | # 多行值写法 就是yml的格式
    [mysqld]
    log-bin = mysql-bin
    haha = hehe

运行

kubectl apply -f config3.yml

查看configmap

kubectl describe configmap my-configmap2

image-20230925152732213

使用

要想在pod中使用configmap,有以下几种方式使用

通过环境变量使用

可以在pod中,通过envFrom关键字使用configmap

这样获取的环境变量的key就是configmap的key,value就是configmap的value

例子

pod1.yml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
    - name: containers1                                   #容器名
      image: nginx           #容器所需的镜像
      imagePullPolicy: IfNotPresent                                   # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
      command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]        # 运行的命令 不可使用 bash
      envFrom:
        - configMapRef:
            name: myconfigmap
            

运行

kubectl apply -f pod1.yml

进入容器,查看环境变量

kubectl exec -it pod1 bash

image-20230925162523900

通过command参数使用

可以直接通过$(键的名称)的方式在command参数中使用configmap

例子

  1. 查看configmap有哪些
kubectl get configmap

image-20230926111057576

  1. 查看具体要使用的configmap
kubectl describe configmap myconfigmap

image-20230926110804866

可以看到有两个键值对,分别是pass=111111和user=admin

  1. 定义pod的yml文件

pod2.yml

# test-pod-configmap-cmd
apiVersion: v1
kind: Pod
metadata:
 name: test-pod-configmap-cmd
spec:
 containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
    env:
    - name: KEY1 # 设置容器中的key 可通过$(key的名称)使用
      valueFrom:
       configMapKeyRef:
        name: myconfigmap #configmap的name
        key: user # configmap中的key
    - name: KEY2 # 设置容器中的key 可通过$(key的名称)使用
      valueFrom:
       configMapKeyRef:
        name: myconfigmap #configmap的name
        key: pass # configmap中的key
 restartPolicy: Never
  1. 运行pod
kubectl apply -f pod2.yml
  1. 查看容器的日志

command就是输出了环境变量,因此查看日志,就能看到使用了configmap了

kubectl logs pods/test-pod-configmap-cmd

image-20230926110704435

通过挂载卷的方式使用

例子

  • 查看configmap
kubectl get configmap

image-20230926112915821

  • 查看要使用的configmap的详情

    这里使用myconfigmap和configmap3实验

    kubectl describe configmap myconfigmap configmap3
    

    image-20230926113150485

  • 编写yml文件

    pod-to-use-configmap-by-mount-file.yml

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-to-use-configmap-by-mount-file
    spec:
      containers:
        - name: nginx
          image: nginx
          imagePullPolicy: IfNotPresent
          #      command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)" ] command使用默认镜像的command
          volumeMounts:
            - mountPath: /home/mount1 # 挂载的路径
              name: volumes1 #这两个要对应上① 表示使用的卷的名称
            - mountPath: /homt/mount2 # 挂载的路径
              name: volumes2 #这两个要对应上② 表示卷的名称
      restartPolicy: Never # 重启策略
      volumes:
        - name: volumes1 #这两个要对应上① 表示使用的卷的名称
          configMap:
            name: myconfigmap #这是configmap中的名称
        - name: volumes2 #这两个要对应上② 表示卷的名称
          configMap:
            name: configmap3 #这是configmap中的名称
    
  • 运行pod

    kubectl apply -f pod-to-use-configmap-by-mount-file.yml
    

    image-20230926113345394

  • 查看pod中挂载的文件

    kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- ls /home/mount1
    kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- cat /home/mount1/user
    

    image-20230926134545199

    kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- ls /homt/mount2
    kubectl exec -it pod/pod-to-use-configmap-by-mount-file -- cat /homt/mount2/config1
    

    image-20230926134737286

    可以看到,在指定的挂载的路径,就生成了以configmap中key为文件名,value为文件内容的文件

链接

k8s之ConfigMap详细理解及使用_思维的深度的博客-CSDN博客

k8s之ConfigMap祥解 - 知乎 (zhihu.com)