# 使用集群外的负载均衡软件 在裸机环境中,可以使用 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 负载均衡配置。 ```nginx 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 :30080; server :30080; server :30080; # 添加更多节点... } upstream ingress_https { server :30443; server :30443; server :30443; # 添加更多节点... } server { listen 80; proxy_pass ingress_http; proxy_protocol on; } server { listen 443; proxy_pass ingress_https; proxy_protocol on; } } ``` **配置说明**: - `upstream ingress_http` 和 `upstream ingress_https` 定义了两个不同的 `upstream` 组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。 - `proxy_protocol on;` 启用 Proxy Protocol 以确保客户端的真实 IP 地址能够传递给 Nginx Ingress Controller。 - ``, ``, `` 替换为实际节点的 IP 地址。 2. **重启 Nginx**: 应用配置更改并重启 Nginx: ```sh sudo systemctl restart nginx ``` **步骤 2:验证 Nginx 配置** 确保 Nginx 正确配置并能够处理 TCP 流量和 Proxy Protocol。检查 Nginx 状态和日志: ```sh 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 负载均衡配置。 ```cc 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 :30080 check send-proxy server ingress2 :30080 check send-proxy server ingress3 :30080 check send-proxy # 添加更多节点... backend https_back server ingress1 :30443 check send-proxy server ingress2 :30443 check send-proxy server ingress3 :30443 check send-proxy # 添加更多节点... ``` **配置说明**: - `backend http_back` 和 `backend https_back` 定义了两个不同的 `backend` 组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。 - `send-proxy` 启用 Proxy Protocol,将客户端的真实 IP 地址传递给后端服务。 - ``, ``, `` 替换为实际节点的 IP 地址。 2. **重启 HAProxy**: 应用配置更改并重启 HAProxy: ```sh sudo systemctl restart haproxy ``` **步骤 2:验证 HAProxy 配置** 确保 HAProxy 正确配置并能够处理 TCP 流量和 Proxy Protocol。检查 HAProxy 状态和日志: ```sh sudo systemctl status haproxy tail -f /var/log/haproxy.log ``` # 配置 Nginx Ingress Controller 1. **部署 Nginx Ingress Controller**: 将 Nginx Ingress Controller 的 Service 类型设置为 `NodePort`。 ```sh 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 ``` 2. **配置防火墙**: 在每个节点的防火墙中开放 30080 和 30443 端口。 确保 Nginx Ingress Controller 支持 Proxy Protocol,以正确处理客户端的真实 IP 地址。 3. **检查 Nginx Ingress Controller 配置**: ```sh kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml > nginx-configmap.yaml ``` 4. **确认配置**: 确保 ConfigMap 中包含 `use-proxy-protocol: "true"` 配置。如果没有,需要创建或更新 ConfigMap: ```yaml apiVersion: v1 kind: ConfigMap metadata: name: nginx-configuration namespace: ingress-nginx data: use-proxy-protocol: "true" ``` 应用更新的 ConfigMap: ```sh kubectl apply -f nginx-configmap.yaml ``` 或者通过 patch 方式更新: ``` kubectl -n ingress-nginx patch configmaps ingress-nginx-controller -p '{"data": {"use-proxy-protocol": "true"}}' ``` 5. **重启 Nginx Ingress Controller**: 重新启动 Nginx Ingress Controller 以使配置更改生效: ```sh 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 地址。