当相同名称空间中的同名部署,svc等运行时,强制部署Helm版本

时间:2020-07-21 13:57:33

标签: kubernetes kubernetes-helm

当已经有相同名称的部署,svc等运行时,如何首次部署helm版本。

是否有任何方法可以导入正在运行的配置,而头盔无法处理?

还是删除相同名称的对象是第一次部署Helm发布的唯一解决方案?(我不想更改发布名称,因为这会破坏微服务之间的通信) 删除对象将导致停机,我想避免这种情况。

使用相同名称进行部署时出错:

Error: rendered manifests contain a resource that already exists. Unable to continue with install: Service "abc" in namespace "default" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "abc"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "default"

他们还有其他方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

解决错误消息和部分问题:

<块引用>

当已经有部署、svc 等同名运行时,如何第一次部署 helm 版本。

您不能使用 Helm 部署不是由 Helm 创建的资源。它将为您提供与您遇到的相同的消息。您可以注释由 Helm 添加的现有资源,以“导入”现有资源并对其进行操作。 请先尝试在测试环境中运行您的工作负载,然后再尝试,因为它可能会重新部署一些资源。

关于如何注释资源已经有类似的答案:

<块引用>

查看 helm3 的这个特性 Adopt resources into release with correct instance and managed-by labels

如果现有资源具有正确的 meta.helm.sh/release-name 和 meta.helm.sh/release-namespace 注释,则在尝试创建目标集群中已存在的资源时,Helm 将不再出错,并且匹配标签选择器 app.kubernetes.io/managed-by=Helm。这有助于零停机迁移到 Helm 3 以管理现有部署,并允许 Helm“采用”其先前创建的现有资源。

为了允许 Helm 采用现有资源,添加发布元数据和托管标签:

KIND=deployment
NAME=my-app-staging
RELEASE=staging
NAMESPACE=default
kubectl annotate $KIND $NAME meta.helm.sh/release-name=$RELEASE
kubectl annotate $KIND $NAME meta.helm.sh/release-namespace=$NAMESPACE
kubectl label $KIND $NAME app.kubernetes.io/managed-by=Helm

假设以下情况:

  • Deployment 在 Helm 之外创建(示例如下)。
  • Deployment 中具有等效模板化 templates/ 的 Helm Chart(示例如下)。

在没有 Helm 的情况下在 Deployment 下创建:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

假设上述文件与 kubectl apply 一起使用,并且它也驻留在图表的 templates/ 目录(模板化)中,您将收到以下错误(当您尝试运行 $ helm install release_name . ):

Error: rendered manifests contain a resource that already exists. Unable to continue with install: Deployment "nginx" in namespace "default" exists and cannot be imported into the current release: ... 

通过运行我链接的答案中提到的脚本,您可以为 Helm 注释和标记您的资源,以免产生提到的错误消息。

之后,您可以运行 $ helm install release_name . 并为您的资源配置所需的更改。


其他资源: