怎么在 Kustomize 中添加多行变量

原文链接: https://tangx.in/posts/2023/01/05/how-to-create-multiple-line-variables-in-kustomize/

kustomize 是 k8s 官方出的一个 应用管理工具 , 说起来还是很好用的。 可以参考 k8s 部署工具 kustomize 的实用小技巧

Kustomize 中的 ConfigMap/Secrets Generator

在配置管理方面, kustomize 为我们提供了 Generator 帮助我们管理配置文件。

提供了三个 API 模块

  1. files: 通过 文件 生成 文件
  2. literals: 通过文字 字面量 k=v 生成 k=v 数据
  3. envs: 通过 文件 生成 k=v 数据。 这个应该是 filesliteral 的综合体。

envs 生成变量文件 demo

  1. kustomization.yml 配置文件
1
2
3
4
5
6
7
8
---
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
- name: tracing-options
  envs:
  - tracing.env
  1. 变量配置文件
1
2
3
4
# tracing.env
ENABLE_TRACING=true
SAMPLER_TYPE=probabilistic
SAMPLER_PARAMETERS=0.1
  1. 渲染数据结果

以上文件中的变量都将放在 ConfigMapSecretsdata 数据字段中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
apiVersion: v1
kind: ConfigMap
metadata:
  # The name has had a suffix applied
  name: tracing-options-6bh8gkdf7k
# The data has been populated from each literal pair
data:
  ENABLE_TRACING: "true"
  SAMPLER_TYPE: "probabilistic"
  SAMPLER_PARAMETERS: "0.1"

envs 的限制

但是 这种从文件中读取配置的方式有一些限制

  1. 每个变量必须使用 k=v 的这种格式。

  2. 每个变量 只能一行, 不能垮多行。

  3. 官网没有提到: 每一行的值都是 纯文本(plain) 字符, 不会存在转义等操作。 换而言之, 不能简单的理解成 shell script 中的变量定义。

  4. 修改配置变量

我们这里对字符串进行了 单引号、双引号 包裹, 以及使用了 \n 实现换行。

1
2
3
# tracing.env
HELLO_WORLD="Hello\nWorld"
HELLO_LAOMAI='Hello\nLaomai'
  1. 输出结果
1
2
3
4
5
6
7
8
9
# kubectl create -k . --dry-run=client -o yaml -n demo
apiVersion: v1
data:
  HELLO_LAOMAI: '''Hello\nLaomai'''
  HELLO_WORLD: '"Hello\nWorld"'
kind: ConfigMap
metadata:
  name: tracing-options-cdffttc8t6
  namespace: demo

注意看 在上面的 yaml 文件中, 变量值都包裹了 额外 的单引号。

但是,我并没有在 yaml.org - single quote 中找到 单引号 的相关语法说明。

kustomize 怎么配置多行变量

通过 Generator 提供的 envs 方法是无法实现的。

但是, 可以使用 literals 实现。

但是通过 liternal 实现, 配置参考如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: demo
configMapGenerator:
- name: srv-webapp-demo-literals
  literals:
  - JAVA_HOME=/opt/java/jdk
  - JAVA_TOOL_OPTIONS=-agentlib:hprof
  - |-
    HTTPS_CERT=---- RSA ----
    asdflalsdjflasdjfl
    ---- RSA END ----    
  type: Opaque

但通过这种方式, 就无法把变量放在 变量文件 中进行管理了。 不方便

使用 kustz 实现更好多行配置的方法

kustz 项目 - Github 是一个针对 kustomize 的二次封装, 旨在更加方便的配置管理 k8s 无状态应用。

kustz 已经实现了配置管理模块, 可以通过 YAML 文件管理、配置变量, 实现了 变量在文件中 的需求。

假设我们现在 变量 文件如下

1
2
3
4
5
6
7
# foo.yml
JAVA_HOME: /opt/java/jdk
JAVA_TOOL_OPTIONS: -agentlib:hprof
HTTPS_CERT: |
  ---- RSA ----
  asdflalsdjflasdjfl
  ---- RSA END ----  

1. 通过变量文件直接注入到 Deployment 中

  1. kustz.yml 配置

使用 .envs.files 从文件中读取配置

1
2
3
4
5
6
7
8
# kustz.yml
name: srv-webapp-demo

service:
  # ... 省略 
  envs:
    files:
      - foo.yml
  1. 渲染结果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: srv-webapp-demo
spec:
    spec:
      containers:
      - env:
        - name: HTTPS_CERT
          value: |-
            ---- RSA ----
            asdflalsdjflasdjfl
            ---- RSA END ----            
        - name: JAVA_HOME
          value: /opt/java/jdk
        - name: JAVA_TOOL_OPTIONS
          value: -agentlib:hprof

2. 通过变量文件注入到 kustomization 的 literals 中

  1. kustz.yml 配置
1
2
3
4
5
6
7
8
# kustz.yml
name: srv-webapp-demo

configmaps:
  literals:
    - name: srv-webapp-demo-literals
      files:
        - foo.yml
  1. 渲染后的结果
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: demo-demo
configMapGenerator:
  - literals:
    - JAVA_HOME=/opt/java/jdk
    - JAVA_TOOL_OPTIONS=-agentlib:hprof
    - |-
      HTTPS_CERT=---- RSA ----
      asdflalsdjflasdjfl
      ---- RSA END ----      
    name: srv-webapp-demo-literals