让应用对外提供服务
Pod IP 会随重建变化,因此不能直接作为服务地址。Service 通过标签选择一组健康 Pod,并提供稳定虚拟 IP 和 DNS 名称;Ingress 或 Gateway 再负责把集群外流量路由到 Service。
本篇目标:能写出生产可用的 Service 和 Ingress(含 TLS),理解各层排障顺序,知道 Gateway API 的定位。

1. 从容器端口到用户请求
用户 / 外部系统
|
Ingress / Gateway / LoadBalancer
|
Service(稳定 DNS 与后端选择器)
|
Ready Pod(动态 IP,来自 Deployment 等工作负载)
每一层都应独立排查。应用监听端口正常,不代表 Service selector 正确;Service 有后端,也不代表 Ingress Controller 已安装或 DNS 已解析。
2. ClusterIP Service
ClusterIP 是默认类型,只供集群内部访问:
apiVersion: v1
kind: Service
metadata:
name: api
namespace: learning
spec:
type: ClusterIP
selector:
app.kubernetes.io/name: api
ports:
- name: http
port: 80
targetPort: 8080
同 Namespace 内可访问 http://api;跨 Namespace 使用 http://api.learning.svc.cluster.local。targetPort 指向容器实际监听端口,port 是 Service 对外暴露的稳定端口。
kubectl get service,endpointslice -n learning
kubectl describe service api -n learning
若 EndpointSlice 没有地址,优先检查 Service selector、Pod labels 和 Pod readiness。
3. 对外暴露的常见方式
需要哪种访问?
├── 集群内部服务 → ClusterIP(默认首选)
├── 临时调试、内部测试 → NodePort 或 port-forward
├── 云环境四层入口(TCP/UDP)→ LoadBalancer
├── HTTP/HTTPS 域名和路径路由 → Ingress(需要 Ingress Controller)
└── 更精细的网关控制(按团队/应用隔离)→ Gateway API
| 类型 | 适用场景 | 注意事项 |
|---|---|---|
ClusterIP | 集群内部服务 | 默认首选,不直接暴露公网 |
NodePort | 临时调试、简单内网环境 | 开放每个节点端口,生产需谨慎 |
LoadBalancer | 云环境的四层入口 | 依赖云控制器,关注公网暴露和成本 |
ExternalName | 把外部域名映射为集群内部 Service | 仅 DNS 别名,不代理流量 |
| Ingress | 多个 HTTP/HTTPS 域名和路径路由 | 必须已部署 Ingress Controller |
| Gateway API | 更明确的网关、路由和权限模型 | 需确认控制器实现支持的 API 版本 |
4. Ingress:HTTP/HTTPS 入口
Ingress 只是规则对象,不会自行转发流量。集群必须有 NGINX、Traefik、云负载均衡等 Ingress Controller;Gateway API 同样需要对应 Gateway Controller。
4.1 HTTP Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api
namespace: learning
spec:
ingressClassName: nginx
rules:
- host: api.example.test
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
name: http
4.2 带 TLS 的 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-tls
namespace: learning
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
secretName: api-tls-cert # Secret 类型必须是 kubernetes.io/tls
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api
port:
name: http
TLS Secret 创建方式:
kubectl create secret tls api-tls-cert \
--cert=path/to/tls.crt \
--key=path/to/tls.key \
-n learning
HTTPS 链路还应有证书到期告警和自动续期(如 cert-manager)。
5. Gateway API(新一代入口标准)
Gateway API 是 Ingress 的继任者,提供更明确的角色分工和更强的表达能力。它定义了三个核心资源:
| 资源 | 职责 | 谁来管理 |
|---|---|---|
GatewayClass | 定义网关实现类型(如 nginx、istio) | 平台团队 |
Gateway | 一个具体的网关实例(监听端口、TLS) | 平台团队 |
HTTPRoute | 路由规则(域名、路径、后端) | 应用团队 |
# 平台团队定义 Gateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: platform-gateway
namespace: learning
spec:
gatewayClassName: nginx
listeners:
- name: http
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
---
# 应用团队定义 HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-route
namespace: learning
spec:
parentRefs:
- name: platform-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api
port: 80
Gateway API 将路由规则与网关基础设施解耦,平台团队负责网关实例,应用团队管理自己的路由规则。使用前务必确认集群中已部署支持 Gateway API 的 Controller。
6. 排障顺序
- Pod 是否
Ready,应用是否监听targetPort; - Service selector 是否选中目标 Pod,EndpointSlice 是否有地址;
- 集群内 DNS 是否能解析 Service 名(
nslookup api.learning); - Ingress / Gateway 规则、Class 和 Controller 日志是否正确;
- 最后检查外部 DNS、证书、安全组、防火墙和负载均衡配置。
# 一命令测试集群内 HTTP 连通性
kubectl run tmp --image=busybox:1.36 --rm -it --restart=Never -- \
wget -q -O- http://api.learning:80/healthz
7. 练习
练习 A
- 为之前创建的 Deployment 创建一个 ClusterIP Service,用
kubectl run tmp --image=busybox从集群内部访问它 - 修改 Service selector 使它不匹配 Pod,观察 EndpointSlice 变为空
- 修复 selector,确认 EndpointSlice 恢复
练习 B
- 用
openssl生成自签名证书,创建 TLS Secret - 在 kind 集群中安装 NGINX Ingress Controller(如
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml) - 创建带 TLS 的 Ingress,用
curl -k https://api.example.com从宿主机验证
验收清单
- 知道 Pod IP 不能作为稳定服务地址
- 会检查 Service selector 与 EndpointSlice
- 能区分 ClusterIP、NodePort、LoadBalancer、Ingress、Gateway API 的适用场景
- 能写出带 TLS 的 Ingress 规则
- 知道 Ingress 和 Gateway API 都需要对应 Controller 执行
- 掌握从 Pod → Service → Ingress → 外部 DNS 的分层排障顺序
下一篇:管理配置、密钥与数据。