我正在努力使用 helm 创建动态命名空间。但是,我遇到一个问题,当我使用命令创建新的命名空间时,使用该命令创建的上一个命名空间将被终止,新的命名空间将被启动。
例如,集群中有一个名为
original-namespace
的现有命名空间,我想创建一个名为 my-new-namespace
的新命名空间。为了简单起见,我使用运行的命令创建了一个 Makefile:
CHART_DIR ?= "./charts"
NAMESPACE ?= "original-namespace"
namespace:
helm install --dry-run namespace ${CHART_DIR}/namespace --set name=${NAMESPACE} > namespace.yaml
helm upgrade --install namespace ${CHART_DIR}/namespace --set name=${NAMESPACE}
要执行名称空间创建,我只需运行:
NAMESPACE=my-new-namespace make namespace
运行此命令时,将创建命名空间
my-new-namespace
并终止 original-namespace
。当我再次运行命令时,反之亦然:
NAMESPACE=original-namespace make namespace
my-new-namespace
被删除并再次创建 original-namespace
。
我已经仔细检查了我的 --dry-run 输出,一切都看起来应该如何。我相信这可能与 helm update --install` 命令有关,但我对命名空间创建的了解有点有限。感谢您提前的帮助
Helm 保留有关其已安装内容的一些信息,并且 Helm 发布对象本身位于命名空间中。您不使用
helm --namespace
选项,因此这些版本会进入 default
命名空间(或本地 Kubernetes 配置定义为默认命名空间的任何内容)。
但是,您的设置使用 Helm 版本的固定名称。当您使用新的命名空间名称
helm upgrade
发布时,图表管理的任何旧资源都将被删除并替换为新资源。如果要保留两组资源,则需要使用不同的版本名称或不同的命名空间。听起来您的图表正在创建 Kubernetes 命名空间对象,因此版本可能需要位于不同的命名空间中。
给定命名空间名称,我可能会运行
helm install "namespace-$NAMESPACE" ./charts/namespace --set-string "name=$NAMESPACE"
如果您确实在此处使用 Make,请考虑生成 YAML(或 JSON)值文件,而不是使用有时会出现问题的
--set
语法。
.PHONY: namespace
namespace: .helm-$(NAMESPACE)
values-$(NAMESPACE).yaml:
echo "name: $(NAMESPACE)" >$@
.helm-$(NAMESPACE): values-$(NAMESPACE).yaml ./charts/namespace/templates/namespace.yaml
helm upgrade --install namespace-$(NAMESPACE) \
./charts/namespace \
-f values-$(NAMESPACE).yaml
touch $@