【问题标题】:multiple ingress-nginx in kubernetes not validating webhook not workingkubernetes 中的多个 ingress-nginx 未验证 webhook 不起作用
【发布时间】:2021-11-04 16:21:17
【问题描述】:

如标题所述,我目前在 gke v1.20.10 上有 2 个 ingress-nginx v1.0.0 的配置。

当我单独部署一个配置时,配置工作正常,我没有任何问题,但是当我部署第二个验证网络钩子,然后尝试部署一个入口时,2 个验证网络钩子会尝试评估新创建的入口。

这会导致这个错误:

**Error from server (InternalError): error when creating "ingress-example.yaml": Internal error occurred: failed calling webhook "validate.nginx-public.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission-public.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": x509: certificate is valid for ingress-nginx-controller-admission-private, ingress-nginx-controller-admission-private.ingress-nginx.svc, not ingress-nginx-controller-admission-public.ingress-nginx.svc**

我检查了一下,一切似乎都正确分离了,我的验证网络钩子是这样部署的,{{ ingress_type }} 是 -public 或 -private 的占位符:

---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/component: admission-webhook
  name: ingress-nginx-admission{{ ingress_type }}
webhooks:
  - name: validate.nginx{{ ingress_type }}.ingress.kubernetes.io
    matchPolicy: Equivalent
    objectSelector:
      matchLabels:
        ingress-nginx : nginx{{ ingress_type }}
    rules:
      - apiGroups:
          - networking.k8s.io
        apiVersions:
          - v1
        operations:
          - CREATE
          - UPDATE
        resources:
          - ingresses
    failurePolicy: Fail
    sideEffects: None
    admissionReviewVersions:
      - v1
    clientConfig:
      service:
        namespace: ingress-nginx
        name: ingress-nginx-controller-admission{{ ingress_type }}
        path: /networking/v1/ingresses
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller-admission{{ ingress_type }}
spec:
  type: ClusterIP
  ports:
    - name: https-webhook
      port: 443
      targetPort: webhook
      appProtocol: https
  selector:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}

我似乎找不到解决方案,有一个旧的 github 问题没有答案,也许我做错了什么但我看不到它。

正如评论中所问的,这是我正在尝试部署的入口示例,只有一个入口,而不是两个入口就可以正常工作:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx-private
#    external-dns.alpha.kubernetes.io/target: "IP"
  labels:
    ingress-nginx : nginx-public
spec:
  rules:
    - host: hello.MYDOMAINHERE
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 8080

【问题讨论】:

  • 我在多个帖子中看到删除 ValidatingWebhookConfiguration 并在大多数情况下重新部署它是可行的。您可能首先尝试备份当前验证。您尝试了哪些故障排除步骤?
  • 我想我确实读过那些,但在我看来,这更多是由于错误离开旧的验证网络钩子或处于他们正在创建新的验证网络钩子的情况下。就我而言,我想保留两个验证网络钩子或为 2 个入口保留一个。我尝试添加 objectSelector 以强制 webhook 只读取我告诉他的内容,但这不起作用。
  • 我也尝试在 webhooks 名称 validate.nginx.ingress.kubernetes.io 中使用相同的名称。似乎它是第一个创建的链接...
  • 您在部署中使用了哪些版本的 kubernetes 和 Ingress-Nginx?
  • @VicenteAyala 我添加了我目前正在使用的版本,我看到有一个新的 ingress 版本,今天将尝试。

标签: kubernetes google-kubernetes-engine ingress-nginx


【解决方案1】:

所以对于那些可能遇到此错误的人。

在发现问题之前我尝试了不同的方法。您必须重命名所有标签,但 ingress-nginx 的版本除外,我不认为它会中断这么少,但确实如此。最后我使用的是这样的:

---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/instance: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/component: admission-webhook{{ ingress_type }}
  name: ingress-nginx-admission{{ ingress_type }}
webhooks:
  - name: validate.nginx{{ ingress_type }}.ingress.kubernetes.io
    matchPolicy: Equivalent
    objectSelector:
      matchLabels:
        ingress-nginx : nginx{{ ingress_type }}
    rules:
      - apiGroups:
          - networking.k8s.io
        apiVersions:
          - v1
        operations:
          - CREATE
          - UPDATE
        resources:
          - ingresses
    failurePolicy: Fail
    sideEffects: None
    admissionReviewVersions:
      - v1
    clientConfig:
      service:
        namespace: ingress-nginx
        name: ingress-nginx-controller-admission{{ ingress_type }}
        path: /networking/v1/ingresses
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/instance: ingress-nginx{{ ingress_type }}
    app.kubernetes.io/version: 1.0.0
    app.kubernetes.io/component: controller{{ ingress_type }}
  name: ingress-nginx-controller-admission{{ ingress_type }}
spec:
  type: ClusterIP
  ports:
    - name: https-webhook
      port: 443
      targetPort: webhook
      appProtocol: https
  selector:
    app.kubernetes.io/name: ingress-nginx{{ ingress_type }}

我认为在这种情况下,对所有资源执行相同操作非常重要。

【讨论】:

  • 太棒了,你知道如何解决这个问题,感谢分享你的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多