控制器是 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 是下一代的 Replication Controller,官方推荐使用。它支持基于集合的选择器,确保任何时间都有指定数量的 Pod 副本在运行。虽然 ReplicaSet 可以独立使用,但通常被 Deployment 用作协调 Pod 创建、删除和更新的机制。
参数名称 | 字段类型 | 参数说明 |
---|---|---|
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 | 定义容器镜像 |
# 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 # 使用的容器镜像
kubectl apply -f replicaset.yml
kubectl get pods --show-labels
kubectl label pod replicaset-l4xnr app=timinglee --overwrite
kubectl delete pods replicaset-t2s5p
kubectl delete -f replicaset.yml
Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的高级控制器。它通过声明式配置管理应用的部署过程,支持滚动更新、版本回滚、扩容和缩容等功能。
# 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 # 使用的容器镜像
分块详解:
apiVersion: apps/v1 # 使用 Kubernetes apps/v1 API 版本
kind: Deployment # 资源类型为 Deployment
apiVersion
:指定 Kubernetes API 的版本,apps/v1
是当前推荐的版本。
kind
:指定资源类型,这里是 Deployment
。
metadata: # 定义 Deployment 的元数据
name: deployment # Deployment 的名称
metadata
:包含资源的元数据,如名称、标签、注解等。
name
:资源的名称,必须是唯一的。
spec: # 定义 Deployment 的规格
replicas: 4 # 指定 Pod 的副本数量
spec
:定义资源的期望状态。
replicas
:指定 Pod 的副本数量,Kubernetes 会确保维持这个数量的 Pod 运行。
selector: # 定义选择器,用于匹配管理的 Pod
matchLabels: # 使用标签匹配 Pod
app: myapp # 匹配标签为 app=myapp 的 Pod
selector
:定义如何选择 Pod,通常通过标签匹配。
matchLabels
:指定 Pod 必须包含的标签,只有匹配这些标签的 Pod 才会被管理。
template: # 定义 Pod 的模板
metadata: # Pod 的元数据
labels: # Pod 的标签
app: myapp # 标签名称和值
template
:定义 Pod 的模板,用于创建新的 Pod。
metadata
:Pod 的元数据,通常包含标签。
labels
:Pod 的标签,这些标签会被用于选择器匹配。
spec: # Pod 的详细配置
containers: # 定义容器列表
- name: myapp # 容器的名称
image: myapp:v1 # 使用的容器镜像
spec
:定义 Pod 的详细配置。
containers
:定义 Pod 中的容器列表。
name
:容器的名称,必须是唯一的。
image
:容器使用的镜像,格式为 镜像名:版本
。
kubectl apply -f deployment.yml
kubectl get pods --show-labels
# 编辑 deployment.yml,将镜像版本从 myapp:v1 更新为 myapp:v2
kubectl apply -f deployment.yml
watch -n1 kubectl get pods -o wide
# 编辑 deployment.yml,将镜像版本从 myapp:v2 回滚到 myapp:v1
kubectl apply -f deployment.yml
# 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
kubectl rollout pause deployment deployment
# 编辑 deployment.yml,修改配置(例如镜像版本或资源限制)
kubectl rollout resume deployment deployment
DaemonSet 确保每个节点上运行一个 Pod 副本。当有新节点加入集群时,DaemonSet 会自动为新节点创建 Pod;当节点被移除时,Pod 也会被回收。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 # 使用的容器镜像
kubectl apply -f daemonset-example.yml
kubectl get pods -o wide
kubectl delete -f daemonset-example.yml
Job 是用于执行批处理任务的控制器,通常用于运行一次性的任务。Job 会创建一个或多个 Pod 来完成指定的任务,任务完成后 Pod 会自动退出。
# 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 # 最大重试次数
kubectl apply -f job.yml
OnFailure:Pod 出现故障时重启容器,但不会创建新的 Pod。
Never:Pod 出现故障时创建新的 Pod,故障 Pod 不会消失。
Always:Pod 会一直重启,任务会重复执行。
CronJob 是基于时间调度的 Job 控制器,类似于 Linux 的定时任务。它可以按照指定的时间表运行 Job,支持周期性任务的执行。
# 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 的重启策略,失败时重启
kubectl apply -f cronjob.yml