在 Kubernetes 中,控制器(Controller)是用来确保集群中 Pod 状态与期望状态一致的管理组件。以下是对 Deployment、DaemonSet、Job 和 CronJob 控制器的介绍及演示:
1. Deployment
简介:
Deployment 是用于管理无状态应用程序的控制器,它负责创建、更新和回滚 Pod 的集合。Deployment 会维护一个或多个副本(ReplicaSets),确保任何时候都有指定数量的 Pod 正在运行。
实战演示:
创建一个 Deployment,管理 3 个 nginx Pod 的副本:
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.19.10
ports:
- containerPort: 80
执行创建命令:
kubectl apply -f nginx-deployment.yaml
2. DaemonSet
简介:
DaemonSet 确保在每个(或选定的)节点上运行一个 Pod 的副本。主要用于运行守护进程,如日志收集器、监控代理等,这些进程需要在集群的每个节点上运行一个实例。
实战演示:
创建一个在每个节点上运行 fluentd 日志收集器的 DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-daemonset
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v1.12.4-debian-1.0
volumeMounts:
- name: varlog
mountPath: /var/log
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
执行创建命令:
kubectl apply -f fluentd-daemonset.yaml
3. Job
简介:
Job 是一种控制器,用于运行一次性任务,确保任务完成后 Pod 会被清理。Job 确保某个任务只执行一次,或者在一定时间内执行固定次数。
实战演示:
创建一个仅执行一次的任务 Job,运行一个打印欢迎消息的 Bash 脚本:
apiVersion: batch/v1
kind: Job
metadata:
name: welcome-job
spec:
completions: 1
parallelism: 1
backoffLimit: 4
template:
spec:
containers:
- name: welcome-container
image: ubuntu
command: ["bash", "-c", "echo 'Welcome to Kubernetes!' && sleep 10"]
restartPolicy: OnFailure
执行创建命令:
kubectl apply -f welcome-job.yaml
4. CronJob
简介:
CronJob 是基于时间计划触发 Job 的控制器,类似于 Unix cron 系统实用程序,用于定期执行任务。
实战演示:
创建一个每天凌晨 1 点执行的 CronJob,运行一个清理日志目录的脚本:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: log-cleanup
spec:
schedule: "0 1 * * *" # 每天凌晨1点执行(Cron 表达式)
jobTemplate:
spec:
template:
spec:
containers:
- name: log-cleaner
image: alpine
command: ["sh", "-c", "rm -rf /logs/*.log"] # 假设容器内有/logs目录
restartPolicy: OnFailure
执行创建命令:
kubectl apply -f log-cleanup-cronjob.yaml
以上四个控制器均可以通过 kubectl
命令行工具进行管理,如查看状态、更新配置、删除等操作。通过这些控制器,Kubernetes 可以有效地管理各种类型的容器化应用。