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(九)使用终章


相关文章
|
8月前
|
Kubernetes Shell 容器
Kubernetes的kubectl命令补全
Kubernetes的kubectl命令补全
118 0
|
6天前
|
存储 Kubernetes API
k8s学习-ConfigMap(创建、使用、更新、删除等)
k8s学习-ConfigMap(创建、使用、更新、删除等)
681 0
|
6天前
|
Kubernetes 容器
kubectl 操作deployment 的常用命令
kubectl 是 Kubernetes 的命令行工具,用于管理和操作 Kubernetes 集群。以下是一些常用的 kubectl 命令用于操作 Deployment: 1. 创建一个 Deployment: ``` kubectl create deployment <deployment-name> --image=<image-name> ``` 2. 查看 Deployment 列表: ``` kubectl get deployments ``` 3. 查看 Deployment 的详细信息: ``` kubectl de
179 0
|
7月前
|
存储 Kubernetes API
【K8s源码品读】007:Phase 1 - kube-apiserver - Pod数据的保存
理解Pod发送到kube-apiserver后是怎么保存的
40 0
|
7月前
|
Kubernetes Docker 容器
Kubernetes集群部署中安装Pods网络插件一直显示Pending状态解决
Kubernetes集群部署中安装Pods网络插件一直显示Pending状态解决
198 0
|
10月前
|
Prometheus Kubernetes 监控
Kubernetes 各组件日志清理
今天看到k8s的nodeexport pod failed,看到是磁盘空间压力过高。
461 0
|
Kubernetes Docker 容器
kubernetes 【组件】configmap配置更新
kubernetes 【组件】configmap配置更新
|
数据安全/隐私保护 容器 Perl
helm 自动滚动部署
helm 自动滚动部署
|
Kubernetes Perl 容器
【kubernetes】ConfigMap:在 Pod 中传入环境变量
【kubernetes】ConfigMap:在 Pod 中传入环境变量
266 0
|
Kubernetes 安全 测试技术
Kubernetes 重大更改和删除
Kubernetes 重大更改和删除
226 1