我第一次尝试运行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
没有返回任何内容。请帮助。
7条答案
按热度按时间lnxxn5zx1#
您已经拥有一些资源,例如给定名称空间中的服务
abc
,您正尝试通过Helm图表安装xyz
。删除它们并通过
helm install
安装它们。一旦通过Helm部署了这些资源,就可以执行
helm update
来更改属性。从你的yaml中删除
"app.kubernetes.io/managed-by"
标签,这将由Helm添加。chhqkbe12#
以下错误非常常见:
因此,我将提供一个稍微长一点的解释,也是一个上下文的主题。
发生了什么事?
看起来您试图创建已经存在的资源,并在Helm之外创建(可能使用 kubectl)。
为什么Helm抛出错误?
Helm不允许多个部署拥有一个资源。
图表创建者有责任确保图表仅生成唯一资源。
如何解决此问题?
选项1-遵循错误消息并添加
meta.helm.sh
注解:如本PR所述:Adopt resources into release with correct instance and managed-by labels
如果现有资源具有正确的
meta.helm.sh/release-name
和meta.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)中可以看到的那样-两个标签的组合:
(*)注意:有些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
它:3vpjnl9f3#
这里的技巧是**
to chase the error message
**。例如,在下面的示例中,错误消息指向名称空间“xyz”中的“service”存在错误只需使用以下命令从上述名称空间中删除相同的服务:
然后再次尝试安装/部署。如果资源不同,可能会出现类似的问题,如下例所示:
再次使用kubectl命令并删 debugging 误消息中提到的资源。例如,在上述情况下,应使用以下命令删 debugging 误资源:
w8ntj3qf4#
我得到这个错误,因为我试图升级的helm图表与错误的版本名称。所以它与现有的资源冲突,在相同的命名空间。
我使用错误的releasename运行此命令
得到了类似的错误
我检查了相同名称空间中的现有helm版本,并使用与列出的版本名称相同的名称来升级helmchart
一个二个一个一个
ncecgwcz5#
这里有一个更快更彻底的方法来摆脱argo,这样它就可以重新安装:
最后一行删除了所有未通过卸载helm图表清理的机密和其他资源,这些资源在我的环境中是必需的,否则,我会得到与您所看到的重复资源相同的错误。
uqxowvwt6#
我们通过Flux使用GitOps,我也遇到了同样的
rendered manifests contain a resource that already exists
错误。对我来说,问题是我不小心在两个不同的文件中定义了一个同名的资源,所以它试图创建它两次。我从其中一个文件中删除了重复的资源定义来修复它。cbwuti447#
对于我们来说,我们还必须删除链接到部署的ServiceAccount才能解决这个问题。