无法设置kubernetes ingress-nginx

时间:2019-03-17 16:31:13

标签: kubernetes amazon-elb kubernetes-ingress nginx-ingress

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

应用程序部署:

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

入口nginx设置:

  1. 在命名空间入口中创建了ingress-nginx控制器
  2. 在命名空间入口中创建了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. 创建了ELB classic,它指向kubernetes集群实例并公开端口80
  2. 在现有托管区域(CNAME)中创建Route53条目,该条目从上方指向ELB classic。
  3. 在ELB上设置运行状况检查,以指向以下端口上的ingress-nginx NodePort服务: 30692

当我这样做时:

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

我没有任何回应。

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

如果我这样做:

telnet testapp.k8s.myorg.io 80

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

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

curl http://testapp 

我会得到适当的答复。

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

  1. 应用程序已正确部署,并且可以通过从Kubernetes集群内部公开的(ClusterIP)服务使用。

  2. DNS已正确解析到ELB

  3. 对ELB进行HealthCheck的工作

不知道该如何解决我无法通过Ingress访问我的服务的问题?

2 个答案:

答案 0 :(得分:1)

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

在ELB上,我没有正确设置侦听器。因此,基本上,需要的是将80/443端口从ELB指向Ingress Service的NodePorts。

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

答案 1 :(得分:0)

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

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

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