掌舵不创建资源

amy*_*myJ 10 kubernetes kubernetes-helm

我第一次尝试运行 Helm。我有 deployment.yaml、service.yaml 和 ingress.yaml 文件以及 values.yaml 和 chart.yaml。

部署.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: abc
  namespace: xyz
  labels:
    app: abc
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: 3
  template:
    spec:
      containers:
        - name: abc
          image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
          ports:
            -
              containerPort: 8080
Run Code Online (Sandbox Code Playgroud)

服务.yaml

apiVersion: v1
kind: Service
metadata:
  name: abc
  labels:
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  namespace: xyz
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: {{ .Values.service.sslCert }}
spec:
  ports:
    - name: https
      protocol: TCP
      port: 443
      targetPort: 8080
    - name: http
      protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP
  selector:
    app: abc
Run Code Online (Sandbox Code Playgroud)

入口.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "haproxy-ingress"
  namespace: xyz
  labels:
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  annotations:
    kubernetes.io/ingress.class: alb
Run Code Online (Sandbox Code Playgroud)

从我所见,我认为我没有错过推杆,app.kubernetes.io/managed-by但仍然出现错误:

rendered manifests contain a resource that already exists. Unable to
continue with install: Service "abc" in namespace "xyz" 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"
Run Code Online (Sandbox Code Playgroud)

它在本地正确呈现文件。

helm list --all --all-namespaces什么都不返回。请帮忙。

Rtm*_*tmY 32

下面的错误很常见:

 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 ..
Run Code Online (Sandbox Code Playgroud)

因此,我将提供更长一点的解释以及该主题的背景。


发生了什么事?

您似乎试图创建已经存在并在 Helm 外部创建的资源(可能使用kubectl)。

为什么 Helm 会抛出错误?

Helm 不允许一项资源由多个部署拥有。

图表创建者有责任确保图表仅产生独特的资源。

你怎么解决这个问题?

选项 1 - 按照错误消息并添加meta.helm.sh注释:

正如此 PR 中所述:将资源采用正确的实例和管理标签进行发布

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

(*) 我认为meta.helm.sh范围现在是一种不太常见的方法。

选项 2 - 添加app.kubernetes.io/instance标签:

从不同的 Helm 图表提供商(例如BitnamiNginx 入口控制器External-Dns )中可以看出- 两个标签的组合:

app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
Run Code Online (Sandbox Code Playgroud)

(*) 注意:有一些 CD 工具(例如ArgoCD)会自动设置app.kubernetes.io/instance标签并使用它来确定应用程序中的哪些资源。

选项 3 - 删除旧资源。

它可能与您的特定情况相关,其中旧资源可能不再相关。


对于那些需要一些背景信息的人

那些标签是什么?

共享标签和注释共享一个共同的前缀:app.kubernetes.io
没有前缀的标签对用户来说是私有的。共享前缀可确保共享标签不会干扰自定义用户标签。

为了充分利用这些标签,它们应该应用于每个资源对象。

app.kubernetes.io/managed-by标签用于描述用于管理应用程序操作的工具 - 例如:helm

请阅读推荐标签部分的更多信息。

它们是由 helm 添加的吗?

不会。
首先,如前所述,这些标签并不是 Helm 特有的,而且 Helm 本身从不要求存在特定标签。

另一方面,Helm 文档建议使用以下标准标签app.kubernetes.io/managed-by是其中之一,应该设置为{{ .Release.Service }}以便查找 Helm 管理的所有资源。

因此,图表维护者的职责是添加这些标签。

添加它们的最佳方法是什么?

许多 Helm 图表提供商将它们添加到_helpers.tpl文件中并允许所有资源include使用:

labels: {{ include "my-chart.labels" . | nindent 4 }}
Run Code Online (Sandbox Code Playgroud)


Kam*_*san 11

您已经abc在给定的命名空间(命名空间xyz)中有一些资源(服务),您正在尝试通过舵图安装这些资源(服务)。

清理这些东西并通过helm install.

$ kubectl delete service -n <namespace> <service-name>
$ kubectl delete deployment -n <namespace> <depoyment-name>
$ kubectl delete ingress -n <namespace> <ingress-name>
Run Code Online (Sandbox Code Playgroud)

一旦您通过掌舵部署了这些资源,您将能够执行helm update更改属性。

"app.kubernetes.io/managed-by"从你的 yaml 中删除这个标签,这将由掌舵添加。

  • 部署 helm 模板应该是“helm update”。如果此名称的发行版尚不存在,请添加“--install”选项来运行安装。这适用于 helm 版本 3+。 (2认同)

小智 7

这里的技巧是to chase the error message。例如,在下面的情况下,错误消息指出命名空间“xyz”中的“服务”有问题

Unable to
continue with install: Service "abc" in namespace "xyz" 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"
Run Code Online (Sandbox Code Playgroud)

只需使用以下命令从提到的命名空间中删除相同的服务:

kubectl -n xyz delete svc abc
Run Code Online (Sandbox Code Playgroud)

然后再次尝试安装/部署。可能会出现类似的问题,但对于不同的资源,如下例所示:

Release "nok-sec-sip-tls-crd" does not exist. Installing it now.
Error: rendered manifests contain a resource that already exists. Unable to continue with install: Role "nok-sec-sip-tls-crd-role" in namespace "debu" exists and cannot be imported into the current release: invalid ownership metadata; annotation validation error: key "meta.helm.sh/release-name" must equal "nok-sec-sip-tls-crd": current value is "nok-sec-sip"
Run Code Online (Sandbox Code Playgroud)

再次使用 kubectl 命令并删除错误消息中提到的资源。例如,在上述情况下,应使用以下命令删除错误资源:

kubectl delete role nok-sec-sip-tls-crd-role -n debu
Run Code Online (Sandbox Code Playgroud)