使用 Podman 部署基于 Nginx 的 Kubernetes 四层负载均衡器(含 systemd 自启动)
·

文章目录
一、背景与目标
在高可用的 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_conn 或 round_robin 视访问模式选择 |
| 安全性 | 将负载均衡层访问限制为内网,必要时启用防火墙策略 |
十、结语
通过 Podman 部署 Nginx 四层负载均衡器,不仅轻量、安全、无 daemon,还能与 systemd 深度集成,非常适合在企业内网或离线环境中为 Kubernetes 提供 API 高可用访问入口。
总结特性:
- ✅ 完全无 root 守护进程
- ✅ 快速启动、低资源占用
- ✅ 支持 SELinux、systemd
- ✅ 一致的运行行为(兼容 Docker CLI)
📚 参考文档
- Nginx Stream 模块官方文档
- Podman 官方文档
- Red Hat Systemd + Podman 集成指南
更多推荐
所有评论(0)