无法设置 kubernetes ingress-nginx

Posted

技术标签:

【中文标题】无法设置 kubernetes ingress-nginx【英文标题】:Unable to setup kubernetes ingress-nginx 【发布时间】:2019-08-08 02:37:54 【问题描述】:

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

应用部署:

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

入口 nginx 设置:

    在命名空间 ingress 中创建了 ingress-nginx 控制器 在命名空间 ingress 中创建了 ingress-nginx 服务
ingress-nginx          NodePort    10.102.152.58   <none>      80:30692/TCP,443:32297/TCP   6d2h
    在入口命名空间中创建入口资源类型,如下所示
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.ObjectReferenceKind:"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 经典设置:

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

当我这样做时:

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

我没有得到任何回应。

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

如果我这样做:

telnet testapp.k8s.myorg.io 80

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

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

curl http://testapp 

我会得到适当的回应。

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

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

    DNS 被正确解析到 ELB

    在 ELB 上运行 HealthCheck

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

【问题讨论】:

您能否在 aws 控制台中检查您的 ec2 实例是否可用于 elb? 你能从节点卷曲你的应用吗? 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

尝试使用此设置 nginx 入口控制器

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

这将创建命名空间名称为 ingress-nginx 的入口 nginx 控制器,您可以使用入口清单文件进行测试。

【讨论】:

以上是关于无法设置 kubernetes ingress-nginx的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Kubernetes 中从工作连接到服务

Kubernetes 中的 NGINX 无法解析 DNS

Kubernetes - 无法从服务的 pod 连接到服务 IP

如何在 Kubernetes 中为容器设置 ulimit?

大使pod在kubernetes中失败,因为kubernetes api服务器集群IP无法访问 - [Errno 113]主机无法访问',)

Kubernetes 无法删除状态为Terminating的Pod解决方法