kustomize (二) ConfigMap 的生成和滚动更新

本文介绍Kustomize中ConfigMap的声明及更新方法,包括通过ConfigMapGenerator声明ConfigMap、使用ConfigMap更新部署等内容,并演示了如何实现ConfigMap的滚动更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述


1.ConfigMap声明方法

kustomize 提供了两种添加 ConfigMap 的方法:

  • 将 ConfigMap 声明为 resource
  • 通过 ConfigMapGenerator 声明 ConfigMap

在 kustomization.yaml 中,这两种方法的格式分别如下:

# 将 ConfigMap 声明为 resource
resources:
- configmap.yaml

# 在 ConfigMapGenerator 中声明 ConfigMap
configMapGenerator:
- name: a-configmap
  files:
    - configs/configfile
    - configs/another_configfile

声明为 resource 的 ConfigMaps 的处理方式与其他 resource 相同,Kustomize 不会在为 ConfigMap 的名称添加哈希后缀。而在 ConfigMapGenerator 中声明 ConfigMap 的处理方式则与之前不同,默认将为名称添加哈希后缀,ConfigMap 中的任何更改都将触发滚动更新。

2.修改base添加 ConfigMapGenerator字面值的configmap

hello_world 示例中,使用 ConfigmapGenerator 来替换将 ConfigMap 声明为 resource 的方法。由此生成的 ConfigMap 中的更改将导致哈希值更改和滚动更新
注意:在helloworld运用的文件基础上修改

cat <<'EOF' >$BASE/kustomization.yaml
commonLabels:
  app: hello
resources:
- deployment.yaml
- service.yaml
configMapGenerator:
- name: the-map
  literals:
    - altGreeting=Good Morning!
    - enableRisky="false"
EOF

2. staging创建

通过应用 ConfigMap patch 的方式建立 staging

#!/bin/bash
export OVERLAYS=$DEMO_HOME/overlays
mkdir -p $OVERLAYS/staging

cat <<'EOF' >$OVERLAYS/staging/kustomization.yaml
namePrefix: staging-
nameSuffix: -v1
commonLabels:
  variant: staging
  org: acmeCorporation
commonAnnotations:
  note: Hello, I am staging!
resources:
- ../../base
patchesStrategicMerge:
- map.yaml
EOF

cat <<EOF >$OVERLAYS/staging/map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: the-map
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"
EOF

3. configmap变动分析

在集群中运行的 hello-world 的 deployment 配置了来自 configMap 的数据。

deployment 按照名称引用此 ConfigMap :

$ grep -C 2 configMapKeyRef $BASE/deployment.yaml
       - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              name: the-map
              key: altGreeting
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              name: the-map
              key: enableRisky

当 ConfigMap 中的数据需要更新时,更改群集中的实时 ConfigMap 的数据并不是一个好的做法。 由于 Deployment 无法知道其引用的 ConfigMap 已更改,这类更新是无效。

更改 Deployment 配置的推荐方法是:

  • 使用新名称创建一个新的 configMap
  • 为deployment 添加 patch,修改相应 configMapKeyRef 字段的名称值。

后一种更改会启动对 deployment 中的 pod 的滚动更新。旧的 configMap 在不再被任何其他资源引用时最终会被垃圾回收

4. 如何使用 kustomize支持ConfigMap 的生成和滚动更新

staging 的 variant 包含一个 configMap 的 patch:

$ cat $OVERLAYS/staging/map.yaml
piVersion: v1
kind: ConfigMap
metadata:
  name: the-map #名字要与base目录中kustomization.yaml的configMapGenerator的名字一至
data:
  altGreeting: "Have a pineapple!"
  enableRisky: "true"

根据定义,此 patch 是一个命名但不一定是完整的资源规范,旨在修改完整的资源规范。

在 ConfigMapGenerator 中声明 ConfigMap 的修改。

$ grep -C 4 configMapGenerator $BASE/kustomization.yaml
  app: hello
resources:
- deployment.yaml
- service.yaml
configMapGenerator:
- name: the-map
  literals:
    - altGreeting=Good Morning!
    - enableRisky="false"

要使这个 patch 正常工作,metadata/name 字段中的名称必须匹配

但是,文件中指定的名称值不是群集中使用的名称值。根据设计,kustomize 修改从 ConfigMapGenerator 声明的 ConfigMaps 的名称。要查看最终在群集中使用的名称,只需运行 kustomize:

$ kustomize build $OVERLAYS/staging | grep -B 8 -A 1 staging-the-map
kind: ConfigMap
metadata:
  annotations:
    note: Hello, I am staging!
  labels:
    app: hello
    org: acmeCorporation
    variant: staging
  name: staging-the-map-hhhhkfmgmk  #新名字
---
--
        - /hello
        - --port=8080
        - --enableRiskyFeature=$(ENABLE_RISKY)
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              key: altGreeting
              name: staging-the-map-hhhhkfmgmk #新名字
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: staging-the-map-hhhhkfmgmk #新名字
        image: monopole/hello:1

根据 $OVERLAYS/staging/kustomization.yaml 中的 namePrefix 字段,configMap 名称以 staging- 为前缀。

根据 $OVERLAYS/staging/kustomization.yaml 中的 nameSuffix 字段,configMap 名称以 -v1 为后缀。

configMap 名称的后缀是由 map 内容的哈希生成的 - 在这种情况下,名称后缀是 5276h4th55 :

$ kustomize build $OVERLAYS/staging |grep k25m8k5k5m
  name: staging-the-map-v1-k25m8k5k5m
              name: staging-the-map-v1-k25m8k5k5m
              name: staging-the-map-v1-k25m8k5k5m

现在修改 map patch ,更改该服务将使用的问候消息:(configmap名称也会随之统一修改

$ sed -i.bak 's/pineapple/kiwi/' $OVERLAYS/staging/map.yaml

查看新的问候消息:

$ kustomize build $OVERLAYS/staging | grep -B 2 -A 3 kiwi
apiVersion: v1
data:
  altGreeting: Have a kiwi!
  enableRisky: "true"
kind: ConfigMap
metadata:

再次运行 kustomize 查看新的 configMap 名称:

$ kustomize build $OVERLAYS/staging |    grep -B 8 -A 1 staging-the-map
kind: ConfigMap
metadata:
  annotations:
    note: Hello, I am staging!
  labels:
    app: hello
    org: acmeCorporation
    variant: staging
  name: staging-the-map-v1-cd7kdh48fd  #后缀发生改变
---
--
        - /hello
        - --port=8080
        - --enableRiskyFeature=$(ENABLE_RISKY)
        env:
        - name: ALT_GREETING
          valueFrom:
            configMapKeyRef:
              key: altGreeting
              name: staging-the-map-v1-cd7kdh48fd  #后缀发生改变
        - name: ENABLE_RISKY
          valueFrom:
            configMapKeyRef:
              key: enableRisky
              name: staging-the-map-v1-cd7kdh48fd #后缀发生改变
        image: monopole/hello:1

确认 configMap 内容的更改将会生成以 cd7kdh48fd 结尾的三个新名称 - 一个在 configMap 的名称中,另两个在使用 ConfigMap 的 deployment 中:

$ test 3 ==   $(kustomize build $OVERLAYS/staging | grep cd7kdh48fd | wc -l);   echo $?
0

将这些资源应用于群集将导致 deployment pod 的滚动更新,将它们从 k25m8k5k5m map 重新定位到 cd7kdh48fd map 。系统稍后将垃圾收集未使用的 map。

确保一至后进行部署即可。

kustomize build $OVERLAYS/staging | kubectl apply -f -

5. ConfigMapGenerator挂载文件

第一种方法file

创建包含 ConfigMapGenerator 的 kustomization.yaml 文件

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-4
  files:
  - configure-pod-container/configmap/kubectl/game.properties
EOF

使用 kustomization 目录创建 ConfigMap 对象:

kubectl apply -k .

第二种方法envs

configMapGenerator:
- envs:
  - env-file
  name: service1-env-vars

第三种方法(应对绝对路径)

configMapGenerator:
- name: etcd-env
  files:
  - /etc/etcd.env  #
$ kustomize build  .
Error: loading KV pairs: file sources: [/etc/etcd.env]: security; file '/etc/etcd.env' is not in or below '/root/gitlab/etcdbackup/base'

–load_restrictor=none参数解决

kustomize build --load_restrictor=none .

扩展阅读:

<think>好的,用户想学习DockerKubernetes,需要推荐学习资料、入门教程最佳实践。首先,我需要整理已有的引用内容。根据提供的引用,有三个来源:[^1]提到DockerKubernetes的入门到进阶指南,包括安装、基础命令、Pod编写、部署应用、服务暴露自动化管理。[^2]强调云原生技术的基础概念,Docker镜像构建Kubernetes的自动化部署。[^3]则涉及Docker解决开发工作流程的问题。 接下来,应该分步骤回答。先推荐官方文档,因为这是最权威的资料。然后列出入门教程,包括书籍在线课程,比如《Kubernetes权威指南》Udemy的课程。接着是实践平台,比如Play with Kubernetes,帮助用户实际操作。最佳实践部分需要涵盖镜像优化、配置管理、健康检查等,这些都是引用中提到的关键点。最后,加入社区资源,如官方博客Stack Overflow,方便用户持续学习。 要注意用户可能对从哪里开始学习感到困惑,所以结构要清晰,从基础到进阶,逐步引导。同时,确保推荐的学习资料覆盖理论实践,尤其是引用中提到的Docker安装、Kubernetes部署等。还要检查是否需要补充其他资源,但根据现有引用,应该足够覆盖主要点。最后,生成相关问题,帮助用户深化学习,比如比较DockerKubernetes,或者监控工具的选择。</think>### Docker Kubernetes 学习指南 #### 一、学习资料推荐 1. **官方文档** - **Docker 官方文档**:从安装到核心概念(镜像、容器、卷、网络)均有详细说明,适合系统性学习[^1]。 - **Kubernetes 官方文档**:涵盖集群搭建、Pod 管理、服务暴露等核心内容,附代码示例。 2. **入门教程** - **书籍**:《Docker 从入门到实践》《Kubernetes权威指南》,适合理论与实践结合。 - **在线课程**:Udemy 的 *Docker Mastery* Coursera 的 *Kubernetes and Cloud Native* 系列课程。 3. **最佳实践** - **镜像优化**:使用多阶段构建减小镜像体积,避免以 root 用户运行容器。 - **配置管理**:通过 Kubernetes 的 `ConfigMap` `Secret` 管理环境配置。 - **健康检查**:在部署中配置 `livenessProbe` `readinessProbe` 提升应用可靠性。 #### 、实践工具推荐 1. **本地实验环境** - **Docker Desktop**:内置 Kubernetes 集群,支持一键启用。 - **Minikube** 或 **Kind**:轻量级 Kubernetes 本地集群工具,适合开发测试。 2. **云平台实践** - **Google Kubernetes Engine (GKE)** 或 **Amazon EKS**:托管式 Kubernetes 服务,可快速部署生产级集群[^2]。 #### 三、关键概念与操作 1. **Docker 核心操作** - 构建镜像:`docker build -t my-app .` - 运行容器:`docker run -d -p 8080:80 my-app` - 查看日志:`docker logs <container-id>`。 2. **Kubernetes 核心对象** - **Pod**:最小调度单元,可包含多个容器。 - **Deployment**:定义应用副本数与滚动更新策略。 - **Service**:暴露应用至集群内/外,支持负载均衡。 ```yaml # 示例:Kubernetes Deployment 配置 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 ``` #### 四、社区与进阶资源 1. **社区支持** - **Stack Overflow**:搜索常见问题如“如何调试 Kubernetes Pod 启动失败”。 - **GitHub 开源项目**:参考 *Kubernetes-sigs* 下的工具(如 `kustomize`)。 2. **进阶内容** - **服务网格**:学习 Istio 或 Linkerd 实现微服务通信治理。 - **CI/CD 集成**:结合 Jenkins 或 GitLab CI 实现容器化流水线。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ghostwritten

口渴,请赏一杯下午茶吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值