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之间的协作关系。这是理解服务网格数据面流量劫持和回滚护栏作用范围的前提。
2.7 回滚护栏视角的关键总结
移植适配要点:
- Pod标签稳定性: 回滚护栏依赖Pod标签(如
version: v1)来区分版本,标签命名规范必须统一。 - Service无状态路由: Service不感知版本,回滚时需配合网格路由规则(如VirtualService)或Deployment回滚来切换流量。
- Deployment历史版本: 设置合理的
revisionHistoryLimit(建议≥10),确保回滚护栏有足够的历史版本可供选择。 - Ingress与网格网关共存: 在移植初期,可保留原生Ingress作为fallback入口,网格Gateway作为主入口,实现平滑迁移。