在这里插入图片描述


一、背景与目标

在高可用的 Kubernetes 集群架构中,kube-apiserver 通常部署在多个控制平面节点上。
为保证外部客户端(如 kubectl 或控制平面组件)能通过统一入口访问,需要配置一个 四层(TCP)负载均衡器 来转发 6443 端口的请求。

本文将演示如何使用 Podman + Nginx stream 模块 来构建轻量、高可用的 API Server 负载均衡层,并实现配置、日志持久化与 systemd 自启动。


二、架构设计

💡 网络拓扑

                 ┌────────────────────────┐
                 │   Nginx LB (Podman)    │
                 │  IP: 192.168.118.100   │
                 │  Port: 26443 -> 6443   │
                 └────────────┬───────────┘
                              │
       ┌──────────────────────┼──────────────────────┐
       │                      │                      │
┌────────────┐        ┌────────────┐        ┌────────────┐
│ Master 1   │        │ Master 2   │        │ Master 3   │
│ 192.168.118.43:6443 │ 192.168.118.44:6443 │ 192.168.118.45:6443 │
└────────────┘        └────────────┘        └────────────┘

三、准备环境目录

sudo mkdir -p /opt/nginx/{conf,logs}
sudo chown -R $(whoami):$(whoami) /opt/nginx

四、编写 Nginx 四层代理配置

创建配置文件:

cat << 'EOF' > /opt/nginx/conf/k8s-lb.conf
stream {
    # Kubernetes API Server 集群上游定义
    upstream k8s_apiserver {
        least_conn;
        server 192.168.118.43:6443 max_fails=3 fail_timeout=30s;
        server 192.168.118.44:6443 max_fails=3 fail_timeout=30s;
        server 192.168.118.45:6443 max_fails=3 fail_timeout=30s;
    }

    # 对外暴露的负载均衡入口端口
    server {
        listen 26443;
        proxy_connect_timeout 5s;
        proxy_timeout 30s;
        proxy_pass k8s_apiserver;
    }
}
EOF

配置要点说明:

  • stream:启用四层 TCP 代理模块;
  • least_conn:最少连接策略,保证请求分配均衡;
  • max_fails / fail_timeout:健康容错机制;
  • proxy_*:防止连接超时;
  • listen 26443:外部访问入口端口,可自定义。

五、运行 Nginx 容器(Podman 方式)

运行命令如下:

podman run -d \
  --name k8s-lb \
  -p 26443:26443 \
  -v /opt/nginx/conf:/etc/nginx/conf.d:Z \
  -v /opt/nginx/logs:/var/log/nginx:Z \
  nginx:latest

:Z 表示自动调整 SELinux 上下文,避免容器访问受限。

查看运行状态:

podman ps

输出应类似:

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                   NAMES
9f2e61d4c4e1  docker.io/library/nginx:latest  nginx -g daemon off;  5 seconds ago  Up 5 seconds  0.0.0.0:26443->26443/tcp  k8s-lb

六、验证负载均衡效果

可以从任意节点或客户端执行:

curl -k https://<LB_IP>:26443/version

如果返回类似:

{
  "major": "1",
  "minor": "31",
  "gitVersion": "v1.31.6",
  ...
}

表示负载均衡工作正常。


七、配置 systemd 自启动

Podman 支持将容器直接生成为 systemd 服务文件,非常方便。

1️⃣ 生成 systemd 文件

podman generate systemd --name k8s-lb --files --new

生成文件:

container-k8s-lb.service

2️⃣ 移动并启用服务

sudo mv container-k8s-lb.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now container-k8s-lb

验证:

systemctl status container-k8s-lb

输出状态应为:

Active: active (running)

重启系统后容器会自动随 systemd 启动。


八、日志与维护

查看日志

podman logs -f k8s-lb

或宿主机持久目录:

tail -f /opt/nginx/logs/access.log

更新配置

修改 /opt/nginx/conf/k8s-lb.conf 后,重载配置:

podman exec k8s-lb nginx -s reload

九、负载均衡优化建议

项目建议
高可用性部署两台负载均衡节点,使用 Keepalived 提供虚拟 IP
健康检查若使用商业版 Nginx,可启用 health_check 功能
连接策略least_connround_robin 视访问模式选择
安全性将负载均衡层访问限制为内网,必要时启用防火墙策略

十、结语

通过 Podman 部署 Nginx 四层负载均衡器,不仅轻量、安全、无 daemon,还能与 systemd 深度集成,非常适合在企业内网或离线环境中为 Kubernetes 提供 API 高可用访问入口。

总结特性:

  • ✅ 完全无 root 守护进程
  • ✅ 快速启动、低资源占用
  • ✅ 支持 SELinux、systemd
  • ✅ 一致的运行行为(兼容 Docker CLI)

📚 参考文档

更多推荐