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 如何保持流量不中断。
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 来自动化这一过程。