K8s 中 ConfigMap 使用介绍

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 官方文档:ConfigMap

K8s 中 ConfigMap 使用介绍



一、ConfigMap 简介


1.使用 ConfigMap 的限制条件


二、ConfigMap 使用介绍


1.ConfigMap 的创建

2.Pod 中使用 ConfigMap


一、ConfigMap 简介



ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性。 官方文档:ConfigMap


1.使用 ConfigMap 的限制条件


  • ConfigMap 需要在 Pod 启动前创建出来。
  • 只有当 ConfigMap 和 Pod 处于同一 NameSpace(命名空间)时,Pod 才可以引用它。
  • 当 Pod 对 ConfigMap 进行挂载(VolumeMount)操作时,在容器内部只能挂载为目录,并不能挂载为文件。
  • 同时,当挂载已经存在的目录时,且目录内含有其它文件,ConfigMap 会将其覆盖掉。


二、ConfigMap 使用介绍



1.ConfigMap 的创建


1)使用目录创建


kubectl create configmap nginx-html --from-file=/etc/nginx/html


  • --from-file:指定在目录下的所有文件都会被用在 ConfigMap 里边创建一个键值对,键的名字就是文件名,值就是文件里内容。


2)使用文件创建


[root@localhost ~]# kubectl create configmap index-html --from-file=/etc/nginx/html/index.html


  • 在创建时,可以使用多个 --from-file 命令;
  • 如:kubctl create configmap index-html --from-file=1.txt --from-file=2.txt

3)使用字面值创建


kubectl create configmap dashboard --from-literal=dashboard.username=root --from-literal=dashboard.password=123123


  • 一般来说使用文件创建的方法用的还是比较多的;因为某些场景下可能需要将配置文件,挂载到容器内部。
  • 当然,我们也可以使用数据卷挂载的方式,来实现容器与配置文件的解耦。


2.Pod 中使用 ConfigMap


1)使用 ConfigMap 来替代环境变量


[root@localhost ~]# vim 1.yaml
apiVersion: v1                # API 版本 (使用 kubectl explain ConfigMap(具体类型) 即可查看到对应版本号)
kind: ConfigMap               # 类型为 ConfigMap
metadata:
  name: cm-01               # ConfigMap 的名称 (绑定时需要用到)
data:
  hostname: "河北彭于晏"           # Key 和 Value
  password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: zhangsan
    image: busybox
    command:                # 执行的命令 (下面的命令是查看系统的变量)
    - /bin/sh
    - -c
    - env
    env:                  # 配置环境变量
    - name: HostName            # 变量名
      valueFrom:
        configMapKeyRef:
          name: cm-01           # ConfigMap 名称 (要和上面对应)
          key: hostname           # ConfigMap 里边的 Key (要和上面对应)
    - name: Password
      valueFrom:
        configMapKeyRef:
          name: cm-01
          key: password
  restartPolicy: Never            # 当容器退出后. 不会进行重启操作
[root@localhost ~]# kubectl create -f 1.yaml
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan | egrep 'HostName|Password'


image.png


2)使用 ConfigMap 配置命令行参数


[root@localhost ~]# vim 2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-01
data:
  hostname: "河北彭于晏"
  password: "123123"
---
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: zhangsan
    image: busybox
    command:
    - /bin/sh
    - -c
    - echo $(hostname) $(password)
    envFrom:                # 1.6 版本后新增字段
    - configMapRef:
        name: cm-01
  restartPolicy: Never
[root@localhost ~]# kubectl create -f 2.yaml          # 启动前需要先将 1.yaml 文件 delete (因为 Pod 名称一样)
[root@localhost ~]# kubectl get | grep zhangsan
[root@localhost ~]# kubectl logs zhangsan


  • 在 K8s 1.6 版本后引入新字段 envFrom,可以实现 ConfigMap 中所有的 key:value 自动生成为环境变量。
  • env 和 envFrom 的区别:前者是可以自定义变量名,但需要重复性操作;后者是不能自定义变量名,但是很便捷。
  • configMapKeyRef 和 configMapRef 的区别:前者是需要指定 key 和 configmap,后者是只需要指定 configMap 即可。


image.png


3)通过数据卷插件使用 ConfigMap


[root@localhost ~]# kubectl create configmap nginx-html --from-file=/etc/nginx/html/
[root@localhost ~]# vim nginx-html.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html                # 挂载数据卷 (要跟下面的 name 名字相同)
      mountPath: /var/www/html          # 容器内的挂载路径
  volumes:
  - name: html                  # 创建一个数据卷
    configMap:                  # ConfigMap 方式
      name: nginx-html              # 要跟创建的 ConfigMap 相同 (绑定关系)
[root@localhost ~]# kubectl create -f nginx-html.yaml
[root@localhost ~]# kubectl get pod | grep nginx
[root@localhost ~]# kubectl exec -it nginx -- /bin/bash


image.png


这里出现了个问题:当我们对 ConfigMap 修改时,挂载到容器内的配置会不会一同修改呢。


请看下面操作:


[root@localhost ~]# kubectl edit configmap nginx-html
[root@localhost ~]# kubectl describe configmap nginx-html | grep -C 8 Data


image.png


  • 这也就是所谓热更新。可以看到 ConfigMap 的功能还是很不错的。


还有一个点就是,如果我们修改 ConfigMap 对应的配置文件,容器内的配置还会更新吗。


其实是不会的,请看下面的结构:


index.html  -->  ConfigMap  -->  Container          # 所以修改 index.html 文件并不会使 Container 实现热更新


4)SubPath 作用


  • 同一个 Pod 中多个容器挂载同一个卷时提供隔离。
  • 将 ConfigMap 和 Secret 作为文件挂载到容器中而不覆盖挂载目录下的文件。


[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
  volumes:
  - name: sub-volume
    hostPath:                 # 数据卷的类型为:挂载到宿主机指定目录
      path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash     # 当 Pod 内有多个容器时. 需要使用 -c 指定容器


image.png


当我们想要实现在同一数据卷,但数据相互隔离的操作时,就需要用到 subpath


[root@localhost ~]# vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: zhangsan
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
      subPath: nginx              # 这里的名字会在挂载目录下创建一个相同名字的目录
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: sub-volume
      mountPath: /zhangsan
      subPath: tomcat             # 这里的名字会在挂载目录下创建一个相同名字的目录
  volumes:
  - name: sub-volume
    hostPath:
      path: /zhangsan
[root@localhost ~]# kubectl create -f nginx.yaml
[root@localhost ~]# kubectl get pod | grep zhangsan
[root@localhost ~]# kubectl exec -it zhangsan -c nginx -- /bin/bash


image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
存储 Kubernetes 开发工具
k8s学习--ConfigMap详细解释与应用
ConfigMap 是 Kubernetes 中用于管理非机密配置数据的 API 对象,可将应用配置与容器分离,便于动态管理和更新。它支持四种创建方式:命令行参数、多个文件、文件内的键值对以及 YAML 资源清单文件。ConfigMap 可通过环境变量或挂载为卷的方式传递给 Pod,并且当通过卷挂载时支持热更新。这使得配置管理更加灵活和安全,无需重新部署应用即可更新配置。
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习笔记之ConfigMap和Secret
k8s学习笔记之ConfigMap和Secret
|
3月前
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes(K8S) 配置管理-ConfigMap 介绍
Kubernetes(K8S) 配置管理-ConfigMap 介绍
46 1
|
3月前
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
6月前
|
存储 Kubernetes API
k8s学习-ConfigMap(创建、使用、更新、删除等)
k8s学习-ConfigMap(创建、使用、更新、删除等)
1981 0
|
6月前
|
存储 Kubernetes 数据安全/隐私保护
Kubernetes的ConfigMap和Secret
Kubernetes的ConfigMap和Secret
121 0
|
6月前
|
JSON Kubernetes API
kubernetes核心技术之ConfigMap知识点总结
kubernetes核心技术之ConfigMap知识点总结
64 0
|
6月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes|关于configMap的一些学习
云原生|kubernetes|关于configMap的一些学习
76 1
|
存储 Kubernetes 调度
【云原生】k8s核心概念—Pod & Controller & Service & Serect & ConfigMap介绍——20230213
【云原生】k8s核心概念—Pod & Controller & Service & Serect & ConfigMap介绍——20230213
275 0
|
存储 Kubernetes 关系型数据库
【Kubernetes的Configmap、SecretMetric service及HPA、Wordpress应用Mysql主从PVPVCSCHPA】
【Kubernetes的Configmap、SecretMetric service及HPA、Wordpress应用Mysql主从PVPVCSCHPA】
119 0

推荐镜像

更多