点赞
评论
收藏
分享
举报
借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡
发表于2024-07-09 16:34

浏览 3.3k

原文作者:Chris Akker - F5 技术解决方案架构师,Steve Wagner - F5 NGINX 解决方案架构师
原文链接:借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡
转载来源:NGINX 中文官网

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn



   

作为一名现代应用开发人员,您不仅使用一系列开源工具和一些商业工具来编写、测试、部署及管理新应用和容器,而且还选择了 Kubernetes 在开发、测试、模拟和生产环境中运行这些容器和 pod,并引入了微服务架构和概念、云原生计算基金会及其他现代行业标准。

这一路走来,您发现 Kubernetes 的功能的确很强大,但可能也没想到它如此繁琐、复杂和僵化。实施并协调对路由器、防火墙、负载均衡器及其他网络设备的变更和更新可能会非常困难,尤其是在您自己的数据中心!这足以让开发人员崩溃。

如何应对这些挑战与 Kubernetes 运行位置和方式(作为托管 service 或本地 service)密切相关。本文将介绍 TCP 负载均衡,这是部署选择影响易用性的关键之处。

 

使用托管 Kubernetes 进行 TCP 负载均衡(所谓的“简易方案”)

如果您使用的是 Kubernetes 公有云提供商等托管 service,那么大部分繁琐的网络工作处理均由其为您代劳。只需一个命令(kubectl apply -f loadbalancer.yaml),Service 类型 LoadBalancer 便会为您提供公共 IP、DNS 记录及 TCP 负载均衡器。例如,您可以配置 Amazon Elastic Load Balancer,以便将流量分配到包含 NGINX Ingress Controller 的 pod。使用此命令,即使后端发生变化,也不必担心。简直太简单了,给人行云流水之感!

 

使用本地 Kubernetes 进行 TCP 负载均衡(所谓的“复杂方案”)

对于本地集群,情况完全不同。您或您的网络团队同事必须提供网络服务。您可能会想:“为何让用户使用我的 Kubernetes 应用如此困难?”原因很简单,但有些出人意料:没有 service 类型 LoadBalancer(集群的前门)。

若要将应用和 service 暴露在集群外部,您的网络团队可能需要创建工单、获得审批、执行程序乃至进行安全审查 — 然后才能重新配置设备。或者,您可能需要自己搞定一切,进而拖慢了应用交付的速度。更糟糕的是,您不敢对任何 Kubernetes service 进行更改,因为如果 NodePort 发生变化,流量可能会被阻断!我们都知道用户最不希望出现 500 错误,老板可能更是如此。

 

更好的本地 TCP 负载均衡解决方案:NGINX Loadbalancer for Kubernetes

通过我们的最新免费项目,您可将“复杂方案”变成“简易方案”:这个项目就是 NGINX Loadbalancer for Kubernetes ,它能够监控 NGINX Ingress Controller,并可自动更新专为负载均衡而配置的外部 NGINX Plus 实例。它的设计非常简单,易于安装和操作。有了此解决方案,您便可在本地环境中实现 TCP 负载均衡,确保新应用和 service 能即时被检测到并可接收流量,而无需手动操作。

 

架构和流程

NGINX Loadbalancer for Kubernetes 位于 Kubernetes 集群内部,已在 Kubernetes 中注册,可监控 nginx-ingress service (NGINX Ingress Controller)。当后端发生变化时,NGINX Loadbalancer for Kubernetes 会收集 worker IP 和 no reload required 端口号,然后通过 NGINX Plus API 将 IP:ports 发送到 NGINX Plus。NGINX 上游服务器无需重新加载即可更新,NGINX Plus 将流量负载均衡到正确的上游服务器和 Kubernetes NodePort。可添加额外的 NGINX Plus 实例来实现高可用性

 

 

 

NGINX Loadbalancer for Kubernetes 用例快照

下面截图中的两个窗口展示了 NGINX Loadbalancer for Kubernetes 已部署完毕并正执行其作业:

  1. service 类型 – LoadBalancer(适用于 nginx-ingress
  2. 外部 IP – 连接到 NGINX Plus 服务器
  3. 端口 – NodePort 映射到 443:30158 及匹配的 NGINX 上游服务器(如 NGINX Plus 实时仪表盘所示)
  4. 日志 – 表示 NGINX Loadbalancer for Kubernetes 成功地将数据发送到 NGINX Plus

:在本例中,Kubernetes worker 节点为 10.1.1.8 和 10.1.1.10

   

 

立即试用

如果您正苦于无法应对 Kubernetes 集群边缘的网络挑战,不妨试试该项目,并分享一下您的感想。NGINX Loadbalancer for Kubernetes 的源代码是开源代码(使用 Apache 2.0 许可),所有安装说明均可在 GitHub 上获得

如需提供反馈,请在仓库中给我们留言,或在 NGINX Community Slack 上向我们发送消息。或者请微信添加小N助手(微信号:nginxoss)加入官方微信群,与社区用户交流探讨。



 

NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号 | B 站

已修改于2024-07-10 21:02
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
331
文章
21
问答
201
粉丝
相关文章
NGINX开源版本和商用版本的差异化对比 先从官方的对比图讲起: 其中NGINXPLUS一栏代表当前商用版本的功能/场景支持列表,NGINXOSS一栏代表社区开源版本的功能支持列表。 再从NGINX模块增强角度的对比图讲起: 其中新增的商业版本模块,是在原来开源模块基础上额外具备的,简单地说是商业版本独有的;其次,开源模块的增强部分,在商业版本里相比传统的开源模块,又做了些许优化与提升。 出处引用:https://www.nginx.com/products/nginx/#compare-versions 最后从NGINXController角度和社区开源版本的行业定制的对比图说起: 某行业基于开源版本的定制化视图: NGINX官方部分摘录: 从这一系列的结构介绍里可以看出,NGINXController对部署的要求及NGINX服务的纳管情况,简单地说提供一个平台工具来定位用了哪些NGINX服务,NGINX服务的进程情况如何,NGINX相关监控指标运行情况等,相比某行业基于开源版的定制,一个是追求原味的呈现,另一个是更贴近客
点赞 1
浏览 9.1k
NGINXPLUS提供了集群同步的脚本,可以实现集群中各实例的配置同步。具体的同步方法如下:l NGINXPLUS同步配置首先需要在被同步的从NGINXPLUS实例上配置针对主NGINXPLUS实例的免密SSH登录,配置方式如下:在主NGINXPLUS实例上生成本机的公钥和私钥: ssh-keygen-trsa 这时,会在~/.ssh目录下生成文件将公钥发送到从NGINXPLUS实例上,发送成功后,会在从NGINXPLUS的~/.ssh下生成authorized_keys文件 ssh-cory-id-i ~/.ssh/id_rsa.pubroot@192.168.174.133(主NGINXPLUS的地址) NGINXPlus通常部署在两个或更多设备的HA群集中。可以通过配置同步功能使管理员可以将配置从群集中的一台计算机(主服务器)推送到其对等服务器:在主NGINXPLUS上安装nginx-sync文件:yuminstallnginx-sync在主服务器上创建nginx-sync.conf配置文件:创建 
点赞 0
浏览 7.4k
简介如果多个NGINXPlus实例组织在一个集群中,它们之间可以共享一些状态数据,包括:•会话保持信息•请求限制,requestlimiting•键值存储,Key-Value存储所有NGINXPlus实例都可以与集群中的所有其他成员交换状态数据,前提是共享内存区域在所有集群成员上具有相同的名称,这一点可以通过配置同步来实现。状态同步对于NGINX集群的运作有着重要的意义,用户请求无论到达哪个NGINX实例,都将遵循相同的转发和处理策略,维持了会话的持续性,降低了应用设计的复杂度,同时也节约了运维成本。下面简单介绍一下如何配置和使用状态同步。1.配置NGINX状态同步。stream{  #ExampleconfigurationforTCPloadbalancing  resolver10.1.10.100status_zone=resolver-stream;  keyval_zonezone=kv_stream:32kstate=/var/lib/nginx/state/kv_str
点赞 2
浏览 6.5k