为6节点RKE2 Kubernetes集群配置Nginx四层负载均衡器的配置疑问
兄弟,我太懂你现在的困惑了——刚上手RKE2和Nginx四层负载的时候,很容易搞不清控制节点和worker节点该往配置里的哪个地方塞,我给你把核心场景拆解开,你一看就明白:
首先得明确,Nginx四层负载在你的RKE2集群里主要管两类流量,对应的节点配置完全不一样,咱们分开说:
一、给Kubernetes控制平面做负载(最关键的基础配置)
RKE2的3个控制平面节点上都跑着kube-apiserver(默认端口6443),这是整个集群的“大脑入口”——不管是worker节点加入集群,还是你用kubectl操作集群,都得连这个端口。咱们用LB把流量转发到3个控制节点,这样就算某个控制节点挂了,流量会自动切到其他正常节点,集群不会崩。
你需要在Nginx配置里用stream模块(四层负载必须用这个,不能用http块),核心配置是这样的:
user www-data; worker_processes auto; pid /run/nginx.pid; # 先确保加载stream模块,Ubuntu 22.04装nginx-full的话默认就有,要是用light版得手动装 load_module /usr/lib/nginx/modules/ngx_stream_module.so; events { worker_connections 1024; } stream { # 定义上游服务器组:把3个控制平面的kube-apiserver地址加进来 upstream kube-apiserver { server 192.168.100.11:6443; server 192.168.100.12:6443; server 192.168.100.13:6443; # 要是想给某个节点加权重,比如让master-1承担更多流量,就加weight=2,比如: # server 192.168.100.11:6443 weight=2; } # 监听LB的6443端口,把所有进来的流量转发到上面的控制节点组 server { listen 6443; proxy_pass kube-apiserver; # 可选但推荐:加健康检查,避免转发到挂掉的节点 proxy_connect_timeout 1s; proxy_next_upstream on; } }
配置完这个,你后续加worker节点的时候,指定的server地址就是192.168.100.100:6443,kubectl的kubeconfig里也把server改成这个LB地址就行。
二、给业务服务做四层负载(如果需要外部访问业务)
要是你想让外部用户通过LB访问集群里的业务服务,这时候就得把流量转发到worker节点——因为默认情况下,RKE2的控制节点有污点,不会调度业务Pod,业务Pod都跑在worker上。
举个例子:假设你的业务服务用了NodePort类型,端口是30080(对应容器的80端口),那就在刚才的stream块里加这段配置:
stream { # 上面的kube-apiserver上游和server配置保留 # 业务服务的上游组:把3个worker节点的NodePort加进来 upstream my-business-app { server 192.168.100.14:30080; server 192.168.100.15:30080; server 192.168.100.16:30080; } # 监听LB的80端口,转发到业务服务的worker节点组 server { listen 80; proxy_pass my-business-app; } }
这样外部用户访问192.168.100.100:80,流量就会被转发到某个worker节点的30080端口,进而访问到业务Pod。
几个容易踩的坑
- 别把控制节点和worker节点混在同一个上游组里!控制平面的流量只到控制节点,业务流量只到worker节点,混在一起只会乱套。
- 四层负载必须用
stream块,别用http块——http是七层负载,会解析HTTP内容,四层只看IP和端口,适合转发TCP/UDP流量(比如kube-apiserver的TCP流量、业务的TCP流量)。 - 检查Nginx有没有stream模块:Ubuntu上装
nginx-full包就自带,要是之前装的是nginx-light,得先卸载再装nginx-full,或者手动加载模块。
备注:内容来源于stack exchange,提问作者user3142695

