如何使用 nginx 入口将流量从 route53 中的域转发到 pod?

Posted

技术标签:

【中文标题】如何使用 nginx 入口将流量从 route53 中的域转发到 pod?【英文标题】:How to forward traffic from domain in route53 to a pod using nginx ingress? 【发布时间】:2019-09-06 09:37:06 【问题描述】:

我使用 helm 部署了 grafana,现在它在 pod 中运行。如果我将端口 3000 代理到我的笔记本电脑,我可以访问它。 我试图将域 grafana.something.com 指向该 pod,以便我可以从外部访问它。 我在 route53 中有一个域,我可以将它附加到负载均衡器(应用程序负载均衡器、网络负载均衡器、经典负载均衡器)。该负载均衡器可以将流量从端口 80 转发到端口 80 到一组节点(让我们稍后将端口 443 保留)。 我真的很难设置这个。我确定缺少某些东西,但我不知道是什么。

我想象的基本图表看起来像这样。

互联网 ↓↓ route53 中的域 (grafana.something.com) ↓↓ 负载均衡器 80 到 80(应用负载均衡器、网络负载均衡器、经典负载均衡器) 我猜想 LB 会将流量转发到端口 80 到下面的 Ingress Controller(在使用 Helm 部署 Grafana 时创建) ↓↓ EKS 工作节点组 ↓↓ 入口资源????? ↓↓ 入口控制器 - 在命名空间测试中使用 Helm 部署 Grafana 时创建。

kubectl get svc grafana -n test

grafana Type:ClusterIP ClusterIP:10.x.x.x Port:80/TCP

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 
  labels:
    app: grafana
    chart: grafana-
    heritage: Tiller
    release: grafana-release
  name: grafana
  namespace: test
  resourceVersion: "xxxx"
  selfLink: 
  uid: 
spec:
  clusterIP: 10.x.x.x
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 3000
  selector:
    app: grafana
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: 

↓↓ Pod Grafana 正在监听 3000 端口。代理到我的笔记本电脑端口 3000 后我可以成功访问它。

【问题讨论】:

您是否安装了入口控制器?您显示的是 Service (kubernetes.io/docs/concepts/services-networking/service),它不同于 Ingress (kubernetes.io/docs/concepts/services-networking/ingress) 我好像没有。基本入口看起来像我理解的那样。它会将来自 grafana.something.com 的流量转发到我已经拥有的服务。 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: grafana-test-ingress-controller spec: rules: - host: grafana.something.com http: paths: - backend: serviceName: grafana # 这是应用程序:grafana service servicePort: 80 #这是app的端口:grafana service 入口会在Service和route53domain/Loadbalancer之间吗? 【参考方案1】:

鉴于您似乎没有安装 Ingress Controller,如果您在 K8S 集群中配置了 aws cloud-provider,您可以按照 this guide 使用 Helm 安装 nginx Ingress 控制器。

在本指南的最后,您应该为您的入口控制器创建了一个负载均衡器,将您的 Route53 记录指向它并创建一个使用您的 grafana 服务的入口。示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/app-root: /
    nginx.ingress.kubernetes.io/enable-access-log: "true"
  name: grafana-ingress
  namespace: test
spec:
  rules:
  - host: grafana.something.com
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: 80
        path: /

最终的交通路径是:

Route53 -> ELB -> Ingress -> Service -> Pods

【讨论】:

成功了!原来我已经有一个入口,所以我只关注了 helm Nginx Ingress 控制器,并在指出它工作的域之后。谢谢你。我需要把它放在图表上,这样我才能理解。我使用默认值安装了 nginx 并且它工作但它如何知道将 grafana.something.com 转发到哪里,它会自动检测我创建的入口吗? nginx 似乎有这些端口 80:31092/TCP,443:30264/TCP 那么这个魔法是如何工作的呢? 当您创建一个 Ingress 时,所选的 Ingress Controller 会检测到它并根据配置配置后端。我不知道它放置的 100% 配置,但给出的是 nginx,它必须使用配置的主机添加一个服务器块,nginx 负责其余的工作。您看到的端口 31092 和 30264 是在 kubernetes 节点中公开的端口,以便负载均衡器能够将流量转发到 nginx pod。 80 和 443 是你的 LB 的监听端口。【参考方案2】:

在此处添加 2 条重要建议。

1 ) 关注improvements to the ingress api in kubernetes 1.18 - 一个新的 ingressClassName 字段已添加到 Ingress 规范中,该字段用于引用应用于实现此 Ingress 的 IngressClass。 请考虑切换到ingressClassName字段而不是kubernetes.io/ingress.class注解

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: grafana-ingress
  namespace: test
spec:
  ingressClassName: nginx # <-- Here
  rules:
    - host: grafana.something.com
      http:
        paths:
          - path: /
            backend:
              serviceName: grafana
              servicePort: 80

2 ) 考虑使用 External-DNS 来集成外部 DNS 服务器(检查 AWS Route53 上的 this 示例)和 Kubernetes 入口/服务。

【讨论】:

以上是关于如何使用 nginx 入口将流量从 route53 中的域转发到 pod?的主要内容,如果未能解决你的问题,请参考以下文章

具有GeoLocation Routing的AWS Route 53是否足以满足基本CDN行为

如何仅使用 AWS 服务重定向流量?

我们如何使用 Kong 替换现有的 Nginx?

如何将域从 Godaddy 移动到 AWS Route 53

如何配置入口以使用 https 将流量定向到 https 后端

我们如何使用 Route53 将 DNS 条目添加到由外部(第三方)域提供商托管的域