expose-via-external-lb.md 6.4 KB

使用集群外的负载均衡软件

在裸机环境中,可以使用 Nginx、HAProxy 等负载均衡软件,将外部流量转发到 Nginx Ingress Controller 的服务。

使用 Nginx、HAProxy 等负载均衡软件, 任选一个

1. 使用 Nginx 配置多个 Upstream 和 Proxy Protocol

步骤 1:配置 Nginx 作为负载均衡器

  1. 编辑 Nginx 配置文件

打开 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf),并添加 TCP 负载均衡配置。

   stream {
       log_format main '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time';
       
       access_log /var/log/nginx/access.log main;
   
       upstream ingress_http {
           server <node1-ip>:30080;
           server <node2-ip>:30080;
           server <node3-ip>:30080;
           # 添加更多节点...
       }
   
       upstream ingress_https {
           server <node1-ip>:30443;
           server <node2-ip>:30443;
           server <node3-ip>:30443;
           # 添加更多节点...
       }
   
       server {
           listen 80;
           proxy_pass ingress_http;
           proxy_protocol on;
       }
   
       server {
           listen 443;
           proxy_pass ingress_https;
           proxy_protocol on;
       }
   }

配置说明

  • upstream ingress_httpupstream ingress_https 定义了两个不同的 upstream 组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。
  • proxy_protocol on; 启用 Proxy Protocol 以确保客户端的真实 IP 地址能够传递给 Nginx Ingress Controller。
  • <node1-ip>, <node2-ip>, <node3-ip> 替换为实际节点的 IP 地址。
  1. 重启 Nginx

应用配置更改并重启 Nginx:

   sudo systemctl restart nginx

步骤 2:验证 Nginx 配置

确保 Nginx 正确配置并能够处理 TCP 流量和 Proxy Protocol。检查 Nginx 状态和日志:

sudo systemctl status nginx
tail -f /var/log/nginx/access.log

2. 使用 HAProxy 配置多个 Upstream 和 Proxy Protocol

步骤 1:配置 HAProxy 作为负载均衡器

  1. 编辑 HAProxy 配置文件

打开 HAProxy 配置文件(通常位于 /etc/haproxy/haproxy.cfg),并添加 TCP 负载均衡配置。

   global
       log /dev/log local0
       log /dev/log local1 notice
       chroot /var/lib/haproxy
       stats socket /run/haproxy/admin.sock mode 660
       stats timeout 30s
       user haproxy
       group haproxy
       daemon
   
   defaults
       log     global
       option  httplog
       option  dontlognull
       timeout connect 5000ms
       timeout client  50000ms
       timeout server  50000ms
   
   frontend http_front
       bind *:80
       default_backend http_back
   
   frontend https_front
       bind *:443
       default_backend https_back
   
   backend http_back
       server ingress1 <node1-ip>:30080 check send-proxy
       server ingress2 <node2-ip>:30080 check send-proxy
       server ingress3 <node3-ip>:30080 check send-proxy
       # 添加更多节点...
   
   backend https_back
       server ingress1 <node1-ip>:30443 check send-proxy
       server ingress2 <node2-ip>:30443 check send-proxy
       server ingress3 <node3-ip>:30443 check send-proxy
       # 添加更多节点...

配置说明

  • backend http_backbackend https_back 定义了两个不同的 backend 组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。
  • send-proxy 启用 Proxy Protocol,将客户端的真实 IP 地址传递给后端服务。
  • <node1-ip>, <node2-ip>, <node3-ip> 替换为实际节点的 IP 地址。
  1. 重启 HAProxy

应用配置更改并重启 HAProxy:

   sudo systemctl restart haproxy

步骤 2:验证 HAProxy 配置

确保 HAProxy 正确配置并能够处理 TCP 流量和 Proxy Protocol。检查 HAProxy 状态和日志:

sudo systemctl status haproxy
tail -f /var/log/haproxy.log

配置 Nginx Ingress Controller

  1. 部署 Nginx Ingress Controller

将 Nginx Ingress Controller 的 Service 类型设置为 NodePort

   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
   kubectl create namespace ingress-nginx
   helm install ingress-nginx ingress-nginx/ingress-nginx \
       --set controller.service.type=NodePort \
       --set controller.service.nodePorts.http=30080 \
       --set controller.service.nodePorts.https=30443 \
       --set ingressClassResource.default=true \
       --set controller.watchIngressWithoutClass=true \
       --namespace ingress-nginx
  1. 配置防火墙

在每个节点的防火墙中开放 30080 和 30443 端口。

确保 Nginx Ingress Controller 支持 Proxy Protocol,以正确处理客户端的真实 IP 地址。

  1. 检查 Nginx Ingress Controller 配置

    kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml > nginx-configmap.yaml
    
  2. 确认配置

确保 ConfigMap 中包含 use-proxy-protocol: "true" 配置。如果没有,需要创建或更新 ConfigMap:

   apiVersion: v1
   kind: ConfigMap
   metadata:
     name: nginx-configuration
     namespace: ingress-nginx
   data:
     use-proxy-protocol: "true"

应用更新的 ConfigMap:

   kubectl apply -f nginx-configmap.yaml

或者通过 patch 方式更新:

   kubectl -n ingress-nginx patch configmaps ingress-nginx-controller -p '{"data": {"use-proxy-protocol": "true"}}'
  1. 重启 Nginx Ingress Controller

重新启动 Nginx Ingress Controller 以使配置更改生效:

   kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx

总结

配置集群外的负载均衡器(Nginx 或 HAProxy)以处理多个节点,并将流量分配到不同的 upstream 组,同时启用 Proxy Protocol,可以确保客户端的真实 IP 地址被正确传递到集群内部的 Nginx Ingress Controller。配置过程中:

  • Nginx 配置:定义两个 upstream 组,分别处理 HTTP 和 HTTPS 流量,并启用 Proxy Protocol。
  • HAProxy 配置:定义两个 backend 组,分别处理 HTTP 和 HTTPS 流量,并启用 Proxy Protocol。
  • Ingress Controller 配置:确认 Proxy Protocol 设置,以确保正确处理客户端 IP 地址。