主题
第 7 章 · 云原生与 K8s
生活类比:
云负载均衡(CLB/ALB) = 商场物业在大门口安排的 总引导员,管的是整栋楼客流从哪进。
K8s Service = 每层楼的 楼层管家,知道这一层有哪些店铺开门、谁今天休息。
Ingress = 楼层里的 指示牌,告诉你「餐饮走左、服装走右」。
7.1 云厂商负载均衡
公有云提供托管 LB,免运维、高可用、与 VPC 集成。
| 云 | 四层产品 | 七层产品 | 特点 |
|---|---|---|---|
| 腾讯云 | CLB(四层) | CLB(七层) | 与 CVM、TKE 集成 |
| 阿里云 | SLB(四层) | ALB | 功能全 |
| AWS | NLB | ALB | 全球部署成熟 |
| 华为云 | ELB | ELB | 混合云场景 |
典型架构
用户 ──► 云 CLB(公网 IP)
│
├── 监听 443 HTTPS(证书在 CLB 终结)
│
└── 后端池:3 台 CVM 或 TKE Node
主动健康检查 /healthz云 LB 的优势
| 优势 | 说明 |
|---|---|
| 高可用 | 多可用区部署,厂商保证 SLA |
| 弹性 | 按量计费,带宽可扩 |
| 安全 | 防 DDoS、WAF 可联动 |
| 省心 | 不用自己维护 Nginx 主备 |
何时用云 LB vs 自建 Nginx?
| 用云 LB | 自建 Nginx/HAProxy |
|---|---|
| 要快速上线、少运维 | 要极细粒度控制、成本敏感 |
| 需要多 AZ 高可用 | 内网流量、K8s 集群内 |
| 公网入口 | 已有成熟 SRE 团队维护 |
7.2 Kubernetes Service:集群内 LB
K8s 里 Pod IP 随时变,Service 提供稳定虚拟 IP(ClusterIP)或 DNS 名。
yaml
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
selector:
app: order # 选中带这个标签的 Pod
ports:
- port: 80
targetPort: 8080
type: ClusterIP # 仅集群内访问Service 类型(面试高频)
| type | 作用 | 生活类比 |
|---|---|---|
| ClusterIP | 集群内虚拟 IP | 楼层内部对讲号 |
| NodePort | 每个节点开放某端口 | 每层楼都开一个对外门 |
| LoadBalancer | 调云 API 创建外部 LB | 物业帮你申请大门口 |
| ExternalName | DNS CNAME | 转接到外部店名 |
Pod(易变 IP)── 被 Service 选中 ──► 稳定访问入口 order-service:80kube-proxy 的负载均衡
默认 iptables 或 IPVS 模式,对后端 Pod 做 轮询(IPVS 支持更多算法)。
Client Pod ──► Service VIP ──► kube-proxy 规则 ──► Pod A / B / C7.3 Ingress:HTTP 路由层
Service 只管「到哪个服务」,Ingress 管「哪个 URL 到哪个服务」:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shop-ingress
spec:
rules:
- host: shop.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80需要 Ingress Controller(Nginx Ingress、Traefik、APISIX Ingress)真正执行规则。
Internet ──► Ingress Controller(LB 数据面)
│
├── /api ──► api-service ──► api Pods
└── / ──► web-service ──► web Pods7.4 健康检查:Liveness vs Readiness
yaml
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10| 探针 | 作用 | 失败后果 |
|---|---|---|
| readiness | 能不能接流量? | 从 Service Endpoints 摘除 |
| liveness | 进程是不是死了? | 重启 Pod |
生活类比:
- readiness:店员准备好了没?没准备好别放顾客进来
- liveness:人是不是晕倒了?晕倒就叫救护车(重启)
7.5 EndpointSlice 与负载均衡
K8s 1.21+ 用 EndpointSlice 记录 Service 后端 Pod 列表,kube-proxy 据此转发。
Service order-service
│
▼
EndpointSlice(Pod IP 列表 + 就绪状态)
│
▼
只有 readiness 通过的 Pod 才会在列表里7.6 Service Mesh(Istio)中的 LB
Sidecar(Envoy)接管进出流量:
App ──► localhost:15001(Envoy Sidecar)──► 服务发现 + LB ──► 远端 Pod特点:
- 客户端 LB 在 Sidecar 里
- 加权、熔断、重试、金丝雀发布
- 可观测(每跳 metrics、trace)
生活类比:每个店员配一个 私人助理,助理负责帮你找最合适的其他部门对接人,还记录每次沟通耗时。
7.7 多集群与全局 LB
[Global Server Load Balancing]
/ \
[广州 K8s] [上海 K8s]
│ │
Ingress Ingress- DNS Geo 解析 + 各地 Ingress
- 全局 LB(如 Cloudflare、云 GSLB)按延迟路由
7.8 面试题精选
问:K8s Service 和 Ingress 区别?
Service 提供集群内稳定访问入口和 Pod 负载均衡;Ingress 是 L7 HTTP 路由,按 Host/Path 把流量分到不同 Service,需 Ingress Controller 实现。
问:readiness 和 liveness 区别?
readiness 决定能否接流量,失败则从 Endpoints 摘除;liveness 判断进程是否存活,失败则重启容器。
7.9 一句话总结
云 LB 守大门,Service 管楼层,Ingress 做指路牌,探针保证只有「就绪的 Pod」接客。
下一章 → 08 · 常见踩坑