使用 NGINX 作为 Kubernetes 集群和后端服务的统一入口配置实践
当需要将 NGINX 配置为 Kubernetes 集群及其他独立后端服务的统一入口时,通常涉及在 NGINX 中定义上游服务器组并配置多个虚拟主机(server block)进行请求转发。以下是详细的配置说明及示例。
核心 NGINX 配置引入
首先,确保您的主 NGINX 配置文件 (通常是 /etc/nginx/nginx.conf) 包含了外部配置目录。这样可以方便地管理不同的服务配置,将其拆分为单独的文件。
# /etc/nginx/nginx.conf 示例
http {
include mime.types;
# 引入 /etc/nginx/conf.d/ 目录下的所有 .conf 文件
include /etc/nginx/conf.d/*.conf;
# 其他 HTTP 模块配置...
}
定义 Kubernetes 集群上游服务器组
为了让 NGINX 能够将请求直接转发到 Kubernetes 集群的任意一个节点(通常是通过 NodePort 暴露的服务),我们需要定义一个上游服务器组,其中包含集群中所有工作节点(Node)和主节点(Master)的 IP 地址。NGINX 将在这个组内进行负载均衡。
在 /etc/nginx/conf.d/ 目录下创建一个新的配置文件,例如 k8s_backend.conf,并添加如下内容:
# /etc/nginx/conf.d/k8s_backend.conf
upstream kubernetes_cluster_nodes {
# 假设 Kubernetes 集群节点 IP 地址及端口 (例如 NodePort 或 Kube-proxy 监听的端口)
server 192.168.10.11:80; # K8s 工作节点 1
server 192.168.10.12:80; # K8s 工作节点 2
server 192.168.10.13:80; # K8s 工作节点 3
server 192.168.10.14:80; # K8s 工作节点 4
server 192.168.10.15:80; # K8s 工作节点 5
server 192.168.10.16:80; # K8s 工作节点 6
server 192.168.10.17:80; # K8s 工作节点 7
server 192.168.10.18:80; # K8s 工作节点 8
server 192.168.10.19:80; # K8s 工作节点 9
server 192.168.10.21:80; # K8s 控制平面节点 1 (Master)
server 192.168.10.22:80; # K8s 控制平面节点 2 (Master)
server 192.168.10.23:80; # K8s 控制平面节点 3 (Master)
# 根据实际集群规模,可添加更多节点
}
配置虚拟主机与反向代理规则
接下来,在 /etc/nginx/conf.d/ 目录下创建另一个配置文件,例如 application_proxy.conf,用于定义具体的虚拟主机(server)配置。此示例展示了如何为不同的域名或 IP 地址配置独立的代理规则,包括健康检查、到特定应用的代理以及到 Kubernetes 集群的代理。
示例一:通用应用网关配置
这个 server 块处理指向 app.example.com 或特定 IP 的请求,并将其路由到不同的后端服务或 Kubernetes 集群。
# /etc/nginx/conf.d/application_proxy.conf
server {
listen 80;
server_name app.example.com 192.168.10.5; # 替换为您的实际域名或 NGINX 监听 IP
index index.html index.htm; # 定义默认索引文件
# NGINX 健康检查端点
location /health-check {
access_log off; # 不记录健康检查日志
add_header Content-Type 'text/plain;charset=utf-8';
return 200 'NGINX Gateway is OK'; # 返回 200 OK
}
# 代理到 Kibana 界面
location /kibana-dashboard/ {
proxy_pass http://192.168.10.30:5601/; # Kibana 服务实际地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/kibana-dashboard/(.*)$ /$1 break; # 重写 URL 路径,移除前缀
}
# 代理到 Nacos 配置中心
location /config-nacos {
proxy_pass http://192.168.10.30:8848/nacos; # Nacos 服务实际地址
# 可根据 Nacos 部署的具体要求,选择性启用或调整以下头部设置
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# rewrite ^/config-nacos/(.*)$ /$1 break;
}
# 代理到消息队列管理控制台 (例如 RocketMQ Console)
location /message-console {
# 可选:启用 HTTP Basic Auth 认证保护
# auth_basic "Restricted Access to MQ Console";
# auth_basic_user_file /etc/nginx/passwd/mq_auth_users.db;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.10.30:8080/mqconsole; # MQ 控制台实际地址
}
# 代理到分布式任务调度平台 XXL-JOB 管理界面
location /scheduler-admin {
proxy_pass http://192.168.10.30:8090/xxl-job-admin; # XXL-JOB Admin 实际地址
}
# 禁用 /actuator 端点访问(安全最佳实践)
location /api/actuator {
return 404; # 直接返回 404 Not Found 错误
}
# 默认路由:将所有未匹配的请求转发到 Kubernetes 集群
# 主要用于前端应用或公共访问
location / {
proxy_redirect off;
# 设置转发给 K8s Ingress Controller 或内部服务期望的 Host 头部
proxy_set_header Host frontend-app.k8s.internal; # 替换为 K8s 内部前端服务 Host
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://kubernetes_cluster_nodes/; # 转发到 K8s 上游服务器组
}
# 后端 API 路由:将以 /api/ 开头的请求转发到 Kubernetes 集群
location /api/ {
proxy_redirect off;
client_max_body_size 64M; # 允许的最大请求体大小
# 设置转发给 K8s Ingress Controller 或内部 API 服务期望的 Host 头部
proxy_set_header Host backend-api.k8s.internal; # 替换为 K8s 内部 API 服务 Host
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://kubernetes_cluster_nodes/; # 转发到 K8s 上游服务器组
}
}
示例二:针对不同域名的多虚拟主机配置
您可以根据不同的域名(server_name)配置多个 server 块,每个块可以有其独立的代理规则和后端服务 Host 头部设置,以支持多个应用或环境。
# /etc/nginx/conf.d/another_app_proxy.conf (另一个 server 块示例)
server {
listen 80;
server_name portal.example.org; # 另一个域名
index index.html index.htm;
# NGINX 健康检查端点 (与示例一类似)
location /health-check {
access_log off;
add_header Content-Type 'text/plain;charset=utf-8';
return 200 'Portal NGINX is OK!';
}
# 其他应用代理 (例如 Kibana, Nacos 等,可与上一个 server 块共享相同后端地址)
# ... (此处省略与示例一重复的代理配置,例如 /kibana-dashboard/, /config-nacos/, /message-console/, /scheduler-admin/, /api/actuator)
# 默认路由,但使用不同的内部 Host 头部指向 K8s 集群
location / {
proxy_redirect off;
proxy_set_header Host portal-frontend.k8s.internal; # 针对此域名设置 K8s 内部前端 Host
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://kubernetes_cluster_nodes/;
}
# 后端 API 路由,使用不同的内部 Host 头部指向 K8s 集群
location /api/ {
proxy_redirect off;
client_max_body_size 64M;
proxy_set_header Host portal-api.k8s.internal; # 针对此域名设置 K8s 内部 API Host
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://kubernetes_cluster_nodes/;
}
}