首页 > 解决方案 > 无法设置 kubernetes ingress-nginx

问题描述

为了在外部公开我的应用程序,我在设置 kubernetes ingress-nginx 时遇到了麻烦。以下是我执行的步骤:

应用部署:

  1. 创建名为 ingress 的命名空间
  2. 在入口命名空间中部署了描述我的应用程序(我们称之为 testapp)的 statefulset 集资源
  3. 创建了 ClusterIP 服务,使我的应用程序在入口命名空间的 kube 集群 (testapp) 中可用

入口 nginx 设置:

  1. 在命名空间 ingress 中创建了 ingress-nginx 控制器
  2. 在命名空间 ingress 中创建了 ingress-nginx 服务
ingress-nginx          NodePort    10.102.152.58   <none>      80:30692/TCP,443:32297/TCP   6d2h
  1. 在入口命名空间中创建入口资源类型,如下所示
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target:  /
  name: testappingress
spec:
  rules:
  - host: testapp.k8s.myorg.io
    http:
      paths:
      - backend:
          serviceName: testapp
          servicePort: 80
        path: /

如果我确实描述了入口资源,我会得到:

ubuntu@ip-10-0-20-81:~/ingress$ kubectl describe ingress testappingress -n ingress
Name:             testappingress
Namespace:        ingress
Address:
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host                      Path  Backends
  ----                      ----  --------
  testapp.k8s.myorg.io
                            /   testapp:80 (<none>)
Annotations:
  kubernetes.io/ingress.class:                 nginx
  nginx.ingress.kubernetes.io/rewrite-target:  /
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  15m   nginx-ingress-controller  Ingress ingress/testappingress
  Normal  CREATE  15m   nginx-ingress-controller  Ingress ingress/testappingress
  Normal  UPDATE  14m   nginx-ingress-controller  Ingress ingress/testappingress
  Normal  UPDATE  14m   nginx-ingress-controller  Ingress ingress/testappingress

如果我从 ingress-nginx 控制器检查日志,我会得到以下信息:

I0317 15:06:00.029706       6 event.go:221] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"ingress", Name:"testappingress", UID:"2c8db73f-48c6-11e9-ae46-12bdb9ac3010", APIVersion:"extensions/v1beta1", ResourceVersion:"1185441", FieldPath:""}): type: 'Normal' reason: 'CREATE' Ingress ingress/testappingress
I0317 15:06:00.039419       6 controller.go:177] Configuration changes detected, backend reload required.
I0317 15:06:00.508433       6 controller.go:195] Backend successfully reloaded.
I0317 15:06:00.568448       6 controller.go:212] Dynamic reconfiguration succeeded.

Route53/ELB 经典设置:

  1. 创建了指向 kubernetes 集群实例并公开端口 80 的 ELB 经典
  2. 在现有托管区域 (CNAME) 中创建了从上方指向 ELB 经典的 Route53 条目。
  3. 在 ELB 上设置运行状况检查以指向端口上的 ingress-nginx NodePort 服务:30692有效。

当我做:

curl http://testapp.k8s.myorg.io

我没有得到任何回应。

这是我试图解决问题的方法:

如果我做:

telnet testapp.k8s.myorg.io 80

它将解析为我的 ELB 经典 DNS 名称

如果我进入 ingress 命名空间中存在的任何容器/pod 并执行以下操作:

curl http://testapp 

我会得到适当的回应。

由此我可以得出以下结论:

  1. 应用程序已正确部署并通过从 kubernetes 集群内部公开的服务(ClusterIP)可用

  2. DNS 被正确解析到 ELB

  3. ELB 上的 HealthCheck 有效

不确定我还能做些什么来解决我无法通过 Ingress 访问我的服务的问题?

标签: kubernetesamazon-elbkubernetes-ingressnginx-ingress

解决方案


这是我的错误。缺少的部分如下:

在 ELB 上,我没有正确设置监听器。所以基本上,需要将 ELB 的 80/443 端口指向 Ingress 服务的 NodePorts。

ingress-nginx   ingress-nginx          NodePort    10.96.249.168    <none>        80:32327/TCP,443:30313/TCP   25h

推荐阅读