kubernetes Helm 不创造资源

rn0zuynd  于 2023-03-17  发布在  Kubernetes
关注(0)|答案(7)|浏览(284)

我第一次尝试运行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

服务.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

入口.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

从我所看到的,我不认为我错过了把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"

它在本地正确地渲染文件。
helm list --all --all-namespaces没有返回任何内容。请帮助。

lnxxn5zx

lnxxn5zx1#

您已经拥有一些资源,例如给定名称空间中的服务abc,您正尝试通过Helm图表安装xyz
删除它们并通过helm install安装它们。

$ kubectl delete service -n <namespace> <service-name>
$ kubectl delete deployment -n <namespace> <deployment-name>
$ kubectl delete ingress -n <namespace> <ingress-name>

一旦通过Helm部署了这些资源,就可以执行helm update来更改属性。
从你的yaml中删除"app.kubernetes.io/managed-by"标签,这将由Helm添加。

chhqkbe1

chhqkbe12#

以下错误非常常见:

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 ..

因此,我将提供一个稍微长一点的解释,也是一个上下文的主题。

发生了什么事?

看起来您试图创建已经存在的资源,并在Helm之外创建(可能使用 kubectl)。

为什么Helm抛出错误?

Helm不允许多个部署拥有一个资源。
图表创建者有责任确保图表仅生成唯一资源。

如何解决此问题?

选项1-遵循错误消息并添加meta.helm.sh注解:

如本PR所述:Adopt resources into release with correct instance and managed-by labels
如果现有资源具有正确的meta.helm.sh/release-namemeta.helm.sh/release-namespace注解,并且与标签选择器app.kubernetes.io/managed-by=Helm匹配,则在尝试创建目标群集中已存在的资源时,Helm将不再出错。
这有助于零停机迁移到Helm 3以管理现有部署,并允许Helm“采用”以前创建的现有资源。
(*)我认为meta.helm.sh作用域是当今不太常用的方法。

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

正如在不同的Helm图表提供程序(例如Bitnami、Nginx入口控制器、External-Dns)中可以看到的那样-两个标签的组合:

app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}

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

选项3-删除旧资源。

在旧资源可能不再相关的特定情况下,它可能是相关的。

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

这些标签是什么?
  • 共享的标签和注解 * 共享一个通用前缀:app.kubernetes.io .

没有前缀的标签是用户专用的。共享前缀可确保共享标签不会干扰自定义用户标签。
为了充分利用这些标签,应该将它们应用于每个资源对象。
app.kubernetes.io/managed-by标签用于描述用于管理应用程序操作的工具,例如:* 掌舵 *。
请参阅“推荐标签”部分的详细信息。

它们是通过舵添加的吗?

没有。
首先,如前所述,这些标签不是特定于Helm的,Helm本身也从不要求存在特定的标签。
另一方面,Helm文档建议使用以下标准标签。app.kubernetes.io/managed-by是其中之一,应该设置为{{ .Release.Service }},以便查找Helm管理的所有资源。
因此,图表维护人员的职责就是添加这些标签。

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

许多Helm图表提供程序将它们添加到_helpers.tpl文件中,并让所有资源include它:

labels: {{ include "my-chart.labels" . | nindent 4 }}
3vpjnl9f

3vpjnl9f3#

这里的技巧是**to chase the error message**。例如,在下面的示例中,错误消息指向名称空间“xyz”中的“service”存在错误

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"

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

kubectl -n xyz delete svc abc

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

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"

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

kubectl delete role nok-sec-sip-tls-crd-role -n debu
w8ntj3qf

w8ntj3qf4#

我得到这个错误,因为我试图升级的helm图表与错误的版本名称。所以它与现有的资源冲突,在相同的命名空间。
我使用错误的releasename运行此命令

helm upgrade --install --namespace <namespace> wrong-releasename <chart-folder>

得到了类似的错误

Error: rendered manifests contain a resource that already exists. Unable to continue with install: ConfigMap \"cmname\" in namespace \"namespace\" 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 \"wrong-releasename\"; annotation validation error: missing key \"meta.helm.sh/release-namespace\": must be set to \"namespace\"

我检查了相同名称空间中的现有helm版本,并使用与列出的版本名称相同的名称来升级helmchart
一个二个一个一个

ncecgwcz

ncecgwcz5#

这里有一个更快更彻底的方法来摆脱argo,这样它就可以重新安装:

helm list -A   # see argocd in namespace argocd
helm uninstall argocd -n argocd
kubectl delete namespace argocd

最后一行删除了所有未通过卸载helm图表清理的机密和其他资源,这些资源在我的环境中是必需的,否则,我会得到与您所看到的重复资源相同的错误。

uqxowvwt

uqxowvwt6#

我们通过Flux使用GitOps,我也遇到了同样的rendered manifests contain a resource that already exists错误。对我来说,问题是我不小心在两个不同的文件中定义了一个同名的资源,所以它试图创建它两次。我从其中一个文件中删除了重复的资源定义来修复它。

cbwuti44

cbwuti447#

对于我们来说,我们还必须删除链接到部署的ServiceAccount才能解决这个问题。

$ kubectl delete service -n <namespace> <service-name>
$ kubectl delete deployment -n <namespace> <deployment-name>
$ kubectl delete ingress -n <namespace> <ingress-name>
$ kubectl delete serviceaccount -n <namespace> <ingress-name>

相关问题