【问题标题】:Install helm package with already installed components使用已安装的组件安装 helm 包
【发布时间】:2020-12-22 00:19:53
【问题描述】:

几周前我使用kubectl apply ... 将应用程序部署到k8s,该应用程序在产品中运行。 现在我们切换到 helm 安装并构建我们想要用它更新应用程序的图表。 问题是已经部署了应用程序的秘密/配置映射等工件 我无法删除

在运行时helm upgrade --install app chart/myapp -n ns

我遇到了类似的错误

错误:呈现的清单包含已存在的资源。 无法继续安装:现有资源冲突: 命名空间:ns,名称:bts,existing_kind:/v1,Kind=Secret,new_kind: /v1, 种类=秘密

有什么技巧可以用来在不删除秘密/configmap的情况下克服这个问题吗?

【问题讨论】:

  • 您是在自己的客户集群上使用 Azure VM 执行此操作,还是在 Azure 上的托管 k8s 服务(如 AKS)上执行此操作?所以在 AKS - Helm 已经预装了。您可以从这里查看更多详细信息:docs.microsoft.com/en-us/azure/aks/kubernetes-helm
  • @HassanRaza - 我们正在管理我们的 k8s,并且已经安装了 helm,它工作正常,这不是问题 :)
  • 不,helm 没有导入现有资源的能力。您需要在 helm 中重命名它们,以免名称冲突,或者从正在运行的集群中删除它们。 github.com/helm/helm/issues/6561
  • 使用 Helm 部署资源时,会在资源中创建一些注解。您可以尝试使用不同的名称部署密钥,然后尝试将注释复制到正在运行的密钥并再次部署。从理论上讲,它应该可以工作,因为控制注释将存在于旧资源中。我会在我的实验室环境中尝试并尽快返回。
  • 这可能是不可能的,因为 helm 只能升级由 helm 安装的资源。如果这些资源是由 helm 安装的,您可以尝试添加这些特定的标签和注释来欺骗 helm 但是这可能是不可能的

标签: amazon-web-services azure kubernetes kubernetes-helm


【解决方案1】:

在我的实验室中测试了一些选项后,我意识到我在 cmets 中告诉您的方式有效。

Helm 使用关于metadatalabels 的信息注入到资源中,以了解自己管理的资源是什么。下面的解决方法展示了如何导入以前创建的不由 Helm 管理的秘密,使用来自使用 Helm 部署的新秘密的 matadata 信息。

假设my-secret 已经部署,你想"import" 那个资源来掌舵,你需要获取新资源的元数据信息。让我们深入研究一下:

场景:

  1. secret 名称 my-secret 部署在 default 名称空间中。 (不由 Helm 管理)
  2. 带有名为 my-new-var 且具有不同值的秘密模板的舵图。

步骤:

  1. 使用此规范创建用于测试目的的普通机密:
    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      secret: S29vcGFLaWxsZXIK
  1. 应用 Helm 图表创建 my-new-secret。这样做的真正目的是获取metadatalabels 信息。

之后你可以使用命令查看秘密文件:

kubectl get secrets my-secret -o yaml:

apiVersion: v1
data:
  secret: VXB2b3RlSXQ=
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: myapp-1599472603
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2020-09-07T10:03:05Z"
  labels:
    app.kubernetes.io/managed-by: Helm
  name: my-secret
  namespace: default
  resourceVersion: "2064792"
  selfLink: /api/v1/namespaces/default/secrets/my-secret
  uid: 7cf66475-b26b-415b-8c11-8fb6974da495
type: Opaque

从这个文件中,我们需要得到annotationslabels 来申请我们旧的my-secret

  1. 编辑在步骤 1 中创建的机密文件以添加这些信息。它会产生一个像这样的文件:
apiVersion: v1
data:
  secret: S29vcGFLaWxsZXIK
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: myapp-1599472603
    meta.helm.sh/release-namespace: default
  name: my-secret
  labels:
    app.kubernetes.io/managed-by: Helm
  namespace: default
  1. 删除 Helm 创建的 my-new-secret,因为我们不再使用它: kubectl delete secrets my-new-secret

  2. 在 Helm 图表中,编辑密钥名称以与旧密钥匹配,在我们的示例中,将名称从 my-new-secret 更改为 my-secret

  3. 升级 Helm 图表,就我而言,我使用了 Values.yaml 中的值:

$ helm upgrade -f myapp/values.yaml myapp-1599472603 ./myapp/
Release "myapp-1599472603" has been upgraded. Happy Helming!
NAME: myapp-1599472603
LAST DEPLOYED: Mon Sep  7 10:28:38 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

【讨论】:

    【解决方案2】:

    您可以使用可以帮助您将其移除的舵钩。

    annotations:
      "helm.sh/hook": pre-install, pre-upgrade
    

    以上注释将有助于解决此问题。 ClusterRoles等默认不删除的资源可以添加类似的注解。

    更多钩子可以在here找到,可以根据需要使用。

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 2021-05-05
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多