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 之间的协作关系。

Kubernetes 南北向流量路径:Ingress → Service → Pod 外部客户端 Ingress Service Pod 副本组 (标签选择器匹配) app: nginx Deployment 流量路径说明: 1. 外部请求到达 Ingress(基于 host/path 路由) 2. Ingress 将请求转发到后端 Service 的 ClusterIP 3. Service 通过标签选择器将流量负载均衡到后端 Pod 4. Deployment 保证 Pod 副本数,支持滚动更新与回滚

2.6 四大资源的协作关系

在典型的微服务发布流水线中,这四个资源按以下顺序协同工作:

  1. Deployment 定义应用版本、副本数和更新策略,管理 Pod 的生命周期。
  2. Pod 作为实际运行容器的工作负载,由 Deployment 的 ReplicaSet 创建和维护。
  3. Service 通过标签选择器绑定到 Pod 组,提供稳定的虚拟 IP 和 DNS 名称。
  4. 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 的核心交互方式,掌握其结构是后续自动化流水线的基础。