跳到主要内容

让应用对外提供服务

Pod IP 会随重建变化,因此不能直接作为服务地址。Service 通过标签选择一组健康 Pod,并提供稳定虚拟 IP 和 DNS 名称;Ingress 或 Gateway 再负责把集群外流量路由到 Service。

本篇目标:能写出生产可用的 Service 和 Ingress(含 TLS),理解各层排障顺序,知道 Gateway API 的定位。

Kubernetes 从外部流量到 Pod 的网络访问路径


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. 排障顺序​

  1. Pod 是否 Ready,应用是否监听 targetPort;
  2. Service selector 是否选中目标 Pod,EndpointSlice 是否有地址;
  3. 集群内 DNS 是否能解析 Service 名(nslookup api.learning);
  4. Ingress / Gateway 规则、Class 和 Controller 日志是否正确;
  5. 最后检查外部 DNS、证书、安全组、防火墙和负载均衡配置。
# 一命令测试集群内 HTTP 连通性
kubectl run tmp --image=busybox:1.36 --rm -it --restart=Never -- \
wget -q -O- http://api.learning:80/healthz

7. 练习​

练习 A

  1. 为之前创建的 Deployment 创建一个 ClusterIP Service,用 kubectl run tmp --image=busybox 从集群内部访问它
  2. 修改 Service selector 使它不匹配 Pod,观察 EndpointSlice 变为空
  3. 修复 selector,确认 EndpointSlice 恢复

练习 B

  1. 用 openssl 生成自签名证书,创建 TLS Secret
  2. 在 kind 集群中安装 NGINX Ingress Controller(如 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml)
  3. 创建带 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 的分层排障顺序

下一篇:管理配置、密钥与数据。