2. K8s集群基础回顾:Pod、Service、Deployment、Ingress核心概念

在将服务网格治理回滚护栏移植到Kubernetes集群之前,必须牢固掌握K8s的四大核心抽象:Pod(最小调度单元)、Service(稳定网络端点)、Deployment(声明式工作负载管理)和Ingress(南北向流量入口)。这些原语构成了服务网格数据面和控制面的运行基础。

2.1 核心概念对比一览

资源对象 API组/版本 核心职责 与服务网格的关系
Pod v1 运行一个或多个容器,共享网络/IP和存储卷 Sidecar注入的目标载体;Envoy代理以Sidecar容器形式与业务容器共存
Service v1 为一组Pod提供稳定的虚拟IP和DNS名称,实现负载均衡 网格内流量路由的端点基础;Istio VirtualService/DestinationRule依赖Service选择器
Deployment apps/v1 声明式管理Pod副本数、滚动更新、回滚 回滚护栏的天然执行层;通过Deployment历史版本控制实现灰度回退
Ingress networking.k8s.io/v1 将外部HTTP/HTTPS流量路由到集群内部Service 网格入口网关的替代或补充;可被Istio Gateway/Ingress Gateway接管
关键认知: 服务网格并不替代Pod、Service、Deployment、Ingress,而是在这些原语之上叠加透明的流量治理层。回滚护栏的移植必须同时兼容K8s原生回滚机制和网格层面的路由回滚。

2.2 Pod:最小调度与Sidecar注入单元

Pod是Kubernetes中可创建和部署的最小计算单元。一个Pod可以包含一个或多个容器,这些容器共享同一个网络命名空间、IP地址和存储卷。在服务网格场景下,Pod是Sidecar代理注入的基本单位。

  • 共享网络栈: Pod内的所有容器(包括业务容器和Sidecar)通过localhost通信,端口不能冲突。
  • 生命周期短暂: Pod的IP是动态分配的,重启后可能变化——这正是Service存在的理由。
  • Sidecar注入模式: 网格控制面通过MutatingWebhook自动在Pod创建时注入Envoy代理容器,实现透明流量拦截。
# 一个包含业务容器和Sidecar容器的Pod示例(简化)
apiVersion: v1
kind: Pod
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  containers:
  - name: productpage          # 业务容器
    image: istio/examples-bookinfo-productpage-v1:1.16.2
    ports:
    - containerPort: 9080
  - name: istio-proxy          # Sidecar容器(由网格注入)
    image: docker.io/istio/proxyv2:1.16.2
    ports:
    - containerPort: 15001     # 入站流量拦截端口
    - containerPort: 15006     # 出站流量拦截端口

2.3 Service:稳定的网络抽象与流量端点

Service为一组动态变化的Pod提供稳定的访问入口。它通过标签选择器(Selector)关联Pod,并分配一个虚拟IP(ClusterIP)。服务网格的流量路由规则(如VirtualService)直接引用Service名称作为目标。

  • ClusterIP(默认): 集群内可访问的虚拟IP,网格内部通信首选。
  • NodePort: 在每个节点上开放静态端口,用于开发调试或非网格入口。
  • LoadBalancer: 云厂商提供的外部负载均衡器,常被网格Ingress Gateway替代。
  • Headless Service: 不分配ClusterIP,直接返回Pod IP列表,用于StatefulSet或网格内直接端点发现。
# 一个标准的ClusterIP Service
apiVersion: v1
kind: Service
metadata:
  name: productpage
spec:
  selector:
    app: productpage          # 选择所有app=productpage的Pod
  ports:
  - protocol: TCP
    port: 9080                # Service端口
    targetPort: 9080          # Pod容器端口
回滚护栏注意点: Service的标签选择器一旦变更,可能导致流量瞬间切换到错误的Pod版本。在回滚场景中,应优先通过Deployment回滚而非直接修改Service选择器。

2.4 Deployment:声明式工作负载与回滚基石

Deployment是Kubernetes中最常用的工作负载控制器,它通过ReplicaSet管理Pod副本,并提供声明式更新、滚动升级和回滚能力。服务网格的回滚护栏直接利用Deployment的revisionHistoryLimit和rollback-to机制。

  • 滚动更新策略: maxSurge(最大额外Pod数)和maxUnavailable(最大不可用Pod数)控制更新速率。
  • 版本历史: Deployment默认保留最近10个ReplicaSet版本,可通过kubectl rollout history查看。
  • 回滚命令: kubectl rollout undo deployment/<name> --to-revision=<N> 快速回退到指定版本。
# Deployment示例:包含滚动更新策略和版本标签
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 3
  revisionHistoryLimit: 10       # 保留10个历史版本
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      labels:
        app: productpage
        version: v1
    spec:
      containers:
      - name: productpage
        image: productpage:v1.0.0
        ports:
        - containerPort: 9080

2.5 Ingress:南北向流量入口与网格网关

Ingress是Kubernetes原生的API对象,用于管理集群外部访问集群内服务的HTTP/HTTPS路由。在服务网格架构中,Ingress通常被网格的Ingress Gateway(如Istio Gateway)替代或增强,但理解原生Ingress仍是基础。

  • 路由规则: 基于Host、Path将请求转发到后端Service。
  • TLS终止: 可在Ingress层配置SSL证书,解密后转发到后端。
  • 与网格网关的关系: 原生Ingress Controller(如Nginx Ingress)可作为网格的入口,但网格Gateway提供更细粒度的流量治理(如权重路由、故障注入)。
# 原生Ingress示例:将外部请求路由到productpage Service
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bookinfo-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: bookinfo.example.com
    http:
      paths:
      - path: /productpage
        pathType: Prefix
        backend:
          service:
            name: productpage
            port:
              number: 9080

2.6 四大核心资源的关系与流量路径

下图展示了从外部请求到Pod内部容器的完整流量路径,以及Deployment、Service、Ingress、Pod之间的协作关系。这是理解服务网格数据面流量劫持和回滚护栏作用范围的前提。

K8s核心资源流量路径与关系图 K8s核心资源流量路径与关系图 外部用户 Ingress Service Pod (Sidecar + 业务容器) IP: 10.1.0.x Deployment 说明: Ingress接收外部请求 → 转发到Service → Service负载均衡到Pod → Pod内Sidecar拦截流量 → 业务容器处理。 Deployment负责Pod的声明式管理、滚动更新和回滚,不直接参与数据路径。

2.7 回滚护栏视角的关键总结

移植适配要点:
  • Pod标签稳定性: 回滚护栏依赖Pod标签(如version: v1)来区分版本,标签命名规范必须统一。
  • Service无状态路由: Service不感知版本,回滚时需配合网格路由规则(如VirtualService)或Deployment回滚来切换流量。
  • Deployment历史版本: 设置合理的revisionHistoryLimit(建议≥10),确保回滚护栏有足够的历史版本可供选择。
  • Ingress与网格网关共存: 在移植初期,可保留原生Ingress作为fallback入口,网格Gateway作为主入口,实现平滑迁移。