【问题标题】:Ingress with Nginx Controller not working, Address missingNginx 控制器的入口不起作用,地址丢失
【发布时间】:2021-01-31 13:41:06
【问题描述】:

我有一个 Kubernetes 集群在 1 个 master、2 个 worker setup ob linux 服务器上运行。我有一个 HAProxy 将我的请求转发到 Nginx 控制器。我的完整设置位于公司代理后面。在此公司代理中启用了 DNS 条目。 请求将到达 nginx 控制器,但不会转发到服务。 我按照许多教程的描述安装了入口控制器,文件位于https://github.com/kubernetes/ingress-nginx 中。

我是堆栈溢出的新手,所以如果我应该提供更具体的信息,请告诉我。我希望有人可以帮助我解决我的问题,提前谢谢你:D

我的 Ingress 缺少地址:

Name:             app-ingress
Namespace:        default
Address:
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host                       Path  Backends
  ----                       ----  --------
  test.kubetest.lff.bybn.de
                             /abc   app-service:80 (10.244.2.4:3000)
Annotations:                 kubernetes.io/ingress.class: nginx
Events:                      <none>

Deployment、Service和Ingress、IngressClass、ConfigMap的Yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: app
  name: app-blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: app
      version: 0.0.1
  template:
    metadata:
      labels:
        run: app
        version: 0.0.1
    spec:
      containers:
      - name: app
        image: errm/versions:0.0.1
        ports:
        - containerPort: 3000
----



apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    run: app
    version: 0.0.1
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 3000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: test.kubetest.lff.bybn.de
    http:
      paths:
      - path: /abc
        backend:
          serviceName: app-service
          servicePort: 80
---

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  # annotations:
  #   ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller
---

kind: ConfigMap
apiVersion: v1
metadata:
  name: nginx-config
  namespace: nginx-ingress
data:

来自集群外部的 Curl 和来自 Controller Pod 的日志

curl test.kubetest.lff.bybn.de/abc
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    93    0    93    0     0      1      0 --:--:--  0:00:50 --:--:--    26<html><body><h1>504 Gateway Time-out</h1>
The server didn't respond in time.
</body></html>



E0131 19:44:11.949261       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
E0131 19:45:06.894791       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
E0131 19:45:48.532075       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
10.48.25.57 - - [31/Jan/2021:19:46:35 +0000] "GET /abc HTTP/1.1" 499 0 "-" "curl/7.73.0" "-"
E0131 19:46:37.902444       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
E0131 19:47:15.346193       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
E0131 19:47:48.536636       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)
E0131 19:48:21.890770       1 reflector.go:138] /home/runner/work/kubernetes-ingress/kubernetes-ingress/internal/k8s/controller.go:574: Failed to watch *v1.Policy: failed to list *v1.Policy: the server could not find the requested resource (get policies.k8s.nginx.org)

【问题讨论】:

  • 将此答案发布到适当的网站(例如serverfault.com)不是更好吗?
  • 以前不知道这个网站,但我会看看它,也许也会在那里打开一个问题
  • 你的 kubernetes 版本是多少?如果它高于 1.18,那么您应该在 Ingress yaml 中使用 IngressClassingressClassName。因此,您应该将ingressClassName: nginx 添加到您的 Ingress yaml 中,并删除注释。有一个example。我还看到你的路径是/abc,它配置正确吗?您的应用程序中是否配置了路径/abc

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

查看 Ingress 定义,我发现它错过了 ingress 类。您将 IngressClass 定义为要使用的默认类,或者这可能是您的 Ingress 目前无法正常工作的原因。

Ingress Class 基本上是一个类别,它指定谁需要服务和管理 Ingress,这是必要的,因为在集群中您可以拥有多个 Ingress 控制器,每个控制器都有其规则和配置。

根据 Kubernetes 版本,可以在入口(v1.18 之前)上使用注解定义入口类,例如:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  ...

或者使用整个资源,然后参考文档中所示的 Ingress (https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class)

即使在新版本的 Kubernetes 中,旧的注解可能仍然被支持,这取决于控制器。

如果你不确定你应该使用哪个入口类,那应该由控制器定义,你可能在安装它时决定了一个,或者你使用了默认的一个(大多数时候是 nginx)

【讨论】:

  • 感谢您的回答。我有一个入口类,但缺少注释。我尝试使用 ingress 类作为默认值,我之前尝试过使用 ingress 类作为注释,但没有任何区别。当 kubectl describe ingress 时,该类是否可见?
  • 如果你把注解放在正确的入口类中,这样你的 nginx-controller 应该服务和管理入口,没有什么改变吗? nginx-controller Pod 是否记录任何内容?
  • 那里没有任何改变,但我会再次测试。如果 ingress 类在 ingress 之前就存在,有什么区别吗?
  • 应该没什么区别。可以发一下 IngressClass 资源的定义吗?
  • 你是对的!我在服务本身中发现了错误。您的答案是我设置中缺少的部分,谢谢:D
猜你喜欢
  • 1970-01-01
  • 2022-08-02
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2020-02-17
  • 2022-11-01
相关资源
最近更新 更多