Nginx 控制器的入口无法工作,地址丢失

jer*_*n95 3 nginx kubernetes kubernetes-ingress nginx-ingress

我有一个 Kubernetes 集群,运行在 1 个主节点、2 个工作节点的 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>
Run Code Online (Sandbox Code Playgroud)

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:
Run Code Online (Sandbox Code Playgroud)

来自集群外部的 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)
Run Code Online (Sandbox Code Playgroud)

And*_*ndD 10

查看 Ingress 定义,我发现它缺少 ingress 类。您定义了一个 IngressClass 并注释为要使用的默认类,或者这可能是您的 Ingress 目前无法工作的原因。

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

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

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  ...
Run Code Online (Sandbox Code Playgroud)

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

即使在新版本的 Kubernetes 中,旧的注释可能仍然受支持,具体取决于控制器。

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

  • ingress.class 现已弃用。相反,在规范下添加行 ingressClassName: nginx (3认同)