Skip to content

第 7 章 · 云原生与 K8s

生活类比
云负载均衡(CLB/ALB) = 商场物业在大门口安排的 总引导员,管的是整栋楼客流从哪进。
K8s Service = 每层楼的 楼层管家,知道这一层有哪些店铺开门、谁今天休息。
Ingress = 楼层里的 指示牌,告诉你「餐饮走左、服装走右」。


7.1 云厂商负载均衡

公有云提供托管 LB,免运维、高可用、与 VPC 集成。

四层产品七层产品特点
腾讯云CLB(四层)CLB(七层)与 CVM、TKE 集成
阿里云SLB(四层)ALB功能全
AWSNLBALB全球部署成熟
华为云ELBELB混合云场景

典型架构

用户 ──► 云 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物业帮你申请大门口
ExternalNameDNS CNAME转接到外部店名
Pod(易变 IP)── 被 Service 选中 ──► 稳定访问入口 order-service:80

kube-proxy 的负载均衡

默认 iptables 或 IPVS 模式,对后端 Pod 做 轮询(IPVS 支持更多算法)。

Client Pod ──► Service VIP ──► kube-proxy 规则 ──► Pod A / B / C

7.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 Pods

7.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 · 常见踩坑