2. Kubernetes基础回顾
在深入多集群服务网格集成之前,必须牢固掌握 Kubernetes 的四大核心抽象:Pod(最小调度单元)、Service(网络访问抽象)、Deployment(声明式工作负载管理)和 Ingress(南北向流量入口)。本章将逐一拆解其职责、生命周期与 YAML 声明式写法,为后续流水线编排与网格注入打下基础。
2.1 核心概念速览
| 资源对象 | API 版本(稳定) | 核心职责 | 是否管理 Pod 生命周期 | 是否提供网络端点 |
|---|---|---|---|---|
| Pod | v1 | 运行一个或多个容器,共享网络/IP 与存储卷 | 否(自身即实例) | 是(ClusterIP 默认) |
| Service | v1 | 为一组 Pod 提供稳定的虚拟 IP 与 DNS 名称 | 否 | 是(ClusterIP/NodePort/LB) |
| Deployment | apps/v1 | 声明式更新 ReplicaSet,支持滚动升级与回滚 | 是(通过 ReplicaSet) | 否 |
| Ingress | networking.k8s.io/v1 | 将外部 HTTP/HTTPS 流量路由到集群内 Service | 否 | 是(外部入口) |
关键认知:Pod 是“死的”(IP 会变),Service 是“活的”(稳定端点),Deployment 是“管家”(保证副本数与版本),Ingress 是“大门”(统一外部流量)。
2.2 Pod:最小调度单元
Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器(Sidecar 模式),所有容器共享同一个网络命名空间、IP 地址和存储卷。
2.2.1 Pod 的典型 YAML 结构
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
tier: frontend
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
restartPolicy: Always
2.2.2 Pod 生命周期状态
- Pending:已被集群接受,但容器尚未启动(调度中或拉取镜像)。
- Running:至少一个容器正在运行。
- Succeeded:所有容器正常退出(Job 场景)。
- Failed:至少一个容器以非零状态退出。
- CrashLoopBackOff:容器反复崩溃,Kubelet 正在退避重启。
生产避坑:不要直接创建 Pod!应使用 Deployment、StatefulSet 等控制器管理 Pod,否则 Pod 故障后不会自动重建。
2.3 Deployment:声明式工作负载管理
Deployment 是 Kubernetes 中最常用的工作负载控制器。它通过管理 ReplicaSet 来保证期望的 Pod 副本数,并支持滚动更新、回滚、扩缩容等操作。
2.3.1 Deployment 的 YAML 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25-alpine
ports:
- containerPort: 80
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
2.3.2 滚动更新策略参数
| 参数 | 默认值 | 说明 |
|---|---|---|
maxUnavailable |
25% | 更新过程中允许不可用的最大 Pod 数(值或百分比) |
maxSurge |
25% | 更新过程中允许超出期望副本数的最大 Pod 数 |
minReadySeconds |
0 | Pod 就绪后等待多少秒才视为可用 |
2.4 Service:稳定的网络抽象
Pod 的 IP 是动态的,Service 通过标签选择器将一组 Pod 暴露为稳定的网络服务。Service 的类型决定了其对外暴露方式。
2.4.1 Service 类型对比
| 类型 | 访问范围 | 典型场景 |
|---|---|---|
| ClusterIP | 集群内部 | 微服务间内部通信 |
| NodePort | 集群外部(通过节点 IP + 端口) | 开发调试、非生产环境 |
| LoadBalancer | 集群外部(通过云负载均衡器) | 云原生生产环境 |
| ExternalName | 集群内部(映射到外部 DNS) | 集成外部数据库或 API |
2.4.2 Service YAML 示例(ClusterIP)
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
2.5 Ingress:南北向流量入口
Ingress 管理集群外部到集群内 Service 的 HTTP/HTTPS 路由。它通常需要配合 Ingress Controller(如 Nginx Ingress、Traefik、Istio Gateway)才能生效。
2.5.1 Ingress YAML 示例(基于主机名路由)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
2.5.2 Ingress 与 Service 的流量路径
下图展示了从外部客户端到 Pod 的完整流量路径,以及 Ingress、Service、Deployment 之间的协作关系。
2.6 四大资源的协作关系
在典型的微服务发布流水线中,这四个资源按以下顺序协同工作:
- Deployment 定义应用版本、副本数和更新策略,管理 Pod 的生命周期。
- Pod 作为实际运行容器的工作负载,由 Deployment 的 ReplicaSet 创建和维护。
- Service 通过标签选择器绑定到 Pod 组,提供稳定的虚拟 IP 和 DNS 名称。
- Ingress 将外部流量按域名/路径规则路由到对应的 Service。
流水线视角:在 CI/CD 流水线中,通常只更新 Deployment 的镜像版本(
kubectl set image 或 kubectl apply -f deployment.yaml),Service 和 Ingress 的配置相对稳定。服务网格集成后,Sidecar 代理会自动注入到 Pod 中,接管 Service 的流量路由能力。
2.7 本章小结
- Pod 是原子调度单位,但不应直接创建。
- Deployment 是工作负载管理的首选控制器,支持声明式更新。
- Service 提供稳定的网络端点,解耦 Pod 的动态 IP。
- Ingress 是集群的统一入口,负责 HTTP/HTTPS 路由。
- YAML 声明式配置是 Kubernetes 的核心交互方式,掌握其结构是后续自动化流水线的基础。