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

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

文章目录

1.ConfigMap声明方法

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

2. staging创建

3. configmap变动分析

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

5. ConfigMapGenerator挂载文件

第一种方法file

第二种方法envs

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

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 .

扩展阅读:


Create environment variables from env file with Kustomize

kustomize (一) 管理yaml部署入门hello world

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

kustomize (三) devops和开发配合管理配置数据behavior: merge、namePrefix、nameSuffix

kustomize (四) generatorOptions详解

kustomize (五) 使用vars将 k8s runtime数据注入容器

kustomize(六)命令行常用编排

kustomize (七)patches、patchesJson6902、patchesStrategicMerge详解

kustomize (八)生成secret

kustomize(九)使用终章


相关文章
|
Kubernetes 前端开发 Docker
使用GitLab CI/CD部署应用到Kubernetes集群的方案
使用GitLab CI/CD部署应用到Kubernetes集群的方案
4109 0
使用GitLab CI/CD部署应用到Kubernetes集群的方案
|
存储 SQL Cloud Native
深入了解云原生数据库CockroachDB的概念与实践
作为一种全球领先的分布式SQL数据库,CockroachDB以其高可用性、强一致性和灵活性等特点备受关注。本文将深入探讨CockroachDB的概念、设计思想以及实践应用,并结合实例演示其在云原生环境下的优越表现。
|
11月前
|
存储 Prometheus 监控
使用helm快速部署prometheus+Grafana
通过Helm快速部署Prometheus监控栈:添加仓库、更新缓存并安装kube-prometheus-stack。建议创建独立命名空间(如monitoring)进行隔离,使用`port-forward`临时访问Prometheus和Grafana界面。通过自定义values.yaml文件可配置持久化、密码等参数,实现灵活管理。
1272 0
|
关系型数据库 MySQL 数据库
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
907 2
|
8月前
|
Ubuntu 安全 Java
Docker 拉取部署 OpenJDK 全指南:替代方案、实操步骤与最佳实践
本文详解Docker部署OpenJDK全流程:搭建环境、选择eclipse-temurin等替代镜像,避开已弃用的官方镜像,通过Dockerfile构建应用,配置JVM参数与容器资源限制,并提供最佳实践与问题排查方案,助力企业级Java应用高效、安全运行。
4469 2
|
关系型数据库 MySQL 数据库
MySQL 集群部署实战指南:高可用与可扩展的数据库架构
本文深入讲解MySQL集群部署方案,涵盖主从复制、MHA高可用架构及InnoDB Cluster,结合实战配置与监控维护,助力构建高性能、高可用的数据库系统。
1921 0
|
关系型数据库 MySQL
mysql查看当前实时连接数最大连接数
mysql查看当前实时连接数最大连接数
3198 0
|
存储 消息中间件 监控
容器日志采集利器Log-Pilot
容器时代越来越多的传统应用将会逐渐容器化,而日志又是应用的一个关键环节,那么在应用容器化过程中,如何方便快捷高效地来自动发现和采集应用的日志,如何与日志存储系统协同来高效存储和搜索应用日志,本文将主要跟大家分享下如何通过Log-Pilot来采集容器的标准输出日志和容器内文件日志。
24097 0
|
NoSQL Java Spring
教程:Spring Boot与ETCD键值存储的整合
教程:Spring Boot与ETCD键值存储的整合