k8s学习--ConfigMap详细解释与应用

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: ConfigMap 是 Kubernetes 中用于管理非机密配置数据的 API 对象,可将应用配置与容器分离,便于动态管理和更新。它支持四种创建方式:命令行参数、多个文件、文件内的键值对以及 YAML 资源清单文件。ConfigMap 可通过环境变量或挂载为卷的方式传递给 Pod,并且当通过卷挂载时支持热更新。这使得配置管理更加灵活和安全,无需重新部署应用即可更新配置。

一 什么是configmap

简单理解
kubernetes集群可以使用ConfigMap来实现对容器中应用的配置进行管理
(就是可以把一些应用的conf文件内容写到里面)。
可以把ConfigMap看作是一个挂载到pod中的存储卷

详细解释
在 Kubernetes 中,ConfigMap 是一种 API 对象,用于存储非机密数据(如配置文件、环境变量、命令行参数等)。ConfigMap 允许您将应用程序的配置与容器化的应用程序分开管理,从而实现配置的灵活和动态管理。

ConfigMap 的核心概念

  1. Key-Value 存储:ConfigMap 以键值对的形式存储数据。每个键和值都是字符串,可以用来配置应用程序的各种参数。
  2. 数据来源:ConfigMap 的数据可以从多种来源创建,包括命令行参数、文件、目录或者现有的 ConfigMap。
  3. 非机密性:ConfigMap 专门用于存储非机密数据。对于机密数据(如密码、令牌),应使用 Kubernetes 的 Secret 对象。

组合使用
你可以将 ConfigMap 的数据同时作为环境变量和文件挂载,以灵活满足应用程序的需求。

ConfigMap 的好处

  1. 分离配置和代码:通过使用 ConfigMap,可以将配置数据与应用程序代码分离开来,便于管理和修改配置,而无需重建镜像或重新部署应用。
  2. 动态更新配置:在不重启 Pod 的情况下,更新 ConfigMap 可以立即反映在应用程序中(前提是应用程序支持热加载配置)。
  3. 简化管理:通过 Kubernetes 的 API,可以方便地创建、更新和删除 ConfigMap,从而简化配置管理。
  4. 增强安全性:将非机密配置与机密数据分开管理,增强了集群的安全性。对于机密数据,应该使用 Secret 对象。

ConfigMap 的限制

  1. 非机密性:ConfigMap 不适用于存储机密数据,因为它们以纯文本形式存储,任何有权限访问 ConfigMap 的人都可以读取其中的数据。
  2. 大小限制:单个 ConfigMap 的大小有限制(通常为 1MB),因此不适合存储大数据量的配置。
  3. 应用程序支持:应用程序需要具备从环境变量或文件读取配置的能力,否则无法利用 ConfigMap 的优势。

二.创建ConfigMap的4种方式

1.在命令行指定参数创建

image.png

[root@master ~]# kubectl create configmap cm1 --from-literal=host=127.0.0.1 --from-literal=port=3306
[root@master ~]# kubectl describe cm cm1

image.png

2.在命令行通过多个文件创建

通过指定文件创建,即将一个配置文件创建为一个ConfigMap,--from-file=文件路径:
[root@master ~]# echo -n 127.0.0.1 > host
[root@master ~]# echo -n 3306 > port
[root@master ~]# kubectl create configmap cm2 --from-file=./host --from-file=./port
[root@master ~]# kubectl describe cm cm2

image.png

3.在命令行通过文件提供多个键值对创建

通过一个文件内多个键值对,--from-env-file=文件路径
[root@master ~]# vim env.txt
写入
host=127.0.0.1
port=3306

[root@master ~]# kubectl create configmap cm3 --from-env-file=env.txt
[root@master ~]# kubectl describe cm cm3
image.png

4.YAML资源清单文件创建

[root@master ~]# vim cm4.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: cm4
data:
  host: 127.0.0.1
  port: "3306"

[root@master ~]#  kubectl apply -f cm4.yml
configmap/cm4 created
[root@master ~]#  kubectl describe cm cm4
Name:         cm4
Namespace:    default
Labels:       <none>
Annotations:
Data
====
host:
----
127.0.0.1
port:
----
3306
Events:  <none>

三 configmap的两种使用方法

1.通过环境变量的方式传递给pod

[root@master ~]# vim pod-cm1.yaml

 apiVersion: v1
kind: Pod
metadata:
  name: pod-cm1
spec:
  containers:
  - name: busybox
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    envFrom:
    - configMapRef:
        name: cm1

[root@master ~]# kubectl apply -f pod-cm1.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec pod-cm1 -- env

image.png

2.通过volume的方式挂载到pod内

[root@master ~]# vim pod-cm2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-cm2
spec:
  containers:
  - name: busybox
    image: busybox
    args: [ "/bin/sh", "-c", "sleep 10000" ]
    volumeMounts:
    - name: vol-cm
      mountPath: "/etc/mysql"
      readOnly: true

  volumes:
  - name: vol-cm
    configMap:
      name: cm2

[root@master ~]# kubectl apply -f pod-cm2.yml
[root@master ~]# kubectl get pod
[root@master ~]# kubectl exec pod-cm2 -- cat /etc/mysql/host
127.0.0.1
[root@master ~]# kubectl exec pod-cm2 -- cat /etc/mysql/port
3306

可以看到内容

3.应用举例

[root@master ~]# echo "test-test" > nginx.conf #产生测试用的nginx.conf文件
[root@master ~]# kubectl create configmap nginxconf --from-file=/root/nginx.conf
[root@master ~]# kubectl describe cm nginxconf
[root@master ~]# vim pod-nginxconf.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.20
    volumeMounts:                               # 用volume挂载方式
    - name: vol-nginx                              # 对应下面的volume名
      mountPath: "/testdir"                           # 挂载到容器内部的路径
      readOnly: true                                # 只读

  volumes:
  - name: vol-nginx                                # 卷名称
    configMap:
      name: nginxconf                             # configmap的名称

[root@master ~]# kubectl apply -f pod-nginxconf.yaml
[root@master ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf
image.png

ConfigMap的热更新

如果修改了value, 那么容器内部会不会更新?
ConfigMap热更新方式
通过环境变量的方式传递给pod。这种方式不会热更新
通过volume的方式挂载到pod内。这种方式会热更新,大概需要半分钟左右。
[root@master ~]# kubectl edit cm nginxconf
修改test-test 为 test-page
[root@master ~]# kubectl exec -it nginx -- cat /testdir/nginx.conf #等待一会
image.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
15小时前
|
存储 Kubernetes 开发工具
k8s练习--StorageClass详细解释与应用
本文介绍了Kubernetes中的`StorageClass`,这是一种用于定义不同存储提供者配置的抽象机制,能够动态生成PersistentVolume(PV),简化存储管理。文中详细描述了如何在K8s集群中配置和使用`StorageClass`,包括搭建NFS服务器、配置RBAC权限、创建StorageClass及关联PVC和Pod的过程,并通过实验验证了动态PV的创建和删除功能。实验环境包含一个Master节点和两个Node节点,以及一台NFS服务器。
|
15小时前
|
存储 Kubernetes 数据安全/隐私保护
k8s学习--Secret详细解释与应用
Secret 支持四种类型: - **Opaque Secrets**:存储任意类型机密数据,需自行加密。 - **Service Account Token Secrets**:自动管理 API 访问令牌。 - **Docker Registry Secrets**:存储 Docker 私有仓库认证信息。 - **TLS Secrets**:存储 TLS 证书和私钥,用于加密通信。
|
2月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
41 0
|
4月前
|
运维 负载均衡 Serverless
函数计算产品使用问题之yaml如果写多个function,可不可以yaml在构建的时候能构建多个函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
JSON Kubernetes API
k8s学习-k8s资源对象与yaml结构
k8s学习-k8s资源对象与yaml结构
88 0
|
11月前
|
JSON Kubernetes API
k8s教程(pod篇)-定义与基本用法
k8s教程(pod篇)-定义与基本用法
195 0
YAML+PyYAML笔记 3 | YAML集合、结构、标量、标记使用
YAML+PyYAML笔记 3 | YAML集合、结构、标量、标记使用
85 0
|
存储 Kubernetes 安全
【k8s 系列】k8s 学习二十三-2,ConfigMap 补充 和 Secret
对于上一篇文章我们分享了为什么要使用 ConfigMap ,我们创建 ConfigMap 的时候可以传入单个或者多个键值对,也可以传入文件,还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量
109 0
|
存储 Kubernetes 网络协议
k8s入门-定义一个Pod
k8s入门-定义一个Pod
273 0
|
XML 存储 JSON