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 注入配置,共同构成一个完整的应用单元。

Kubernetes 核心资源协作关系 Kubernetes 核心资源协作关系 用户 / 客户端 Service (ClusterIP) Deployment / StatefulSet Pod 副本组 Pod-0 Pod-1 Pod-2 ConfigMap 注入 Secret 注入 Operator 开发关注点 • 通过 Deployment/StatefulSet 控制 Pod 的创建、更新与扩缩容 • 通过 Service 暴露稳定的网络端点,实现服务发现 • 通过 ConfigMap/Secret 动态注入配置,实现应用与配置的完全解耦

2.8 本章小结

  • Pod 是原子调度单位,所有业务逻辑最终都在 Pod 中运行。
  • Service 提供稳定的网络抽象,屏蔽 Pod IP 的动态变化。
  • Deployment 管理无状态应用,支持声明式更新与回滚。
  • StatefulSet 管理有状态应用,保证 Pod 顺序与稳定标识。
  • ConfigMap 和 Secret 实现配置与镜像的解耦,分别处理非敏感与敏感数据。
  • Operator 的核心工作就是编排这些资源,将人工运维经验转化为自动化代码。