Nginx Ingress: 找不到服务“ingress-nginx-controller-admission”。

91

大约一年前,我们为客户创建了一个具有两个环境的 Kubernetes 集群;预备环境和生产环境在命名空间中分开。我们目前正在开发应用程序的下一个版本,并需要一个用于此开发工作的环境,因此我们在其自己的命名空间中创建了 beta 环境。

这是一个裸机 Kubernetes 集群,使用了 MetalLB 和 nginx-ingress。nginx ingress 控制器是使用 helm 安装的,而 ingresses 是使用以下清单创建的(命名空间由我们的部署管道强制执行,不在清单中可见):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    #ingress.kubernetes.io/ssl-redirect: "true"
    #kubernetes.io/tls-acme: "true"
    #certmanager.k8s.io/issuer: "letsencrypt-staging"
    #certmanager.k8s.io/acme-challenge-type: http01
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/configuration-snippet: |
      more_set_headers "X-Robots-Tag: noindex, nofollow";
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "GET, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-origin: "*"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
  tls:
    - hosts:
        - ${API_DOMAIN}
      secretName: api-cert
  rules:
    - host: ${API_DOMAIN}
      http:
        paths:
          - backend:
              serviceName: api
              servicePort: 80

在应用清单时,Kubernetes 响应以下错误:

Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s: service "ingress-nginx-controller-admission" not found

我尝试将 ingress 的 apiVersion 更新为 networking.k8s.io/v1beta1(这是新的 nginx-ingress 控制器通过 helm 安装的 apiVersion),但我仍然遇到相同的错误。

我最初怀疑这与当前安装和一年前的安装之间的 nginx-ingress 更改有关,即使 ingress 控制器被分隔成不同的命名空间。但我在任何命名空间中都找不到名为 ingress-nginx-controller-admission 的服务,因此我不知道该如何继续。

6个回答

269

我曾经遇到同样的问题,并在另一个SO线程中找到了解决方案。

我之前使用清单安装了nginx-ingress,我删除了它创建的命名空间以及文档中提到的集群角色和集群角色绑定,但这并不会删除安装在清单中的ValidatingWebhookConfiguration,但默认情况下,helm不会安装它。正如上面提到的Arghya,可以使用helm参数启用它。

一旦我删除了ValidatingWebhookConfiguration,我的helm安装就顺利进行了。

kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

我的没有,它只是永远卡在那里。 - Nathan McKaskle
在较新的k8s版本中,它是'kubectl delete -A validatingwebhookconfigurations.admissionregistration.k8s.io ....' - lexXxel
1
非常感谢,在删除了先前安装的ValidatingWebhookConfiguration之后,新部署进展顺利 :) - Pinak Mazumdar
1
如果答案不能永久解决您的问题,请尝试删除 ingress-nginx-admission-createingress-nginx-admission-patch 作业。 要删除作业,请运行以下命令: kubectl delete job -n ingress-nginx ingress-nginx-admission-create ingress-nginx-admission-patch - Yeahia Md Abid
这应该在nginx-ingress的常见问题解答中,以进行完全清理。 - Evan Carroll

31

您可以检查是否存在验证 Webhook和服务。如果它们不存在,请仔细检查部署并添加它们。

kubectl get -A ValidatingWebhookConfiguration
NAME                      CREATED AT
ingress-nginx-admission   2020-04-22T15:01:33Z

kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.96.212.217   <none>        80:32268/TCP,443:32683/TCP   2m34s
ingress-nginx-controller-admission   ClusterIP   10.96.151.42    <none>        443/TCP                      2m34s

部署yaml文件 在这里 包含了Webhook和Service。

如果您使用helm安装它,您可以通过helm参数启用/禁用Webhook,如此处所定义。


你好,感谢您的回复。我已验证 webhook 的存在。ingress-nginx-controller 服务存在于 beta 命名空间中,而不是 ingress-nginx 命名空间中。我在 beta 命名空间中创建了 ingress-nginx-controller-admission 服务,但是我仍然遇到相同的错误。 - Jørgen
在同一集群中有多少个Nginx Ingress控制器部署? - Arghya Sadhu
三个。每个环境一个。 - Jørgen
我希望你已经按照这个链接 https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/#multiple-ingress-nginx-controllers 进行操作了,否则会导致问题。 - Arghya Sadhu
不,我在解决这个问题时已经看到了。我使用helm同时安装了前两个环境,并且它们都一直无故障地工作了一年。这可能有关吗?我可能需要更新所有环境的args。 - Jørgen
您可能需要考虑将所有命名空间配置为单个 Ingress 组,只需配置 Nginx Ingress 安全和转发规则即可添加。 - James Stone

5

1
对我来说,问题出在 Kubernetes 版本 1.18 上,我升级到了 1.19.1,问题就解决了。
Pod 状态。
k get pods -n ingress-nginx
NAME                                        READY   STATUS             RESTARTS   AGE
ingress-nginx-admission-create-cgpj7        0/1     Completed          0          3m44s
ingress-nginx-admission-patch-mksxs         0/1     Completed          0          3m44s
ingress-nginx-controller-5fb6f67b9c-ps67k   0/1     CrashLoopBackOff   5          3m45s

来自pod的错误日志

I0916 07:15:34.317477       8 main.go:104] "SSL fake certificate created" file="/etc/ingress-controller/ssl/default-fake-certificate.pem"
F0916 07:15:34.318721       8 main.go:107] ingress-nginx requires Kubernetes v1.19.0 or higher

k get po -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2tk8p        0/1     Completed   0          104s
ingress-nginx-admission-patch-nlv5w         0/1     Completed   0          104s
ingress-nginx-controller-79c4d49bb9-7bgcj   1/1     Running     0          105s

1
我的问题被证明是一个 SSL 证书问题。在我删除 "ValidatingWebhookConfiguration" 后,问题得到解决。

0

我在处理Kubernetes集群时遇到了这个问题。

当我在测试Kubernetes集群中将资源从一个节点池迁移到另一个节点池时,出现了这个问题。

我忘记了我还没有将Nginx ingressCert Manager从我想要停用的节点池中迁移出来。因此,在将我想要停用的节点池中的其他应用程序迁移出去后,我删除了该节点池,这导致Nginx ingressCert Manager从Kubernetes集群中被删除。

我所要做的就是重新部署Nginx ingressCert Manager到新的节点池中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接