Kubernetes 服务暴露技术:NodePort 与 Ingress 实践指南
DevOpsTech
引言
在 Kubernetes 生态系统中,将内部服务安全且高效地暴露给外部网络是架构设计的重要环节。NodePort 和 Ingress 作为两种核心的服务暴露机制,各自具备独特的优势和适用场景。本文将深入探讨这两种技术的工作原理、配置方法及 YAML 实现方案,帮助开发者根据实际需求选择合适的服务暴露策略。
NodePort 服务暴露机制
NodePort 工作原理
NodePort 是 Kubernetes 内置的基础服务暴露模式。该机制在每个集群节点上预留统一端口(默认范围 30000-32767),将外部流量定向至对应服务的 Pod 实例。此方案的显著优势在于实现简单,无需额外组件支持,但同时也存在端口资源有限、直接暴露节点端口等局限性。
NodePort 配置实践
假设我们需将一个内部 Web 服务通过 NodePort 方式对外提供访问能力,以下是具体实现步骤:
- 应用部署配置 首先,创建 Deployment 资源以托管应用实例。以下为示例配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: company-frontend
labels:
tier: frontend
spec:
replicas: 2
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: web-container
image: org/frontend-app:v2.3
ports:
- containerPort: 8080
resources:
limits:
memory: "128Mi"
cpu: "100m"
此 Deployment 定义了一个名为 company-frontend 的前端应用,使用 org/frontend-app:v2.3 镜像,每个 Pod 在容器内部监听 8080 端口,并设置了资源限制。
2. 服务暴露配置
接下来,创建 Service 资源以暴露上述应用。以下是 NodePort 类型的 Service 配置:
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31000
protocol: TCP
selector:
tier: frontend
此配置中:
type: NodePort明确指定服务类型为 NodePortport: 80定义集群内部访问端口targetPort: 8080指向后端 Pod 的容器端口nodePort: 31000设置节点暴露端口(在 30000-32767 范围内)selector用于关联匹配的 Pod 实例
- 服务访问方式
配置生效后,可通过任意节点的 IP 地址与指定端口访问服务。例如,若集群节点 IP 为
10.0.0.50,则可通过http://10.0.0.50:31000访问前端应用。
Ingress 高级服务暴露
Ingress 工作原理
Ingress 是 Kubernetes 提供的更高级服务暴露方案,通过统一的入口点(Ingress Controller)集中管理多个服务的访问规则。它支持基于域名、路径等复杂路由策略,并提供负载均衡、SSL 终端等企业级功能。使用 Ingress 需要部署相应的控制器组件,如 Nginx Ingress Controller 或 HAProxy Ingress Controller。
Ingress 配置实践
假设需要暴露多个微服务,并通过域名和路径进行精细化路由控制,以下是实现方案:
- 部署 Ingress Controller 以 Nginx Ingress Controller 为例,可通过 Helm 方式部署:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx-ingress ingress-nginx/ingress-nginx
部署完成后,Ingress Controller 将监听集群中的 Ingress 资源并执行相应的路由转发规则。
2. 后端服务配置
假设有两个微服务:user-service 和 product-service,分别运行在 9000 和 9001 端口。以下是它们的 Service 配置:
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-api
ports:
- protocol: TCP
port: 80
targetPort: 9000
---
apiVersion: v1
kind: Service
metadata:
name: product-service
spec:
selector:
app: product-api
ports:
- protocol: TCP
port: 80
targetPort: 9001
此处将两个服务的 Service 端口统一设置为 80,便于后续通过 Ingress 进行路由区分。 3. Ingress 路由规则配置 创建 Ingress 资源定义访问规则。以下示例配置基于域名和路径的路由规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservice-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- api.example.com
secretName: example-tls
rules:
- host: user-api.example.com
http:
paths:
- path: /users
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80
- host: product-api.example.com
http:
paths:
- path: /products
pathType: Prefix
backend:
service:
name: product-service
port:
number: 80
此配置中:
- 定义了两个域名路由规则:
user-api.example.com和product-api.example.com - 通过路径前缀区分不同服务:
/users路由到 user-service,/products路由到 product-service - 添加了 SSL 重定向注解,强制 HTTPS 访问
- 配置了 TLS 证书支持
- 服务访问方式
配置完成后,可通过域名访问对应服务。例如,若 Ingress Controller 的外部 IP 为
203.0.113.10,且已将域名解析到此 IP,则可通过以下方式访问:
- 访问
https://user-api.example.com/users将请求路由到 user-service - 访问
https://product-api.example.com/products将请求路由到 product-service
NodePort 与 Ingress 对比分析
| 特性维度 | NodePort | Ingress |
|---|---|---|
| 配置复杂度 | 低,仅需 Service 资源 | 高,需部署 Controller 并配置 Ingress 资源 |
| 端口资源 | 受限(30000-32767) | 无限制,通过域名路由 |
| 路由能力 | 基础,仅支持端口转发 | 高级,支持域名、路径、权重等复杂规则 |
| 扩展功能 | 有限 | 丰富,支持 SSL、限流、重定向等 |
| 适用场景 | 简单应用开发测试 | 生产环境多服务、复杂路由需求 |