Nginx- Kubernetes 中 Nginx Ingress 的基础配置与使用

👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕Nginx这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!
文章目录
- Nginx-Kubernetes 中 Nginx Ingress 的基础配置与使用 🌐✨
-
- 一、为什么不是 NodePort 或 LoadBalancer?🤔
- 二、Nginx Ingress Controller 架构全景图 🗺️
- 三、部署 Nginx Ingress Controller:Helm vs Manifest(推荐 Helm)🚀
- 四、Java Spring Boot 应用实战:从打包到 Ingress 暴露 🐳➡️🌐
- 五、编写 Ingress 资源:Host-Based 与 Path-Based 路由详解 🧭
- 六、Java 客户端验证:真实请求链路追踪 🕵️♂️
- 七、进阶配置:生产就绪必备能力 🛡️
- 八、故障排查黄金 Checklist 🚨
- 九、性能调优与监控指标 📈
- 十、结语:Ingress 是云原生流量的“操作系统内核” 💫
Nginx-Kubernetes 中 Nginx Ingress 的基础配置与使用 🌐✨
在现代云原生架构中,Kubernetes 已成为容器编排的事实标准,而服务暴露(Service Exposure)则是连接集群内外流量的关键枢纽。当你的 Java 微服务部署在 Kubernetes 集群中后,如何安全、高效、可观测地将 UserService、OrderService 或 PaymentAPI 暴露给外部用户?答案往往指向——Ingress 资源 + Nginx Ingress Controller 🚪➡️⚡。
本文将系统性地带你从零构建 Nginx Ingress 的完整知识链:
✅ 理解 Ingress 与 Service、Endpoint 的分层关系
✅ 部署官方 Nginx Ingress Controller(Helm 与 Manifest 双路径)
✅ 编写语义清晰的 Ingress 资源定义(含 path-based / host-based 路由)
✅ 集成 TLS/SSL(Let’s Encrypt 自动签发 + Secret 引用)
✅ 为 Java Spring Boot 应用配置健康检查、重写规则与限流策略
✅ 结合 Java 客户端代码演示真实请求链路(含 HTTP Header 透传验证)
✅ 使用 Mermaid 可视化流量路径与控制器内部处理流程
✅ 探索生产级增强:自定义错误页、JWT 认证前置、跨域(CORS)精细控制
全文无抽象理论堆砌,所有 YAML、Java 代码、CLI 命令均可直接复用;所有链接均为权威可访问外站(如 Kubernetes 官方文档、Let’s Encrypt 主站、Spring 官网等),无需翻墙或过期校验 🔓。
一、为什么不是 NodePort 或 LoadBalancer?🤔
在深入 Ingress 前,先明确它解决的核心痛点:
| 方式 | 端口占用 | 外网 IP 数量 | 域名/路径路由 | TLS 终止 | 可观测性 | 运维复杂度 |
|---|---|---|---|---|---|---|
NodePort |
❌ 每 Service 占用一个 30000–32767 端口 | ✅ 共享节点 IP | ❌ 仅支持端口映射 | ❌ 需应用层处理 | ❌ 日志分散于各 Pod | ⚠️ 中(需手动维护端口冲突) |
LoadBalancer |
✅ 不占固定端口 | ❌ 每 Service 一个公网 IP(云厂商计费!) | ❌ 无法按 host 或 /api/v1/users 区分 |
❌ 通常需额外 LB 配置 | ⚠️ 依赖云平台控制台 | ⚠️ 高(IP 成本 & 配置耦合) |
Ingress + Nginx Controller |
✅ 单入口(80/443)复用 | ✅ 单个 IP 承载数百服务 | ✅ 原生支持 host / path / regex |
✅ 内置 TLS 终止与 SNI | ✅ 统一日志、Prometheus metrics、OpenTracing | ✅ 低(声明式 YAML 管理) |
💡 关键洞察:Ingress 不是 Kubernetes 内置组件,而是一个资源类型(Custom Resource Definition, CRD),其行为完全由对应的 Ingress Controller 实现决定。就像“USB 接口规范”需要“主板上的 USB 控制器芯片”来执行一样 ——
Ingress是 API 对象,Nginx Ingress Controller是真正监听该对象、动态生成 nginx.conf 并 reload 的守护进程 🧩。
官方 Nginx Ingress Controller 项目主页:https://kubernetes.github.io/ingress-nginx/
(这是你后续所有配置的权威参考源,非 GitHub 仓库链接,而是托管在 GitHub Pages 的正式文档站点)
二、Nginx Ingress Controller 架构全景图 🗺️
让我们用 Mermaid 清晰呈现其核心组件交互逻辑:
📌 图中要点解析:
- 蓝色
Ingress资源 是声明式配置中心,定义「谁(host)」、「走哪条路(path)」、「去哪(backend service)」; - 绿色
Nginx Ingress ControllerPod 是真正的流量网关,它持续监听 API Server 的Ingress变更事件,实时渲染 nginx 配置并热重载(zero-downtime reload); - 橙色/紫色
Service是 Kubernetes 内部服务发现抽象,Controller 通过EndpointSlice(替代旧版 Endpoints)获取真实 Pod IP 列表,实现负载均衡; - 灰色 ConfigMap 与 Secret 提供全局配置与证书,Controller 启动时加载,变更后自动生效(部分配置需重启,详见后文);
- 所有通信均在集群内网完成,外部流量只接触 Controller Pod —— 符合最小暴露面原则 🔒。
三、部署 Nginx Ingress Controller:Helm vs Manifest(推荐 Helm)🚀
✅ 方式一:Helm 3 部署(生产首选)
Helm 提供版本化、可复用、可参数化的部署能力,避免手动拼接 YAML 的脆弱性。
步骤 1:添加 Helm 仓库并更新
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
✅ 该仓库地址 https://kubernetes.github.io/ingress-nginx 是 Helm Chart 的官方发布源,稳定可靠。
步骤 2:创建 values.yaml 自定义配置(关键!)
# values.yaml
controller:
# 【必选】指定运行命名空间
namespace: ingress-nginx
# 【必选】启用 DaemonSet 模式(每节点一个 Pod),比 Deployment 更适合网关
kind: DaemonSet
# 【必选】绑定宿主机 80/443 端口(NodePort 不适用网关场景)
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
# 【推荐】启用 Prometheus metrics(默认开启)
metrics:
enabled: true
service:
port: 10254
# 【安全】禁用不安全的 default-backend(防止未匹配 Ingress 的请求暴露内部信息)
defaultBackend:
enabled: false
# 【高可用】设置 Pod 亲和性,避免单点故障
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- ingress-nginx
topologyKey: topology.kubernetes.io/zone
# 【日志】提升日志级别便于排障
config:
log-level: "2"
enable-real-ip: "true" # 信任 X-Real-IP/X-Forwarded-For
use-forwarded-headers: "true"
# 【TLS】全局默认 SSL 证书(用于没有显式指定 secret 的 Ingress)
# defaultSSLCertificate: "ingress-nginx/tls-default"
# 【网络】允许来自任意来源的流量(云环境需配合 SecurityGroup)
service:
type: ClusterIP # DaemonSet + hostNetwork 下无需 LoadBalancer
步骤 3:一键安装(含命名空间自动创建)
kubectl create namespace ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--values values.yaml \
--version 4.10.1 # 指定稳定版本(查看 https://github.com/kubernetes/ingress-nginx/releases 获取最新)
✅ 验证部署状态:
kubectl -n ingress-nginx get pods -l app.kubernetes.io/name=ingress-nginx
# 输出应为 Running 状态,且 READY 为 1/1
# NAME READY STATUS RESTARTS AGE
# ingress-nginx-controller-2jz9f 1/1 Running 0 42s
⚠️ 方式二:纯 Manifest 部署(适合学习/离线环境)
若因网络策略限制无法使用 Helm,可下载官方 manifest:
# 下载最新 stable 版本(以 v1.10.1 为例)
curl -fsSL https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml \
| sed 's/namespace: ingress-nginx/namespace: ingress-nginx/g' \
| kubectl apply -f -
🔗 官方 manifest 托管地址:https://kubernetes.github.io/ingress-nginx/deploy/
(注意:该页面提供各云平台适配版本,如 AWS ALB、GCP L7、裸机 MetalLB 等,点击即跳转)
四、Java Spring Boot 应用实战:从打包到 Ingress 暴露 🐳➡️🌐
我们以一个极简但典型的 Java 微服务为例:user-service,基于 Spring Boot 3.x + Jakarta EE 9+ 构建。
✅ Step 1:编写 Spring Boot Controller(带健康检查与 Header 透传)
// src/main/java/com/example/userservice/UserController.java
package com.example.userservice;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
// ✅ 暴露健康端点(供 Ingress health check 使用)
@GetMapping("/health")
public ResponseEntity<Map<String, String>> health() {
Map<String, String> status = new HashMap<>();
status.put("status", "UP");
status.put("service", "user-service");
status.put("timestamp", String.valueOf(System.currentTimeMillis()));
return ResponseEntity.ok(status);
}
// ✅ 模拟业务接口:返回请求头中的 X-Request-ID(验证 Ingress 是否透传)
@GetMapping("/{id}")
public ResponseEntity<Map<String, Object>> getUserById(
@PathVariable String id,
@RequestHeader(value = "X-Request-ID", required = false) String requestId,
@RequestHeader(value = "X-Forwarded-For", required = false) String forwardedFor) {
Map<String, Object> result = new HashMap<>();
result.put("userId", id);
result.put("requestId", requestId != null ? requestId : "NOT_SET_BY_INGRESS");
result.put("clientIP", forwardedFor != null ? forwardedFor.split(",")[0].trim() : "UNKNOWN");
result.put("serverPod", System.getenv("HOSTNAME")); // 显示运行在哪个 Pod
return ResponseEntity.ok(result);
}
}
✅ Step 2:配置 application.yml(启用 Actuator + 自定义端口)
# src/main/resources/application.yml
spring:
application:
name: user-service
server:
port: 8080 # Spring Boot 内部监听端口
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
endpoint:
health:
show-details: always
# ✅ 关键:让 Actuator health 端点暴露在 /actuator/health,但 Ingress 将其映射到 /health
# 我们将在 Ingress 中配置 rewrite-target,使外部访问 /health 即命中 /actuator/health
✅ Step 3:Dockerfile 构建镜像(多阶段构建,轻量安全)
# Dockerfile
FROM eclipse/jetty:11-jre17-slim
# 创建非 root 用户提升安全性
RUN groupadd -g 1001 -f appgroup && useradd -s /bin/bash -u 1001 -g appgroup appuser
USER appuser
# 复制 Spring Boot fat jar
ARG JAR_FILE=target/user-service-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
✅ Step 4:Kubernetes Deployment + Service YAML
# k8s/user-service-deploy-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
labels:
app: user-service
spec:
replicas: 2
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: your-registry.example.com/user-service:1.0.0 # 替换为你的真实镜像地址
ports:
- containerPort: 8080
name: http
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: user-service
labels:
app: user-service
spec:
selector:
app: user-service
ports:
- name: http
port: 80
targetPort: 8080
type: ClusterIP # 内部服务,不暴露外网
✅ 应用部署命令:
kubectl apply -f k8s/user-service-deploy-svc.yaml
五、编写 Ingress 资源:Host-Based 与 Path-Based 路由详解 🧭
✅ 场景 1:基于域名的路由(Production Standard)
假设你拥有域名 api.yourcompany.com,希望:
users.api.yourcompany.com→user-serviceorders.api.yourcompany.com→order-service
# k8s/ingress-host-based.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: user-service-ingress
annotations:
# ✅ 启用重写:移除匹配的 host 前缀(如 /api/v1 → /)
nginx.ingress.kubernetes.io/rewrite-target: /$2
# ✅ 健康检查:指向 Spring Boot Actuator 端点
nginx.ingress.kubernetes.io/health-check-path: /actuator/health/readiness
nginx.ingress.kubernetes.io/health-check-interval: "10"
nginx.ingress.kubernetes.io/health-check-port: "8080"
# ✅ 启用 CORS(允许任意前端域名,生产请替换为具体 origin)
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
# ✅ 设置超时(避免长连接阻塞)
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
# ✅ 启用客户端真实 IP 获取(需 Controller 配置 enable-real-ip: true)
nginx.ingress.kubernetes.io/use-forwarded-headers: "true"
spec:
ingressClassName: nginx # 指向已部署的 IngressClass
tls:
- hosts:
- users.api.yourcompany.com
secretName: users-tls-secret # 将在下一步创建
rules:
- host: users.api.yourcompany.com
http:
paths:
- path: /api/v1/users(/|$)(.*)
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80
🌐 域名解析提示:将
users.api.yourcompany.com的 DNS A 记录指向你集群任一节点的公网 IP(若使用云厂商,建议配置 SLB 指向所有节点)。
Spring 官方关于 CORS 的最佳实践指南:https://spring.io/guides/gs/rest-service-cors/
✅ 场景 2:基于路径的路由(单域名多服务)
若暂无多个子域名,可统一使用 api.yourcompany.com,按路径分流:
# k8s/ingress-path-based.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-gateway-ingress
annotations:
# ✅ 路径重写:/users/xxx → /xxx(去除 /users 前缀)
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
rules:
- host: api.yourcompany.com
http:
paths:
- path: /users(/|$)(.*)
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80
- path: /orders(/|$)(.*)
pathType: Prefix
backend:
service:
name: order-service
port:
number: 80
✅ 场景 3:TLS 自动化 —— Let’s Encrypt + cert-manager(强烈推荐)🔐
手动管理证书痛苦且易过期。cert-manager 是 Kubernetes 原生证书管理工具,与 Let’s Encrypt 无缝集成。
步骤 1:安装 cert-manager(Helm)
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.13.1 \
--set installCRDs=true
🔗 cert-manager 官方文档:https://cert-manager.io/docs/
(权威、全面、实时更新,涵盖所有 Issuer 类型与故障排查)
步骤 2:创建 ClusterIssuer(生产环境用 Let’s Encrypt)
# k8s/letsencrypt-prod-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@yourcompany.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
步骤 3:在 Ingress 中引用自动签发
# 在原有 ingress-host-based.yaml 中追加:
metadata:
annotations:
# ✅ 触发自动证书申请
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- users.api.yourcompany.com
secretName: users-tls-secret # cert-manager 将自动创建此 Secret
✅ 部署后,cert-manager 会自动完成 ACME 挑战(HTTP-01),约 1–2 分钟内生成有效 TLS 证书,并注入到 users-tls-secret 中,Nginx Controller 实时加载。
六、Java 客户端验证:真实请求链路追踪 🕵️♂️
编写一个 Java 测试类,模拟前端调用,验证 Ingress 功能完整性:
// src/test/java/com/example/userservice/IngressIntegrationTest.java
package com.example.userservice;
import okhttp3.*;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class IngressIntegrationTest {
private static final String INGRESS_URL = "https://users.api.yourcompany.com";
private final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
@Test
void shouldAccessUserViaIngressAndSeeHeaders() throws Exception {
// ✅ 构造带 X-Request-ID 的请求,验证是否透传到后端
Request request = new Request.Builder()
.url(INGRESS_URL + "/api/v1/users/123")
.header("X-Request-ID", "req-abc-789-def")
.header("User-Agent", "Ingress-Test-Client/1.0")
.get()
.build();
try (Response response = client.newCall(request).execute()) {
assert response.isSuccessful();
String body = response.body().string();
System.out.println("✅ Response from Ingress: " + body);
// ✅ 断言后端正确返回了透传的 Header
assert body.contains("\"requestId\":\"req-abc-789-def\"");
assert body.contains("\"clientIP\":\""); // 至少包含 IP 字段
assert body.contains("\"serverPod\":\"user-service-"); // 验证负载均衡
}
}
@Test
void shouldGetHealthCheckViaIngress() throws Exception {
Request request = new Request.Builder()
.url(INGRESS_URL + "/health") // 注意:Ingress 重写了路径!
.get()
.build();
try (Response response = client.newCall(request).execute()) {
assert response.isSuccessful();
String body = response.body().string();
assert body.contains("\"status\":\"UP\"");
assert body.contains("\"service\":\"user-service\"");
}
}
}
📌 关键验证点:
X-Request-ID是否原样出现在响应 JSON 中?✅ 验证nginx.ingress.kubernetes.io/enable-cors和 header 透传配置;/health能否成功访问?✅ 验证rewrite-target和health-check-path生效;clientIP是否为真实客户端 IP?✅ 验证enable-real-ip: true+use-forwarded-headers: true组合效果;- 若使用 TLS,
curl -v https://...应显示SSL certificate verify ok✅。
七、进阶配置:生产就绪必备能力 🛡️
✅ 1. 自定义错误页面(404 / 503)
默认 Nginx 返回简陋文本页。可挂载自定义 HTML:
# k8s/custom-error-pages.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-errors
namespace: ingress-nginx
data:
http-404.html: |
<!DOCTYPE html>
<html><head><title>404 - Service Not Found</title></head>
<body style="font-family: sans-serif; text-align: center; margin-top: 50px;">
<h1>⚠️ 404 Not Found</h1>
<p>The requested resource does not exist.</p>
<p>Check your URL or contact support at <a href="mailto:support@yourcompany.com">support@yourcompany.com</a></p>
<hr>
<small>Ingress Controller: nginx-ingress v1.10.1</small>
</body></html>
---
apiVersion: apps/v1
kind: Deployment
# ... 在 controller 的 deployment 中添加 volumeMounts:
# volumeMounts:
# - name: custom-errors
# mountPath: /usr/share/nginx/html/custom-errors
# volumes:
# - name: custom-errors
# configMap:
# name: custom-errors
然后在 values.yaml 中配置:
controller:
config:
custom-http-errors: "404,503"
http-404: "/custom-errors/http-404.html"
http-503: "/custom-errors/http-503.html"
✅ 2. 请求限流(Rate Limiting)
防刷、保稳定。Nginx Ingress 原生支持 limit-rps:
# annotations in Ingress
nginx.ingress.kubernetes.io/limit-rps: "10" # 每秒最多 10 个请求
nginx.ingress.kubernetes.io/limit-rpm: "600" # 每分钟最多 600 个(二者选一)
nginx.ingress.kubernetes.io/limit-connections: "100" # 单 IP 最大并发连接数
nginx.ingress.kubernetes.io/limit-whitelist: "$remote_addr" # 白名单(如运维 IP)
📘 限流原理:基于
$binary_remote_addr(IP 哈希)在共享内存区计数,毫秒级精度。详情见官方限流文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting
✅ 3. JWT 认证前置(无需修改 Java 代码)
利用 auth-url annotation 将鉴权下沉到 Ingress 层:
# k8s/jwt-auth-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jwt-secured-users
annotations:
# ✅ 指向独立的 JWT 验证服务(如 oauth2-proxy 或自研 auth-service)
nginx.ingress.kubernetes.io/auth-url: "https://auth.yourcompany.com/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://auth.yourcompany.com/oauth2/start?rd=$escaped_request_uri"
nginx.ingress.kubernetes.io/auth-response-headers: "X-Auth-Request-User, X-Auth-Request-Email"
spec:
# ... rules
后端 Java 服务即可通过 X-Auth-Request-User Header 直接获取认证用户,彻底解耦鉴权逻辑。
✅ 4. OpenTracing / Jaeger 集成(全链路追踪)
在 values.yaml 中启用:
controller:
config:
enable-opentracing: "true"
jaeger-collector-host: "jaeger-collector.default.svc.cluster.local"
jaeger-collector-port: "14268"
jaeger-service-name: "nginx-ingress"
Spring Boot 应用只需引入 spring-cloud-starter-sleuth 和 spring-cloud-starter-zipkin,即可实现从 Ingress → Service → DB 的完整 Trace ID 透传 🌈。
八、故障排查黄金 Checklist 🚨
遇到 Ingress 不工作?按此顺序快速定位:
| 现象 | 检查项 | 命令示例 |
|---|---|---|
| Ingress 无响应(Connection refused) | Controller Pod 是否 Running?NodePort/HostNetwork 是否生效? | kubectl -n ingress-nginx get podskubectl -n ingress-nginx get svc |
| 503 Service Temporarily Unavailable | Service 名称/端口是否匹配?Endpoints 是否存在? | kubectl get endpoints user-servicekubectl get svc user-service -o wide |
| 404 Not Found(路径错) | pathType 是否为 Prefix?rewrite-target 正则是否正确? |
kubectl -n ingress-nginx exec -it <pod> -- cat /etc/nginx/nginx.conf | grep -A5 "location" |
| HTTPS 证书错误 | Secret 是否存在?CN 是否匹配 Ingress host? | kubectl get secret users-tls-secret -o yamlopenssl x509 -in <(kubectl get secret users-tls-secret -o jsonpath='{.data.tls\.crt}') -text -noout | grep "Subject:" |
| Header 未透传 | Controller enable-real-ip 和 use-forwarded-headers 是否开启? |
kubectl -n ingress-nginx get cm ingress-nginx-controller -o yaml | grep -E "(real-ip|forwarded)" |
| 健康检查失败 | Spring Boot Actuator 端点路径是否正确?Probe 配置是否匹配? | curl -v http://<node-ip>:<node-port>/actuator/health/readiness |
💡 终极调试命令:进入 Controller Pod 查看实时 nginx 配置与日志
kubectl -n ingress-nginx exec -it <pod-name> -- cat /etc/nginx/nginx.conf kubectl -n ingress-nginx logs -f <pod-name> --tail=50
九、性能调优与监控指标 📈
Nginx Ingress Controller 提供丰富 Prometheus metrics,开箱即用:
| 指标名 | 含义 | 查询示例 |
|---|---|---|
nginx_ingress_controller_requests_total |
总请求数(按 code、host、path 分组) | sum(rate(nginx_ingress_controller_requests_total{ingress=~"user-service.*"}[5m])) by (code) |
nginx_ingress_controller_bytes_sent_total |
发送字节数 | topk(5, sum(rate(nginx_ingress_controller_bytes_sent_total[5m])) by (ingress)) |
nginx_ingress_controller_ssl_expire_time_seconds |
TLS 证书剩余有效期(秒) | nginx_ingress_controller_ssl_expire_time_seconds < 604800(告警:7天内过期) |
✅ Grafana Dashboard 推荐:官方维护的 Ingress NGINX Dashboard(ID: 9614),导入即用,可视化所有关键指标。
🔗 Kubernetes 官方监控最佳实践:https://kubernetes.io/docs/tasks/debug/debug-application/resource-metrics-pipeline/
(涵盖 Metrics Server、Prometheus、cAdvisor 集成全链路)
十、结语:Ingress 是云原生流量的“操作系统内核” 💫
回顾全文,我们完成了:
🔹 概念正本清源:Ingress 是资源,Controller 是引擎,二者缺一不可;
🔹 部署稳如磐石:Helm 参数化安装,DaemonSet + hostNetwork 保障高可用;
🔹 Java 服务贯通:从 Spring Boot Actuator 健康检查,到 Header 透传验证;
🔹 路由灵活强大:Host/Path 双模式、TLS 自动化、重写与 CORS 精细控制;
🔹 生产就绪加固:限流、JWT、错误页、OpenTracing 全覆盖;
🔹 可观测闭环:Metrics + Logs + Traces,问题 5 分钟定位。
Nginx Ingress 不仅是“反向代理”,更是 Kubernetes 集群的流量操作系统内核——它抽象了网络复杂性,让开发者专注业务逻辑,让 SRE 拥有统一治理平面。
正如 Kubernetes 官方文档所强调:
“Ingress is a collection of rules that allow inbound connections to reach the cluster services.”
— https://kubernetes.io/docs/concepts/services-networking/ingress/
愿你在云原生征途上,以 Ingress 为舟,以代码为桨,驶向高可用、可观测、可演进的未来 🌊🚀。
本文所有链接均已人工验证可访问,内容基于 Nginx Ingress Controller v1.10.x 与 Kubernetes v1.27+ 生态撰写,遵循云原生设计哲学,拒绝黑盒魔法,拥抱声明式真理。
🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨
更多推荐
所有评论(0)