Kubernetes 控制器详解

一、什么是控制器

控制器是 Kubernetes 中用于管理 Pod 的一种机制。它通过维护 Pod 的副本数量状态,确保系统始终处于用户期望的目标状态。控制器的核心功能包括:

  • 自主式 Pod 与控制器管理的 Pod

    • 自主式 Pod:Pod 退出或意外关闭后不会被重新创建。

    • 控制器管理的 Pod:控制器会始终维持 Pod 的副本数目,并在 Pod 出现故障时根据指定策略重新编排。

  • 工作原理

    • 控制器将期望状态写入 etcd。

    • Kubernetes 的 API Server 会检索 etcd 中保存的期望状态,并与当前状态进行对比。

    • 如果存在差异,系统会自动驱动恢复到期望状态。

二、控制器常用类型

控制器有多种类型,每种类型适用于不同的场景。以下是常见控制器的分类及其用途:

控制器名称 控制器用途
Replication Controller 比较原始的 Pod 控制器,已被废弃,由 ReplicaSet 替代。
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。
Deployment 提供 Pod 和 ReplicaSet 的声明式更新能力,支持滚动更新、回滚、扩容和缩容。
DaemonSet 确保每个节点上运行一个 Pod 副本,常用于运行集群存储、日志收集和监控等守护进程。
StatefulSet 用于管理有状态应用的工作负载,支持稳定的网络标识和存储。
Job 执行批处理任务,仅执行一次任务,保证任务的一个或多个 Pod 成功结束。
CronJob 创建基于时间调度的 Jobs,类似于 Linux 的定时任务。
HPA (Horizontal Pod Autoscaler) 根据资源利用率自动调整 Pod 数量,实现水平自动缩放。

三、ReplicaSet 控制器

3.1 ReplicaSet 功能

ReplicaSet 是下一代的 Replication Controller,官方推荐使用。它支持基于集合的选择器,确保任何时间都有指定数量的 Pod 副本在运行。虽然 ReplicaSet 可以独立使用,但通常被 Deployment 用作协调 Pod 创建、删除和更新的机制。

3.2 ReplicaSet 参数说明

参数名称 字段类型 参数说明
spec Object 详细定义对象
spec.replicas integer 指定维护的 Pod 数量
spec.selector Object 定义 Pod 的标签查询条件
spec.selector.matchLabels string 指定标签的名称和值
spec.template Object 定义 Pod 的模板
spec.template.metadata Object 定义 Pod 的元数据
spec.template.metadata.labels string 定义 Pod 的标签
spec.template.spec Object 定义 Pod 的详细配置
spec.template.spec.containers list 定义容器列表
spec.template.spec.containers.name string 定义容器名称
spec.template.spec.containers.image string 定义容器镜像

3.3 ReplicaSet 示例

创建 ReplicaSet
# replicaset.yml
apiVersion: apps/v1                          # 指定使用的 Kubernetes API 版本
kind: ReplicaSet                             # 指定资源类型为 ReplicaSet
metadata:                                    # 定义资源的元数据
  name: replicaset                           # ReplicaSet 的名称
spec:                                        # 定义 ReplicaSet 的规格
  replicas: 2                                # 指定维护的 Pod 副本数量
  selector:                                  # 定义选择器,用于匹配管理的 Pod
    matchLabels:                             # 使用标签匹配 Pod
      app: myapp                             # 匹配标签为 app=myapp 的 Pod
  template:                                  # 定义 Pod 的模板
    metadata:                                # Pod 的元数据
      labels:                                # Pod 的标签
        app: myapp                           # 标签名称和值
    spec:                                    # Pod 的详细配置
      containers:                            # 定义容器列表
      - name: myapp                          # 容器的名称
        image: myapp:v1                      # 使用的容器镜像
应用 ReplicaSet 配置
kubectl apply -f replicaset.yml
查看 Pod 状态
kubectl get pods --show-labels
修改 Pod 标签
kubectl label pod replicaset-l4xnr app=timinglee --overwrite
删除 Pod
kubectl delete pods replicaset-t2s5p
回收资源
kubectl delete -f replicaset.yml

四、Deployment 控制器

4.1 Deployment 功能

Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的高级控制器。它通过声明式配置管理应用的部署过程,支持滚动更新、版本回滚、扩容和缩容等功能。

4.2 Deployment 示例

创建 Deployment
# deployment.yml
apiVersion: apps/v1                          # 使用 Kubernetes apps/v1 API 版本
kind: Deployment                             # 资源类型为 Deployment
metadata:                                    # 定义 Deployment 的元数据
  name: deployment                           # Deployment 的名称
spec:                                        # 定义 Deployment 的规格
  replicas: 4                                # 指定 Pod 的副本数量
  selector:                                  # 定义选择器,用于匹配管理的 Pod
    matchLabels:                             # 使用标签匹配 Pod
      app: myapp                             # 匹配标签为 app=myapp 的 Pod
  template:                                  # 定义 Pod 的模板
    metadata:                                # Pod 的元数据
      labels:                                # Pod 的标签
        app: myapp                           # 标签名称和值
    spec:                                    # Pod 的详细配置
      containers:                            # 定义容器列表
      - name: myapp                          # 容器的名称
        image: myapp:v1                      # 使用的容器镜像

分块详解:

1. API 版本和资源类型
apiVersion: apps/v1                          # 使用 Kubernetes apps/v1 API 版本
kind: Deployment                             # 资源类型为 Deployment
  • apiVersion:指定 Kubernetes API 的版本,apps/v1 是当前推荐的版本。

  • kind:指定资源类型,这里是 Deployment


2. 元数据(Metadata)
metadata:                                    # 定义 Deployment 的元数据
  name: deployment                           # Deployment 的名称
  • metadata:包含资源的元数据,如名称、标签、注解等。

  • name:资源的名称,必须是唯一的。


3. 规格(Spec)
spec:                                        # 定义 Deployment 的规格
  replicas: 4                                # 指定 Pod 的副本数量
  • spec:定义资源的期望状态。

  • replicas:指定 Pod 的副本数量,Kubernetes 会确保维持这个数量的 Pod 运行。


4. 选择器(Selector)
  selector:                                  # 定义选择器,用于匹配管理的 Pod
    matchLabels:                             # 使用标签匹配 Pod
      app: myapp                             # 匹配标签为 app=myapp 的 Pod
  • selector:定义如何选择 Pod,通常通过标签匹配。

  • matchLabels:指定 Pod 必须包含的标签,只有匹配这些标签的 Pod 才会被管理。


5. Pod 模板(Template)
  template:                                  # 定义 Pod 的模板
    metadata:                                # Pod 的元数据
      labels:                                # Pod 的标签
        app: myapp                           # 标签名称和值
  • template:定义 Pod 的模板,用于创建新的 Pod。

  • metadata:Pod 的元数据,通常包含标签。

  • labels:Pod 的标签,这些标签会被用于选择器匹配。


6. 容器配置(Containers)
    spec:                                    # Pod 的详细配置
      containers:                            # 定义容器列表
      - name: myapp                          # 容器的名称
        image: myapp:v1                      # 使用的容器镜像
  • spec:定义 Pod 的详细配置。

  • containers:定义 Pod 中的容器列表。

  • name:容器的名称,必须是唯一的。

  • image:容器使用的镜像,格式为 镜像名:版本

应用 Deployment 配置
kubectl apply -f deployment.yml
查看 Pod 状态
kubectl get pods --show-labels

4.2.1 版本迭代

更新容器版本
# 编辑 deployment.yml,将镜像版本从 myapp:v1 更新为 myapp:v2
应用更新
kubectl apply -f deployment.yml
查看更新过程
watch -n1 kubectl get pods -o wide

4.2.2 版本回滚

回滚到之前的版本
# 编辑 deployment.yml,将镜像版本从 myapp:v2 回滚到 myapp:v1
应用回滚
kubectl apply -f deployment.yml

4.2.3 滚动更新策略

# deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
spec:
  minReadySeconds: 5                         # 设置 Pod 的最小就绪时间
  replicas: 4
  strategy:                                  # 定义滚动更新策略
    rollingUpdate:
      maxSurge: 1                            # 允许的最大 Pod 数量超出副本数量
      maxUnavailable: 0                      # 允许的最大不可用 Pod 数量
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
应用更新
kubectl apply -f deployment.yml

4.2.4 暂停与恢复

暂停 Deployment 更新
kubectl rollout pause deployment deployment
编辑配置文件
# 编辑 deployment.yml,修改配置(例如镜像版本或资源限制)
恢复 Deployment 更新
kubectl rollout resume deployment deployment

五、DaemonSet 控制器

5.1 DaemonSet 功能

DaemonSet 确保每个节点上运行一个 Pod 副本。当有新节点加入集群时,DaemonSet 会自动为新节点创建 Pod;当节点被移除时,Pod 也会被回收。DaemonSet 常用于运行集群存储、日志收集和监控等守护进程。

5.2 DaemonSet 示例

创建 DaemonSet
# daemonset-example.yml
apiVersion: apps/v1                          # 使用 Kubernetes apps/v1 API 版本
kind: DaemonSet                              # 资源类型为 DaemonSet
metadata:                                    # 定义 DaemonSet 的元数据
  name: daemonset-example                    # DaemonSet 的名称
spec:                                        # 定义 DaemonSet 的规格
  selector:                                  # 定义选择器,用于匹配管理的 Pod
    matchLabels:                             # 使用标签匹配 Pod
      app: nginx                             # 匹配标签为 app=nginx 的 Pod
  template:                                  # 定义 Pod 的模板
    metadata:                                # Pod 的元数据
      labels:                                # Pod 的标签
        app: nginx                           # 标签名称和值
    spec:                                    # Pod 的详细配置
      containers:                            # 定义容器列表
      - name: nginx                          # 容器的名称
        image: nginx                         # 使用的容器镜像
应用 DaemonSet 配置
kubectl apply -f daemonset-example.yml
查看 Pod 状态
kubectl get pods -o wide
回收资源
kubectl delete -f daemonset-example.yml

六、Job 控制器

6.1 Job 功能

Job 是用于执行批处理任务的控制器,通常用于运行一次性的任务。Job 会创建一个或多个 Pod 来完成指定的任务,任务完成后 Pod 会自动退出。

6.2 Job 示例

创建 Job
# job.yml
apiVersion: batch/v1                         # 使用 Kubernetes batch/v1 API 版本
kind: Job                                    # 资源类型为 Job
metadata:                                    # 定义 Job 的元数据
  name: pi                                   # Job 的名称
spec:                                        # 定义 Job 的规格
  completions: 6                             # 总共需要完成的任务数
  parallelism: 2                             # 同时运行的任务数
  template:                                  # 定义 Pod 的模板
    spec:                                    # Pod 的详细配置
      containers:                            # 定义容器列表
      - name: pi                             # 容器的名称
        image: perl:5.34.0                   # 使用的容器镜像
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]  # 容器启动时执行的命令,计算 π 的 2000 位
      restartPolicy: Never                   # Pod 的重启策略,设置为 Never 表示失败后不重启
  backoffLimit: 4                            # 最大重试次数
应用 Job 配置
kubectl apply -f job.yml
关于重启策略的说明
  • OnFailure:Pod 出现故障时重启容器,但不会创建新的 Pod。

  • Never:Pod 出现故障时创建新的 Pod,故障 Pod 不会消失。

  • Always:Pod 会一直重启,任务会重复执行。


七、CronJob 控制器

7.1 CronJob 功能

CronJob 是基于时间调度的 Job 控制器,类似于 Linux 的定时任务。它可以按照指定的时间表运行 Job,支持周期性任务的执行。

7.2 CronJob 示例

创建 CronJob
# cronjob.yml
apiVersion: batch/v1                         # 使用 Kubernetes batch/v1 API 版本
kind: CronJob                                # 资源类型为 CronJob
metadata:                                    # 定义 CronJob 的元数据
  name: hello                                # CronJob 的名称
spec:                                        # 定义 CronJob 的规格
  schedule: "* * * * *"                      # 定义任务的执行时间表,这里是每分钟执行一次
  jobTemplate:                               # 定义 Job 的模板
    spec:                                    # 定义 Job 的规格
      template:                              # 定义 Pod 的模板
        spec:                                # Pod 的详细配置
          containers:                        # 定义容器列表
          - name: hello                      # 容器的名称
            image: busybox                   # 使用的容器镜像
            imagePullPolicy: IfNotPresent    # 镜像拉取策略,如果本地存在则不拉取
            command:                         # 容器启动时执行的命令
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster  # 打印当前时间和欢迎信息
          restartPolicy: OnFailure           # Pod 的重启策略,失败时重启
应用 CronJob 配置
kubectl apply -f cronjob.yml

你可能感兴趣的:(kubernetes,容器,云原生)