一、Pod控制器概述

1.1 什么是Pod控制器

​Pod控制器(Controller)​​ 又称为​​工作负载(Workload)​​,是Kubernetes中用于​​管理Pod的中间层​​。它的核心职责是确保集群中的Pod资源始终符合用户定义的"期望状态"。

1.2 核心功能

  • ​副本管理​​:保证Pod副本数量与期望一致

  • ​自动恢复​​:Pod异常退出时,根据重启策略自动重建

  • ​运维支持​​:支持伸缩(扩容/缩容)、滚动更新、版本回滚等操作

二、Pod控制器类型详解

2.1 控制器类型对比表

控制器

功能描述

典型应用场景

​ReplicaSet​

保证指定数量的Pod副本存在,支持滚动扩缩容

无状态应用,通常由Deployment管理

​Deployment​

管理ReplicaSet,实现声明式部署、滚动升级、回滚

Web服务、API服务

​StatefulSet​

管理有状态应用,提供稳定的网络标识与存储

数据库、Zookeeper、Etcd

​DaemonSet​

每个Node上运行一个Pod

日志收集、监控代理、存储服务

​Job​

执行一次性任务

批处理、数据迁移、安全扫描

​CronJob​

周期性任务(类似Crontab)

定期备份、定时通知、日志清理

2.2 Deployment控制器(无状态应用)

特点
  • 专为无状态应用设计

  • 支持声明式配置更新

  • 完整的滚动更新与回滚机制

  • 与ReplicaSet协作管理Pod生命周期

配置示例
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.15.4
        ports:
        - containerPort: 80
关键配置参数
spec:
  replicas: 3                    # 期望的Pod数量
  strategy:
    rollingUpdate:
      maxSurge: 25%              # 升级过程中最多可超期25%的Pod
      maxUnavailable: 25%        # 升级过程中最多不可用25%的Pod
    type: RollingUpdate          # 滚动升级策略

2.3 StatefulSet控制器(有状态应用)

核心特性
  1. ​稳定存储​​:基于PVC实现,每个Pod拥有独立存储

  2. ​稳定网络标识​​:Pod名称和DNS名称固定不变

  3. ​有序部署/删除​​:顺序创建(0→N-1),逆序删除(N-1→0)

  4. ​依赖Headless Service​​:用于DNS解析和服务发现

三大核心组件
  • ​Headless Service​​:为Pod生成可解析的DNS记录

  • ​volumeClaimTemplates​​:为每个Pod提供专用存储卷

  • ​StatefulSet​​:管控Pod资源的控制器

完整示例
# Headless Service定义
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod

# StatefulSet定义
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 3
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myappdata
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myappdata
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 2Gi
Pod DNS解析格式
(pod_name).(service_name).(namespace_name).svc.cluster.local

示例:myapp-0.myapp-svc.default.svc.cluster.local

2.4 DaemonSet控制器

适用场景
  • 集群存储守护进程:如ceph、glusterd

  • 日志收集:如fluentd、logstash

  • 节点监控:如Prometheus Node Exporter

  • 网络插件:如Calico、Flannel

配置示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

2.5 Job控制器

应用场景
  • 数据库迁移

  • 批处理任务

  • 离线数据处理

  • 一次性计算任务

配置示例
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4
关键参数
  • restartPolicy:重启策略(OnFailure/Never)

  • backoffLimit:失败重试次数(默认6次)

2.6 CronJob控制器

配置示例
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"        # 定时规则
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from Kubernetes cluster
          restartPolicy: OnFailure
高级配置
spec:
  concurrencyPolicy: Allow           # 并发策略
  startingDeadlineSeconds: 15       # 启动截止时间
  successfulJobsHistoryLimit: 3     # 成功记录保留数
  failedJobsHistoryLimit: 1         # 失败记录保留数

三、无状态 vs 有状态应用对比

特性对比

无状态应用(Deployment)

有状态应用(StatefulSet)

​Pod名称​

随机生成

固定、有序(0→N-1)

​存储方式​

共享存储或无持久化

每个Pod独立PVC

​网络标识​

不固定

稳定DNS名称

​扩缩容​

无序、并行

有序、串行

​典型场景​

Web应用、API服务

数据库、中间件集群

四、配置资源管理

4.1 Secret(敏感信息管理)

Secret类型

类型

用途

Opaque

用户自定义敏感数据(默认类型)

kubernetes.io/service-account-token

服务账户令牌

kubernetes.io/dockerconfigjson

私有镜像仓库认证

kubernetes.io/tls

TLS证书文件

创建方式

​方法一:命令行创建​

echo -n 'username' > username.txt
echo -n 'password' > password.txt
kubectl create secret generic mysecret \
  --from-file=username.txt \
  --from-file=password.txt

​方法二:YAML文件创建​

apiVersion: v1
kind: Secret
metadata:
  name: mysecret1
type: Opaque
data:
  username: emhhbmdzYW4=  # base64编码
  password: MWYyZDFlMmU2N2Rm
使用方式

​方式一:Volume挂载​

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: secrets
      mountPath: "/etc/secrets"
  volumes:
  - name: secrets
    secret:
      secretName: mysecret

​方式二:环境变量​

apiVersion: v1
kind: Pod
metadata:
  name: mypod1
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret1
          key: username
    - name: SECRET_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret1
          key: password

4.2 ConfigMap(配置管理)

创建方式

​从目录创建​

kubectl create configmap game-config \
  --from-file=/opt/configmap/

​从字面值创建​

kubectl create configmap special-config \
  --from-literal=special.how=very \
  --from-literal=special.type=good
使用方式

​环境变量注入​

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command: ["/bin/sh", "-c", "env"]
    env:
    - name: SPECIAL_HOW_KEY
      valueFrom:
        configMapKeyRef:
          name: special-config
          key: special.how
    envFrom:
    - configMapRef:
        name: env-config

​Volume挂载​

volumes:
- name: config-volume
  configMap:
    name: special-config
热更新机制
  • ​Volume挂载​​:约10秒后自动同步更新

  • ​环境变量​​:不会自动更新,需要重启Pod

  • ​触发更新​​:可通过修改annotation触发滚动更新

kubectl patch deployment my-nginx \
  --patch '{"spec":{"template":{"metadata":{"annotations":{"version/config":"20240520"}}}}}'

五、服务发现机制

5.1 DNS发展历程

  • Kubernetes 1.3以前:SkyDNS

  • Kubernetes 1.3~1.11:KubeDNS

  • Kubernetes 1.11以后:​​CoreDNS​​(当前标准)

5.2 服务通信格式

(pod_name).(service_name).(namespace).svc.cluster.local

5.3 Service类型对比

特性

常规Service

Headless Service

​ClusterIP​

无(None)

​访问方式​

负载均衡

直接Pod IP访问

​主要用途​

统一入口

StatefulSet DNS发现

六、总结与最佳实践

6.1 控制器选择指南

应用类型

推荐控制器

关键考虑因素

​无状态Web服务​

Deployment

副本数、滚动更新

​有状态数据库​

StatefulSet

持久化存储、有序部署

​节点级守护进程​

DaemonSet

节点亲和性、资源限制

​定时任务​

CronJob

调度策略、历史记录

​批处理任务​

Job

重试策略、完成策略

6.2 配置管理建议

  1. ​敏感信息​​:一律使用Secret存储,启用RBAC控制

  2. ​环境配置​​:不同环境使用不同的ConfigMap

  3. ​配置更新​​:利用Volume挂载实现热更新

  4. ​版本控制​​:对ConfigMap和Secret进行版本管理

6.3 安全实践

  • 定期轮转Secret中的凭证

  • 使用RBAC严格控制配置资源的访问权限

  • 避免在环境变量中传递敏感信息

  • 对ConfigMap进行敏感信息扫描

通过合理运用Pod控制器和配置资源管理,可以实现应用的高可用部署、灵活扩缩容以及安全的配置管理,为云原生应用提供稳定可靠的运行环境。

更多推荐