当前位置:首页 > 技术 > 正文内容

使用 NGINX 作为 Kubernetes 集群和后端服务的统一入口配置实践

访客 技术 2026年7月1日 1

当需要将 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/;
    }
}
    

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。