首页 > 解决方案 > 错误 504 网关超时 nginx-ingress 控制器

问题描述

我在 EC2 AWS 实例中设置 RKE 集群,但我在尝试设置 nginx 入口控制器时遇到问题,有时在尝试访问它时会出错。我的架构是这样的:

在此处输入图像描述

实例 #1 它只是一个在每个节点中执行负载均衡器的 nginx 服务器,#2 和 #3 是一个 RKE 节点都具有这些角色: - controlplane - worker - etcd

我已经部署了两个服务/部署。我试图设置一个 nginx 入口控制器,以根据路径将流量重定向到每个服务,但有时我只是得到 504 Gateway Time-out 而其他一个加载正确。使用 hey 进行小负载测试,我看到几乎 50% 的人得到了 504 错误。状态码分布:【200】102响应【504】98响应

调试 nginx-ingress 控制器我看到其中一个似乎无法访问服务,我认为出于这个原因有时我会收到 504 错误,但我不知道为什么。

2020/01/27 01:40:31 [error] 1767#1767: *128496 upstream timed out (110: Connection timed out) while connecting to upstream, client: 10.0.1.163, server: <host>, request: "GET /nginx HTTP/1.1", upstream: "http://10.42.1.4:80/", host: “&lt;Host>"

Kubernetes 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
name: system-deployment
labels:
app: system
spec:
replicas: 1
selector:
matchLabels:
app: system
template:
metadata:
labels:
app: system
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: inventory-deployment
labels:
app: inventory
spec:
replicas: 1
selector:
matchLabels:
app: inventory
template:
metadata:
labels:
app: inventory
spec:
containers:
- name: inventory-container
image: dockersamples/101-tutorial
ports:
- containerPort: 80
---

apiVersion: v1
kind: Service
metadata:
name: system-service
spec:
selector:
app: system
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: inventory-service
spec:
selector:
app: inventory
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: root-ingress
annotations:
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: <host>
http:
paths:
- path: /nginx
backend:
serviceName: system-service
servicePort: 80
- path: /
backend:
serviceName: inventory-service
servicePort: 80

我的理论是入口控制器无法访问其他节点中的服务,因为我收到了 504 错误,但据我所知,集群中的任何节点都可以访问服务。有人知道这里会发生什么吗?

谢谢,

标签: amazon-ec2kubernetesnginx-ingressrancherrke

解决方案


您可能需要通过在 AWS EC2 控制面板中创建安全组来允许访问您的 EC2 实例的流量。


推荐阅读