gpt4 book ai didi

kubernetes - 错误 : UPGRADE FAILED: failed to replace object: Service "api" is invalid: spec. clusterIP:无效值: "":字段不可变

转载 作者:行者123 更新时间:2023-12-02 11:51:49 27 4
gpt4 key购买 nike

做的时候helm upgrade ... --force我收到以下错误

Error: UPGRADE FAILED: failed to replace object: Service "api" is invalid: spec.clusterIP: Invalid value: "": field is immutable

这就是我的服务文件的样子:(不在任何地方传递 clusterIP)
apiVersion: v1
kind: Service
metadata:
name: {{ .Chart.Name }}
namespace: {{ .Release.Namespace }}
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"
labels:
app: {{ .Chart.Name }}-service
kubernetes.io/name: {{ .Chart.Name | quote }}
dns: route53
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
spec:
selector:
app: {{ .Chart.Name }}
type: LoadBalancer
ports:
- port: 443
name: https
targetPort: http-port
protocol: TCP

Helm 版本: 3.0.1

Kubectl 版本: 1.13.1 [尝试使用 1.17.1 还有]

服务器 : 1.14

备注 : 以前我用的是旧版本的(server、kubectl、helm),当时没遇到过这种问题。
我可以在 GitHub 中看到很多与此相关的类似问题,但无法为我找到任何可行的解决方案。

几个类似的问题:

https://github.com/kubernetes/kubernetes/issues/25241

https://github.com/helm/charts/pull/13646 [对于 Nginx 图表]

最佳答案

我已经使用 Helm 进行了一些测试,并在尝试从 NodePort/ClusterIP 更改服务类型时遇到了同样的问题。至 LoadBalancer .

这是我重现您的问题的方式:

Kubernetes 1.15.3 (GKE)
Helm 3.1.1

用于测试的 Helm 图表:stable/nginx-ingress

我是如何复制的:

  • 获取并解压文件:
  • helm fetch stable/nginx-ingress  
    tar xzvf nginx-ingress-1.33.0.tgz
  • type: LoadBalancer 修改服务类型至 type: NodePortvalues.yaml文件(第 271 行):
  • sed -i '271s/LoadBalancer/NodePort/' values.yaml
  • 安装图表:
  • helm install nginx-ingress ./
  • 检查服务类型,必须是NodePort :
  • kubectl get svc -l app=nginx-ingress,component=controller

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    nginx-ingress-controller NodePort 10.0.3.137 <none> 80:30117/TCP,443:30003/TCP 1m
  • 现在再次将服务类型修改为 LoadBalancervalues.yaml :
  • sed -i '271s/NodePort/LoadBalancer/' values.yaml
  • 最后,尝试使用 --force 升级图表标志:
  • helm upgrade nginx-ingress ./ --force

    进而:
    Error: UPGRADE FAILED: failed to replace object: Service "nginx-ingress-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable

    解释

    我在 HELM 中发现了这个 source code:

    // if --force is applied, attempt to replace the existing resource with the new object.
    if force {
    obj, err = helper.Replace(target.Namespace, target.Name, true, target.Object)
    if err != nil {
    return errors.Wrap(err, "failed to replace object")
    }
    c.Log("Replaced %q with kind %s for kind %s\n", target.Name, currentObj.GetObjectKind().GroupVersionKind().Kind, kind)
    } else {
    // send patch to server
    obj, err = helper.Patch(target.Namespace, target.Name, patchType, patch, nil)
    if err != nil {
    return errors.Wrapf(err, "cannot patch %q with kind %s", target.Name, kind)
    }
    }

    分析 Helm 上面的代码会用到类似 kubectl replace api 请求(而不是我们所期望的 kubectl replace --force)...当 Helm 时 --force标志已设置。

    如果没有,那么 Helm 将使用 kubectl patch api 请求进行升级。

    让我们检查它是否有意义:

    使用 kubectl 的 PoC
  • 创建一个简单的服务为 NodePort :
  • kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app: test-svc
    name: test-svc
    spec:
    selector:
    app: test-app
    ports:
    - port: 80
    protocol: TCP
    targetPort: 80
    type: NodePort
    EOF

    使服务被创建:
    kubectl get svc -l app=test-svc

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    test-svc NodePort 10.0.7.37 <none> 80:31523/TCP 25

    现在让我们尝试使用 kubectl replace将服务升级到 LoadBalancer , 喜欢 helm upgrade --force :
    kubectl replace -f - <<EOF
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    app: test-svc
    name: test-svc
    spec:
    selector:
    app: test-app
    ports:
    - port: 80
    protocol: TCP
    targetPort: 80
    type: LoadBalancer
    EOF

    这显示错误:
    The Service "test-svc" is invalid: spec.clusterIP: Invalid value: "": field is immutable

    现在,让我们使用 kubectl patch将 NodePort 更改为 LoadBalancer,模拟 helm upgrade 命令,无需 --force旗帜:

    Here是kubectl补丁文档,想看怎么用。
    kubectl patch svc test-svc -p '{"spec":{"type":"LoadBalancer"}}'

    然后你看到: service/test-svc patched
    解决方法

    您应该使用 helm upgrade没有 --force ,它会起作用。

    如果你真的需要使用 --force重新创建一些资源,如 pods 以获取最新的 configMap例如更新,那么我建议您在 Helm 升级之前先手动更改服务规范。

    如果您尝试更改服务类型,您可以导出服务 yaml ,更改类型并再次应用它(因为我只有在第一次尝试应用相同的模板时才会遇到这种行为):
    kubectl get svc test-svc -o yaml | sed 's/NodePort/LoadBalancer/g' | kubectl replace --force -f -

    输出:
    service "test-svc" deleted
    service/test-svc replaced

    现在,如果您尝试使用 helm upgrade --force并且在服务中没有任何更改要做,它将工作并将重新创建您的 pod 和其他资源。

    我希望对你有帮助!

    关于kubernetes - 错误 : UPGRADE FAILED: failed to replace object: Service "api" is invalid: spec. clusterIP:无效值: "":字段不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426241/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com