如何使用 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行为
如何将域从 Godaddy 移动到 AWS Route 53