在 helm 升级时出现集群类型错误

时间:2021-04-21 09:58:29

标签: kubernetes kubernetes-helm amazon-eks

正在尝试:

helm upgrade --namespace keycloak -f k8s/sandbox/values.yaml keycloak codecentric/keycloak

获取:

UPGRADE FAILED: cannot patch "keycloak-http" with kind Service: Service "keycloak-http" is invalid: [spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP', spec.ports[1].nodePort: Forbidden: may not be used when `type` is 'ClusterIP']

但是,初始值 NodePort,而不是 ClusterIP:

service:
  # Annotations for headless and HTTP Services
  annotations: {}
  # Additional labels for headless and HTTP Services
  labels: {}
  # key: value
  # The Service type
  type: NodePort

还有 kubectl edit 显示类型:NodePort

spec:
  clusterIP: <SomeIP>
  externalTrafficPolicy: Cluster
  ports:
  - name: http
    nodePort: 31062
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    nodePort: 31258
    port: 8443
    protocol: TCP
    targetPort: https
  - name: http-management
    nodePort: 32113
    port: 9990
    protocol: TCP
    targetPort: http-management
  selector:
    app.kubernetes.io/instance: keycloak
    app.kubernetes.io/name: keycloak
  sessionAffinity: None
  type: NodePort

这是来自 helm template 的 keycloak-http 服务。出于某种原因,它说的是 ClusterIp,但初始 values.yaml 都说的是 NodePort,而且 kubectl edit service keycloak-http 都说它是 NodePort:

# Source: keycloak/templates/service-http.yaml
apiVersion: v1
kind: Service
metadata:
  name: keycloak-http
  labels:
    helm.sh/chart: keycloak-10.1.0
    app.kubernetes.io/name: keycloak
    app.kubernetes.io/instance: keycloak
    app.kubernetes.io/version: "12.0.4"
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: http
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 80
      targetPort: http
      protocol: TCP
    - name: https
      port: 8443
      targetPort: https
      protocol: TCP
    - name: http-management
      port: 9990
      targetPort: http-management
      protocol: TCP
  selector:
    app.kubernetes.io/name: keycloak
    app.kubernetes.io/instance: keycloak

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

请手动删除服务并重新执行 helm 升级

答案 1 :(得分:0)

我拉取了存储库并尝试将 values.yaml 更改为 NodePort,这对我来说很好用。打印的模板有 NodePort 而不是 ClusterIP。这意味着您可能做错了什么,或者可能使用了一些错误的值文件。

现在错误本身就在那里,因为您不能像那样更改服务类型,而 Kubernetes 不允许这样做,因为 NodePort 在服务模板中包含了附加参数:

"ports": [
            {
                "name": "http",
                "nodePort": 30240,
                "port": 8888,
                "protocol": "TCP",
                "targetPort": "http"
            }

虽然这是 ClusterIP:

"ports": [
            {
                "name": "http",
                "port": 8888,
                "protocol": "TCP",
                "targetPort": "http"
            }

当您尝试像这样更改服务时,有几种可能的解决方法:

  • 使用不同的版本名称安装新版本的 helm chart
  • 使用 kubectl edit svc 手动更改服务类型
  • 删除现有版本并安装具有相同版本名称的新版本图表