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 Cloud Native Apache
基于 Kubernetes 部署 Zookeeper,太有意思了!
随着云原生化流行的大趋势,我们的基础组件也需要逐渐上Kubernetes了。Apache Zookeeper作为目前最流行的分布式协调组件,在我们的微服务架构中负责扮演注册中心的角色。
基于 Kubernetes 部署 Zookeeper,太有意思了!
|
12月前
|
API
Istio 使用ingress和gateway两种方式公开服务
本文档指导您完成Istio网关的部署与配置。首先安装`istiod`(步骤略过)。接着,创建`ingress.yaml`文件,定义Istio入口网关的服务、部署及权限设置,通过`kubectl apply -f ingress.yaml`命令应用。最后,创建Ingress资源,指定主机名、后端服务及TLS配置,实现对外部请求的路由管理。
1014 1
|
Prometheus 监控 Cloud Native
prometheus-operator入门使用上篇之ServiceMonitor
关于使用Prometheus Operator和Kube-Prometheus Stack进行监控的入门教程,涵盖了从部署到监控云原生和非云原生应用的详细步骤,以及监控失败的排查方法。
1024 3
prometheus-operator入门使用上篇之ServiceMonitor
|
Linux 对象存储 Windows
MinIO 客户端安装与使用教程
详细讲解MinIO CLI的安装与使用
4851 0
|
存储 Kubernetes API
k8s学习-ConfigMap(创建、使用、更新、删除等)
k8s学习-ConfigMap(创建、使用、更新、删除等)
3723 0
|
负载均衡 关系型数据库 PostgreSQL
【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离
本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。
|
存储 消息中间件 监控
容器日志采集利器Log-Pilot
容器时代越来越多的传统应用将会逐渐容器化,而日志又是应用的一个关键环节,那么在应用容器化过程中,如何方便快捷高效地来自动发现和采集应用的日志,如何与日志存储系统协同来高效存储和搜索应用日志,本文将主要跟大家分享下如何通过Log-Pilot来采集容器的标准输出日志和容器内文件日志。
22930 0
|
JSON Kubernetes Devops
kustomize (一) 管理yaml部署入门hello world
kustomize (一) 管理yaml部署入门hello world
kustomize (一) 管理yaml部署入门hello world
|
Prometheus Kubernetes 监控
Prometheus Operator(上)
Prometheus Operator(上)
546 0
|
JSON Kubernetes Devops
kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解
kustomize (七) patches、patchesJson6902、patchesStrategicMerge详解