2. Kubernetes 基础回顾:Pod、Service、Deployment、StatefulSet、ConfigMap、Secret 核心资源
在深入 Operator SDK 开发之前,必须牢固掌握 Kubernetes 的六大核心资源。这些资源是构建任何云原生应用的基础,也是 Operator 编排与管理的直接对象。本章将逐一回顾它们的定义、作用、关键字段以及典型使用场景。
2.1 核心资源总览
下表从“职责”、“生命周期”、“网络标识”和“数据持久性”四个维度,对六大资源进行横向对比,帮助建立整体认知。
| 资源类型 | 核心职责 | 生命周期 | 网络标识 | 数据持久性 |
|---|---|---|---|---|
| Pod | 最小调度单元,运行容器 | 临时(可被重建) | Cluster IP(动态) | 无(emptyDir 临时) |
| Service | 提供稳定的网络访问入口 | 持久(直到删除) | Cluster IP(固定) | 无 |
| Deployment | 管理无状态应用的声明式更新 | 持久(管理 ReplicaSet) | 无直接标识 | 无(Pod 重建后数据丢失) |
| StatefulSet | 管理有状态应用的顺序部署 | 持久(Pod 有稳定标识) | 稳定的网络标识(DNS) | 支持(PVC 模板) |
| ConfigMap | 存储非敏感配置数据 | 持久 | 无 | 数据独立于 Pod |
| Secret | 存储敏感数据(密码、) | 持久 | 无 | 数据独立于 Pod(Base64 编码) |
2.2 Pod:最小调度单元
Pod 是 Kubernetes 中可创建和部署的最小计算单元。一个 Pod 可以包含一个或多个容器(例如 Sidecar 模式),这些容器共享网络栈和存储卷。
关键字段:
spec.containers:定义容器镜像、端口、命令、环境变量。spec.volumes:挂载的存储卷,支持 emptyDir、hostPath、PVC 等。status.phase:Pod 生命周期阶段(Pending、Running、Succeeded、Failed、Unknown)。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
env:
- name: ENV_NAME
value: "production"
volumes:
- name: shared-data
emptyDir: {}
2.3 Service:稳定的网络抽象
Service 为一组功能相同的 Pod 提供稳定的网络入口,实现服务发现和负载均衡。即使后端 Pod 因故障重建导致 IP 变化,Service 的 Cluster IP 或 DNS 名称保持不变。
| Service 类型 | 访问范围 | 典型场景 |
|---|---|---|
| ClusterIP | 集群内部 | 微服务间内部通信 |
| NodePort | 集群外部(通过节点 IP + 端口) | 开发调试、简单对外暴露 |
| LoadBalancer | 集群外部(通过云负载均衡器) | 生产环境对外服务 |
| ExternalName | 集群内部(映射到外部 DNS) | 访问集群外部的数据库或服务 |
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
2.4 Deployment:无状态应用的声明式管理
Deployment 是管理无状态应用的首选资源。它通过 ReplicaSet 确保指定数量的 Pod 副本始终运行,并支持滚动更新、回滚、扩缩容等操作。
核心机制:Deployment 不直接管理 Pod,而是管理 ReplicaSet。每次更新都会创建一个新的 ReplicaSet,并逐步增加新副本、减少旧副本,实现零停机发布。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
2.5 StatefulSet:有状态应用的顺序管理
StatefulSet 专为有状态应用设计,如数据库、消息队列等。它保证 Pod 的启动顺序、稳定的网络标识(Pod 名称固定)和持久化存储。
与 Deployment 的关键区别:
- Pod 名称有序且固定(如
web-0、web-1),不会随机生成。 - 每个 Pod 可以绑定独立的 PVC,数据不共享。
- 支持有序的滚动更新和灰度发布。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
2.6 ConfigMap 与 Secret:配置与敏感数据管理
ConfigMap 和 Secret 用于将配置数据与容器镜像解耦。ConfigMap 存储非敏感配置(如配置文件、环境变量),Secret 存储敏感数据(如密码、TLS 证书)。
| 特性 | ConfigMap | Secret |
|---|---|---|
| 数据编码 | 明文 | Base64 编码 |
| 典型用途 | 应用配置文件、环境变量 | 数据库密码、API 、SSH 密钥 |
| 注入方式 | 环境变量、卷挂载 | 环境变量、卷挂载 |
| 大小限制 | 1 MiB(etcd 限制) | 1 MiB(etcd 限制) |
# ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
app.properties: |
key1=value1
key2=value2
LOG_LEVEL: "debug"
# Secret 示例
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # admin
password: cGFzc3dvcmQ= # password
2.7 六大资源协作关系图
下图展示了 Operator 开发中最常见的资源协作模式:Deployment/StatefulSet 管理 Pod 生命周期,Service 提供稳定访问入口,ConfigMap/Secret 注入配置,共同构成一个完整的应用单元。
2.8 本章小结
- Pod 是原子调度单位,所有业务逻辑最终都在 Pod 中运行。
- Service 提供稳定的网络抽象,屏蔽 Pod IP 的动态变化。
- Deployment 管理无状态应用,支持声明式更新与回滚。
- StatefulSet 管理有状态应用,保证 Pod 顺序与稳定标识。
- ConfigMap 和 Secret 实现配置与镜像的解耦,分别处理非敏感与敏感数据。
- Operator 的核心工作就是编排这些资源,将人工运维经验转化为自动化代码。