5.5 KiB
使用 kustomize 对 helm charts 进行修改
kustomize 并不会读取 Helm charts ,但可以使用 generator 来访问 Helm charts 。
使用 last mile 模式来结合 kustomize 和 helm ,使用一个 inflated chart 作为基础,然后使用 kustomize 在部署到集群的途中进行修改。
以下示例中使用的 generator 仅适用于 stable chart 仓库中的 chart。该示例虽然使用 minecraft ,但可以应用于任何 chart。
假设 helm 已在你的 $PATH 中,建立一个工作空间:
DEMO_HOME=$(mktemp -d)
mkdir -p $DEMO_HOME/base
mkdir -p $DEMO_HOME/dev
mkdir -p $DEMO_HOME/prod
使用远程 chart
定义 development variant(环境)。
这可能涉及许多 kustomizations(参见其他示例),但在本示例中,将 dev- 名称前缀添加到所有资源:
cat <<'EOF' >$DEMO_HOME/dev/kustomization.yaml
namePrefix: dev-
resources:
- ../base
EOF
同上,使用 namePrefix: prod- 定义生产 variant :
cat <<'EOF' >$DEMO_HOME/prod/kustomization.yaml
namePrefix: prod-
resources:
- ../base
EOF
这两个 variants 指向同一个 base。
定义这个 base:
cat <<'EOF' >$DEMO_HOME/base/kustomization.yaml
generators:
- chartInflator.yaml
EOF
base 指向一个名为 chartInflator.yaml 的生成配置文件。
此文件允许指定 stable chart 的名称及其他内容,例如 values 文件的路径,默认为 values.yaml 。
创建配置文件 chartInflator.yaml,指定 chart 名称为 minecraft:
cat <<'EOF' >$DEMO_HOME/base/chartInflator.yaml
apiVersion: someteam.example.com/v1
kind: ChartInflator
metadata:
name: notImportantHere
chartName: minecraft
EOF
因为这个特定的 YAML 文件列在 kustomization文件的 generators: 字段中,所以它被视为生成器插件(由 apiVersion 和 kind 字段标识)与配置插件的其他字段之间的绑定。
将插件下载到 DEMO_HOME 并赋予其执行权限:
plugin=plugin/someteam.example.com/v1/chartinflator/ChartInflator
curl -s --create-dirs -o \
"$DEMO_HOME/kustomize/$plugin" \
"https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/$plugin"
chmod a+x $DEMO_HOME/kustomize/$plugin
检查目录布局:
tree $DEMO_HOME
将会得倒类似的目录及文件:
/tmp/whatever ├── base │ ├── chartInflator.yaml │ └── kustomization.yaml ├── dev │ └── kustomization.yaml ├── kustomize │ └── plugin │ └── someteam.example.com │ └── v1 │ └── chartinflator │ └── ChartInflator └── prod └── kustomization.yaml
运行 kustomize 定义一个 helper function 来传入正确的环境和常见标志:
function kustomizeIt {
XDG_CONFIG_HOME=$DEMO_HOME \
kustomize build --enable_alpha_plugins \
$DEMO_HOME/$1
}
最终构建 prod variant。这里要注意的是,所有资源名称现在都具有 prod- 前缀:
clear
kustomizeIt prod
比较 dev 和 prod:
diff <(kustomizeIt dev) <(kustomizeIt prod) | more
在 base上 运行 kustomize 查看未修改但已展开的 chart。 这里的每次调用都是重新下载并重新展开 chart。
kustomizeIt base
使用本地 chart
上面的示例由于未在配置中指定本地 chart 的主目录,所以kustomize会取得远程chart的副本并存在临时目录中。
要禁止 fetch,请明确指定 charHome ,并确保chart 已经被保存在该目录下
要进行演示,并且不会干扰您现有的 helm 环境,请执行以下操作:
helmHome=$DEMO_HOME/dothelm
chartHome=$DEMO_HOME/base/charts
function doHelm {
helm --home $helmHome $@
}
# 在新位置创建 helm 配置文件。
# 初始化命令比较复杂
doHelm init --client-only >& /dev/null
现在下载 chart ; 可以再次使用的 minecraft (也可以使用其他的 chart ):
doHelm fetch --untar \
--untardir $chartHome \
stable/minecraft
使用 tree 查看更多信息;helm 配置数据和完整的 chart 副本:
tree $DEMO_HOME
将 chartHome 字段添加到生成器的配置文件中,以便可以查找本地 chart:
echo "chartHome: $chartHome" >>$DEMO_HOME/base/chartInflator.yaml
更改 values 文件,用来展示本地 chart 的更改:
sed -i 's/CHANGEME!/SOMETHINGELSE/' $chartHome/minecraft/values.yaml
sed -i 's/LoadBalancer/NodePort/' $chartHome/minecraft/values.yaml
最后进行构建:
kustomizeIt prod
观察结果中 LoadBalancer 变为 NodePort,并且加密的密码也有所不同。