怎么在 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 模块
files
: 通过 文件 生成 文件literals
: 通过文字 字面量 k=v
生成 k=v
数据envs
: 通过 文件 生成 k=v
数据。 这个应该是 files
和 literal
的综合体。
envs
生成变量文件 demo
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
2
3
4
| # tracing.env
ENABLE_TRACING=true
SAMPLER_TYPE=probabilistic
SAMPLER_PARAMETERS=0.1
|
- 渲染数据结果
以上文件中的变量都将放在 ConfigMap
或 Secrets
的 data
数据字段中。
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
的限制
但是 这种从文件中读取配置的方式有一些限制
每个变量必须使用 k=v
的这种格式。
每个变量 只能 在 一行, 不能垮多行。
官网没有提到: 每一行的值都是 纯文本(plain) 字符, 不会存在转义等操作。 换而言之, 不能简单的理解成 shell script 中的变量定义。
修改配置变量
我们这里对字符串进行了 单引号、双引号 包裹, 以及使用了 \n
实现换行。
1
2
3
| # tracing.env
HELLO_WORLD="Hello\nWorld"
HELLO_LAOMAI='Hello\nLaomai'
|
- 输出结果
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 中
kustz.yml
配置
使用 .envs.files
从文件中读取配置
1
2
3
4
5
6
7
8
| # kustz.yml
name: srv-webapp-demo
service:
# ... 省略
envs:
files:
- foo.yml
|
- 渲染结果
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 中
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
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
|