对使用 kubectl 部署的现有资源使用 Helm 3
Use Helm 3 for existing resources deployed with kubectl
我们曾经使用普通的 kubectl 命令来部署 kubernetes 资源,用于服务、部署、configmap 等。现在我们需要开始使用 Helm 3 并将其集成到我们的管道中,但是当我尝试 运行 helm upgrade 命令时,出现以下错误:
Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: namespace: default
因此,这些资源从未使用 helm 创建,因为它通常是使用 kubcetl apply 命令创建的。
只需要知道如何在管道中使用 Helm 而无需重新创建 k8s 资源。作为我发现让它工作的唯一解决方法是删除资源并使用 Helm 重新部署它们。
下面是我试过的命令:
helm upgrade --atomic --debug --install --force test .
谢谢,
阿丽
您可以添加所有头盔 labels/annotations。您可以使用 helm template
检查所有头盔标签和花药组件。然后你可以使用 kubectl label
或 kubectl annotate
来添加缺失的 labels/annotations.
我个人从未尝试过,因为工作量太大,最后,如果它们由 deployment/statefulset 管理,您必须使用新标签重新创建 pods。
老实说,虽然 FL3SH 的答案正是您正在寻找的……最好的选择是只删除您的 k8s 资源。
有一些例外情况:
- 您的 helm chart 正在尝试创建命名空间(例如默认)
- 您的部署任何时候都不能停机
- 您的 helm chart 有持续的交易量声明
看看helm3的这个特性Adopt resources into release with correct instance and managed-by labels
如果现有资源具有正确的 meta.helm.sh/release-name 和 meta.helm.[=,则在尝试创建目标集群中已存在的资源时,Helm 将不再出错18=]space注解,匹配标签选择器app.kubernetes.io/managed-by=Helm。这有助于零停机时间迁移到 Helm 3 以管理现有部署,并允许 Helm “采用”它之前创建的现有资源。
为了允许 Helm 采用现有资源,请添加发布元数据和管理标签:
KIND=deployment
NAME=my-app-staging
RELEASE=staging
NAMESPACE=default
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-name=$RELEASE
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-namespace=$NAMESPACE
kubectl -n $NAMESPACE label $KIND $NAME app.kubernetes.io/managed-by=Helm
我们曾经使用普通的 kubectl 命令来部署 kubernetes 资源,用于服务、部署、configmap 等。现在我们需要开始使用 Helm 3 并将其集成到我们的管道中,但是当我尝试 运行 helm upgrade 命令时,出现以下错误:
Error: rendered manifests contain a resource that already exists. Unable to continue with install: existing resource conflict: namespace: default
因此,这些资源从未使用 helm 创建,因为它通常是使用 kubcetl apply 命令创建的。
只需要知道如何在管道中使用 Helm 而无需重新创建 k8s 资源。作为我发现让它工作的唯一解决方法是删除资源并使用 Helm 重新部署它们。
下面是我试过的命令:
helm upgrade --atomic --debug --install --force test .
谢谢, 阿丽
您可以添加所有头盔 labels/annotations。您可以使用 helm template
检查所有头盔标签和花药组件。然后你可以使用 kubectl label
或 kubectl annotate
来添加缺失的 labels/annotations.
我个人从未尝试过,因为工作量太大,最后,如果它们由 deployment/statefulset 管理,您必须使用新标签重新创建 pods。
老实说,虽然 FL3SH 的答案正是您正在寻找的……最好的选择是只删除您的 k8s 资源。 有一些例外情况:
- 您的 helm chart 正在尝试创建命名空间(例如默认)
- 您的部署任何时候都不能停机
- 您的 helm chart 有持续的交易量声明
看看helm3的这个特性Adopt resources into release with correct instance and managed-by labels
如果现有资源具有正确的 meta.helm.sh/release-name 和 meta.helm.[=,则在尝试创建目标集群中已存在的资源时,Helm 将不再出错18=]space注解,匹配标签选择器app.kubernetes.io/managed-by=Helm。这有助于零停机时间迁移到 Helm 3 以管理现有部署,并允许 Helm “采用”它之前创建的现有资源。
为了允许 Helm 采用现有资源,请添加发布元数据和管理标签:
KIND=deployment
NAME=my-app-staging
RELEASE=staging
NAMESPACE=default
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-name=$RELEASE
kubectl -n $NAMESPACE annotate $KIND $NAME meta.helm.sh/release-namespace=$NAMESPACE
kubectl -n $NAMESPACE label $KIND $NAME app.kubernetes.io/managed-by=Helm