Kubernetes in Action笔记 - (7) DaemonSet、Job和CronJob
DaemonSet
DaemonSet 用于确保一个pod匹配它的选择器并在每个节点上运行。因此,它并没有期望的副本数的概念。
如果节点下线, DaemonSet不会在其他地方重新创建pod。 但是, 当将一个新节 点添加到集群中时, DaemonSet会立刻部署一个新的pod实例。
使用场景的例子:
- pod执行系统级别的与基础结构相关的操作。例如, 希望在每个节点上运行日志收集器和资源监控器。
- 另一个典型的例子是Kubemetes 自己的kube-proxy进程, 它需要运行在所有节点上才能使服务工作
可以通过 pod 模板中的 nodeSelector 属性让 DaemonSet 只在特定的节点上运行 pod。
apiVersion: apps/vlbeta2
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
# pod模板包含 会选择有disk=ssd标签的节点个节点选择器,
nodeSelector:
disk: ssd
containers:
- name: main
image: luksa/ssd-monitorJob
Job允许运行一种 pod, 该 pod 在内部进程成功结束时, 不重启容器。
在发生节点故障时,该节点上由 Job 管理的 pod 将按照 ReplicationSet 的 pod 的方式,重新安排到其他节点。 如果进程本身异常退出(进程返回错误退出代码时), 可以将 Job 配置为重新启动容器。
Job 对于临时任务很有用, 关键是任务要以正确的方式结束。需要明确地将重启策略设置为OnFa辽ure或Never,防止容器在完成任务时重新启动
apiVersion: batch/vl
kind: Job
metadata:
name: batch-job
spec:
template:
metadata:
labels:
app: batch-job
spec:
# Job 不能使用Always作为默认的重启策略
restartPolicy: OnFailure
containers:
- name: main
image: luksa/ssd-monitor作业可以配置为创建多个pod实例, 以并行或串行方式运行它们。这是通过在Job配置中设置 completions和paralletism属性来完成的。
如果需要一个Job顺序运行多次,则可以将completions设为希望运行的次数。Job将一个接一个地运行五个pod。它最初创建一个pod, 当pod的容器运行完成时,它创建第二个pod, 以此类推,直到五个pod成功完成。如果其中 一 个pod发生故障,工作会创建 一个新的pod, 所以Job总共可以创建五个以上的pod。
apiVersion: batch/vl
kind: Job
metadata:
name: multi-completion-batch-job
spec:
completions: 5
template:
...通过paralletism Job配置属性,指定允许多少个pod并行执行
apiVersion: batch/vl
kind: Job
metadata:
name: multi-completion-batch-job
spec:
completions: 5
paralletism: 2
template:
...可以在 Job 运行时更改 Job 的 parallelism 属性
kubectl scale job multi-completion-ba七ch-job --replicas 3通过在 pod 配置中设置 activeDeadlineSeconds 属性,可以限制 pod的时间。如果 pod 运行时间超过此时间, 系统将尝试终止 pod, 并将 Job 标记为失败。通过指定 Job manifest 中的 spec.backoff巨m辽字段, 可以配置 Job 在被标记为失败之前可以重试的次数。 如果没有明确指定它, 则默认为6。
CronJob
cron 任务通过创建 CronJob 资源进行配置。它可以通过配置项中的 jobTemplate 属性创建任务资源。
计划任务的运行方式:在计划的时间内,CronJob资源 会创建 Job资源,然后Job创建pod。
apiVersion: batch/vlbeta
kind: CronJob
metadata: cron-job-run-every-fifteen-minutes
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: periodic-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: main
image: luksa/batch-jobstartingDeadlineSeconds字段来指定截止日期。当Job或pod创建并运行得相对较晚的时候,任务将不会运行,并将显示为Failed。
在正常 情况下,CronJob总是为计划中配置的每个执行创建一个 Job, 但可能会同时创建两个Job, 或者根本没有创建。为了解决第一个问题,任务应该是幂等的(多次而不是一次运行不会得到不希望的结果)。对于第二个问题,请确保下一个任务运行完成本应该由上一次的(错过的)运行完成的任何工作。
图书资料: