spec.clusterIP:无效值:“”:字段不可变

sem*_*ral 5 kubernetes kubernetes-helm

我们有 Helm 3.0.3 和 1.18 k8s,一年以来我们没有遇到过像下面这样的任何问题。我们通过 helm 将多个微服务部署到 k8s,到目前为止一切正常。但即使我们没有对服务字段进行任何更改,我们也会收到如下错误。

这是我如何部署到 k8s 的命令。当我在 k8s 中卸载该服务并开始重新构建时,它可以正常工作,但是当我需要推送新更改时?再次面对这个错误。

+ helm upgrade --install --debug --force xx-ui-dev --values values.dev.yaml --namespace dev --set image.tag=608 .
Run Code Online (Sandbox Code Playgroud)

错误

history.go:52: [debug] getting history for release xx-ui-dev
upgrade.go:120: [debug] preparing upgrade for xx-ui-dev
upgrade.go:128: [debug] performing update for xx-ui-dev
upgrade.go:292: [debug] creating upgraded release for xx-ui-dev
client.go:173: [debug] checking 7 resources for changes
client.go:432: [debug] Replaced "xx-ui-dev" with kind NetworkPolicy for kind NetworkPolicy

client.go:432: [debug] Replaced "xx-ui-dev" with kind ServiceAccount for kind ServiceAccount

client.go:432: [debug] Replaced "xx-ui-dev-auth" with kind Secret for kind Secret

client.go:432: [debug] Replaced "xx-ui-dev-config" with kind ConfigMap for kind ConfigMap

client.go:205: [debug] error updating the resource "xx-ui-dev":
     failed to replace object: Service "xx-ui-dev" is invalid: spec.clusterIP: Invalid value: "": field is immutable
client.go:432: [debug] Replaced "xx-ui-dev" with kind Deployment for kind Deployment

client.go:432: [debug] Replaced "xx-ui-dev" with kind HorizontalPodAutoscaler for kind HorizontalPodAutoscaler

upgrade.go:351: [debug] warning: Upgrade "xx-ui-dev" failed: failed to replace object: Service "xx-ui-dev" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Error: UPGRADE FAILED: failed to replace object: Service "xx-ui-dev" is invalid: spec.clusterIP: Invalid value: "": field is immutable
helm.go:84: [debug] failed to replace object: Service "xx-ui-dev" is invalid: spec.clusterIP: Invalid value: "": field is immutable
Run Code Online (Sandbox Code Playgroud)

服务.yaml

    spec:
      type: {{ .Values.service.type }}
      ports:
        - port: {{ .Values.service.port }}
          targetPort: 50003
          protocol: TCP
          name: http
      selector:
        app.kubernetes.io/name: {{ include "xx-ui.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
        tier: backend
Run Code Online (Sandbox Code Playgroud)
values.dev.yaml

   service:
     type: ClusterIP
     port: 80
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 7

使用--forcewith 时helm upgrade,helm 使用替换策略而不是补丁。

看看下面的掌舵代码

if force {
    var err error
    obj, err = helper.Replace(target.Namespace, target.Name, true, target.Object)
        
    ...

} else {
    patch, patchType, err := createPatch(target, currentObj)

    ...

    // send patch to server
    obj, err = helper.Patch(target.Namespace, target.Name, patchType, patch, nil)
}
Run Code Online (Sandbox Code Playgroud)

替换策略导致您看到的错误。如果您想知道为什么会发生这种情况,请查看此 kubectl 问题