冒死分析: Ingress 没有准备好成为"统一流量入口"

136 天前
 easterfan

目前在做的专有云领域,一个基于 k8s 的容器云迁云项目, 集群稳定运行一年后,有天突然出现 P0 事故,全平台入口宕机,事后将 ingress 架构一拆为三,写了一篇博客记录; 但是对 ingress 了解不深,观点可能有失偏颇

所以发到 v2 上,给大佬们批评指正

原文地址(博客托管在 github pages 上,加载可能很慢,请见谅):👇🏻

冒死分析:Ingress 没有准备好成为"统一流量入口"

4589 次点击
所在节点    云计算
55 条回复
privil
135 天前
@momo24672 基于 nginx openresty 的都会有的,kong ,apisix 都有这个问题。
privil
135 天前
@JoeJasper 确实,之前看 Sealos 的网关选型经验 https://mp.weixin.qq.com/s/Ks1iOCQFFMyLJp8C7HtpaA
iv2ex
135 天前
@renmu 怎么解决定位的问题?登录成功之后应该是没有定位信息,所以加载不出来地图资源和聊天信息
ExplodingFKL
135 天前
看架构里面最奇怪的是为啥要用 nginx 来做 udp 转发
sampeng
135 天前
我很纳闷。。。udp 你一定要用 ingress 怪谁呢。。。
sampeng
135 天前
在上 k8s 的时候 udp 入口就不要从 ingress 进来。这不是 ingress 干的事。或者说,不合理,不好用。ingress 就处理 http 就好了。
sampeng
135 天前
既然是在云上。svc 直接挂在 nlb 上暴露出去即可。。压根不需要 ingress 来参与
sampeng
135 天前
另一方面,health check 太糟糕。你这锅盖 ingress 上实在是不对。作为运维,你的监控系统和 nginx 的 health 检查居然不和你业务相结合。。。nginx 挂了你倒是自动重启 nginx 啊。。。

所以两个小时核心是 udp 服务挂了两个小时??

反正 lz 是懂起标题的
clhlc
135 天前
slb 流量直接到 pod ,去掉 ingress 这一层
easterfan
135 天前
@huihuimoe 主要是一开始 ingress 定位就是所有流量入口,没调研到 udp 场景,也是出了事故后,才知道供应商有 UDP 应用~
metallb 我们目前还没有生产使用经验,感谢提醒,后面会调研下
easterfan
135 天前
@rushssss 感谢回复!很靠谱的方案
不过”UDP 流量直接通过 SLB 打到 nodeport 上“,这个方案可能不太合适

1. 集群规模 100 多台机器,除了管控 node 常驻外,其他 worker node ,都是会存在主机上下线场景,nodeport 的 EIP 不好固定,UDP 流量都打到管控 node 的话,这几台机器高峰期压力很大

2. 还是集群规模上,100 多台机器上都开 nodeport 端口,实际只有 1 2 台机器开 EIP + nodeport ,为一个业务开这么多端口,开销大,也显得浪费,所有供应商的对外服务暴露,没有必要情况,都要求首先走 ingress ,不走 nodeport

3. 现在架构设计是 SLB 下挂了 2 台 ingress 主机,如果用 机器 EIP+nodeport 方式,让业务流量直接打到 worker 机器上,那现在这种负载均衡设计就没意义了啊

cc @sampeng
sampeng
134 天前
@easterfan 哦。你的网络模式是没和外部打通的?我一般云上建集群是使用 ip 模式。这样更灵活,网络吞吐也更好,因为从技术上来说,网络包是正儿八经的跟网卡绑定进行流转的,可以做更多的事。这种方式 slb 就是直接到 pod 。比如 nginx ingress 。我推测你现在的方式是 nginx 用的 host ,然后独占一台机器。然后把 slb 指向这个机器组。

我从来就不用 nodeport 的方式。。。只会在开发环境自己懒得折腾就搞的 nodeport
sampeng
134 天前
aws:

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/service/annotations/#nlb-target-type

service.beta.kubernetes.io/aws-load-balancer-nlb-target-type

ip mode will route traffic directly to the pod IP.

network plugin must use native AWS VPC networking configuration for pod IP, for example Amazon VPC CNI plugin.

阿里云:
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/add-annotations-to-the-yaml-file-of-a-service-to-configure-clb-instances#c049ddf4f5uba

直接将 Pod ENI 挂载到 CLB 后端
Annotation:service.beta.kubernetes.io/backend-type
CLB 后端服务器类型。取值:

eni:通过此配置将 Pod 挂载到 CLB 后端,可以提高网络转发性能。仅在 Terway 网络模式下生效。
ecs:将 ECS 挂载到 CLB 后端。
sampeng
134 天前
单机独占 host 的 nginx 。。你后面还会踩雷。。
oktp123
95 天前
可以试试 Higress ,基本上兼容 Nginx ingress 的注解了,没有 reload 的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1041042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX