2. Kubernetes 核心概念回顾:Pod、Deployment、Service、Secret 的基本原理与关系

在深入优化证书轮换流程之前,必须重新梳理 Kubernetes 中四个最核心的抽象对象:Pod、Deployment、Service 和 Secret。它们构成了绝大多数工作负载的基础运行模型,也是后续滚动更新与证书挂载策略的直接操作对象。

2.1 四类核心对象概述

对象 API 版本(稳定) 核心职责 是否直接暴露网络 是否存储敏感数据
Pod v1 最小调度单元,运行一个或多个容器 否(需 Service) 否
Deployment apps/v1 声明式管理 Pod 副本数与更新策略 否 否
Service v1 提供稳定的网络端点与负载均衡 是(ClusterIP/NodePort/LB) 否
Secret v1 存储敏感配置(证书、密码、) 否 是(Base64 + 可选加密)
关键认知:证书轮换的本质是 Secret 数据更新 → Deployment 滚动触发 → Pod 重新挂载新证书 → Service 保持流量不中断 的闭环。理解这个链条是本章的核心目标。

2.2 Pod:最小原子与临时性

Pod 是 Kubernetes 中可创建和管理的最小部署单元。一个 Pod 封装一个或多个容器(Sidecar 模式)、存储卷、网络 IP 以及容器运行选项。

  • 临时性:Pod 的 IP 地址不固定,重启后可能变化;Pod 本身可能因节点故障、资源不足或更新被驱逐。
  • 共享网络:同一 Pod 内的容器共享同一个网络命名空间(localhost 通信)和存储卷(Volume)。
  • 生命周期:Pending → Running → Succeeded/Failed,不支持直接自愈。
# 一个简单的 Pod 定义示例
apiVersion: v1
kind: Pod
metadata:
  name: cert-consumer-pod
spec:
  containers:
  - name: app
    image: nginx:1.25
    volumeMounts:
    - name: tls-certs
      mountPath: /etc/certs
      readOnly: true
  volumes:
  - name: tls-certs
    secret:
      secretName: my-tls-secret

2.3 Deployment:声明式副本管理与滚动更新引擎

Deployment 是 Pod 的上层控制器,它通过 ReplicaSet 管理 Pod 的副本数量与更新策略。Deployment 不直接操作 Pod,而是维护期望状态(Desired State)。

  • 滚动更新(RollingUpdate):默认策略,逐步替换旧 Pod,保证服务不中断。
  • 回滚(Rollback):保留历史版本,支持快速恢复到上一版本。
  • 扩缩容(Scale):调整副本数,支持 HPA 自动扩缩。
证书轮换关键点:当 Deployment 引用的 Secret 发生变化时,Deployment 不会自动触发滚动更新。必须通过手动触发(如修改 Pod 模板注解)或使用工具(如 Reloader、stakater)来强制 Pod 重新创建以挂载新证书。
# Deployment 定义示例(引用 Secret)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        volumeMounts:
        - name: certs
          mountPath: /etc/nginx/certs
      volumes:
      - name: certs
        secret:
          secretName: web-tls

2.4 Service:稳定的网络抽象层

Service 为一组动态变化的 Pod 提供固定的虚拟 IP(ClusterIP)和 DNS 名称,并实现请求的负载均衡。Pod 的增减、重启、迁移对客户端透明。

  • ClusterIP:默认类型,集群内部可访问。
  • NodePort:在每个节点上开放一个静态端口。
  • LoadBalancer:对接云厂商负载均衡器。
  • Headless Service:无 ClusterIP,直接返回 Pod IP 列表,用于 StatefulSet。
常见误区:Service 的 Endpoint 更新存在秒级延迟(通常 5-15 秒)。在证书轮换的滚动更新期间,如果旧 Pod 被快速销毁而新 Pod 尚未就绪,可能导致部分请求失败。建议结合 Readiness Probe 和 preStop hook 来优雅处理流量切换。

2.5 Secret:敏感数据的存储与挂载

Secret 用于存储密码、OAuth 、SSH 密钥、TLS 证书等敏感信息。数据以 Base64 编码存储,支持 etcd 加密(KMS 或静态加密)。

Secret 类型 用途 数据格式
Opaque 通用键值对 任意 Base64 数据
kubernetes.io/tls TLS 证书与私钥 tls.crt / tls.key
kubernetes.io/dockerconfigjson 镜像仓库认证 .dockerconfigjson
kubernetes.io/service-account- ServiceAccount 自动注入
# 创建 TLS 类型 Secret
kubectl create secret tls my-tls-secret \
  --cert=path/to/tls.crt \
  --key=path/to/tls.key

# 查看 Secret(Base64 编码)
kubectl get secret my-tls-secret -o yaml

2.6 四者关系:证书轮换视角下的数据流

下图展示了从 Secret 更新到 Pod 重新挂载的完整链路,以及 Service 如何保持流量不中断。

证书轮换核心对象关系图 Secret 存储 TLS 证书 Deployment 管理 Pod 副本与更新 ReplicaSet Pod (v1) Pod (v2) Pod (v3) Service 稳定入口 + 负载均衡 引用(volume) 控制 证书轮换触发流程 1. 更新 Secret 数据 2. 触发 Deployment 滚动 3. 新 Pod 挂载新证书 4. Service 自动切换流量

2.7 核心关系总结

  • Secret → Deployment:Deployment 通过 volumes[].secret 引用 Secret,将证书文件挂载到 Pod 文件系统。
  • Deployment → ReplicaSet → Pod:Deployment 控制 ReplicaSet 的版本,ReplicaSet 确保指定数量的 Pod 运行。
  • Pod → Service:Service 通过 Label Selector 关联 Pod,提供稳定的 ClusterIP 和 DNS。
  • 证书轮换闭环:更新 Secret → 触发 Deployment 滚动更新 → 新 Pod 使用新证书 → Service 将流量导向新 Pod → 旧 Pod 被销毁。
优化切入点:默认情况下,Kubernetes 不会自动检测 Secret 内容变化并触发 Pod 重启。这是证书轮换作业流程需要优化的核心痛点。后续章节将深入探讨如何通过 Reloader、Kustomize 配置变更 或 自定义 Operator 来自动化这一过程。