在裸机环境中,可以使用 Nginx、HAProxy 等负载均衡软件,将外部流量转发到 Nginx Ingress Controller 的服务。
使用 Nginx、HAProxy 等负载均衡软件, 任选一个
步骤 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_http
和 upstream ingress_https
定义了两个不同的 upstream
组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。proxy_protocol on;
启用 Proxy Protocol 以确保客户端的真实 IP 地址能够传递给 Nginx Ingress Controller。<node1-ip>
, <node2-ip>
, <node3-ip>
替换为实际节点的 IP 地址。应用配置更改并重启 Nginx:
sudo systemctl restart nginx
步骤 2:验证 Nginx 配置
确保 Nginx 正确配置并能够处理 TCP 流量和 Proxy Protocol。检查 Nginx 状态和日志:
sudo systemctl status nginx
tail -f /var/log/nginx/access.log
步骤 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_back
和 backend https_back
定义了两个不同的 backend
组,一个处理 HTTP 流量(端口 80),另一个处理 HTTPS 流量(端口 443)。send-proxy
启用 Proxy Protocol,将客户端的真实 IP 地址传递给后端服务。<node1-ip>
, <node2-ip>
, <node3-ip>
替换为实际节点的 IP 地址。应用配置更改并重启 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 的 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
在每个节点的防火墙中开放 30080 和 30443 端口。
确保 Nginx Ingress Controller 支持 Proxy Protocol,以正确处理客户端的真实 IP 地址。
检查 Nginx Ingress Controller 配置:
kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml > nginx-configmap.yaml
确认配置:
确保 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"}}'
重新启动 Nginx Ingress Controller 以使配置更改生效:
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
配置集群外的负载均衡器(Nginx 或 HAProxy)以处理多个节点,并将流量分配到不同的 upstream
组,同时启用 Proxy Protocol,可以确保客户端的真实 IP 地址被正确传递到集群内部的 Nginx Ingress Controller。配置过程中:
upstream
组,分别处理 HTTP 和 HTTPS 流量,并启用 Proxy Protocol。backend
组,分别处理 HTTP 和 HTTPS 流量,并启用 Proxy Protocol。