其他工作负载

仅仅有RS或者Deployment往往是不够的,因此Kubernetes提供了一些其他的工作负载。

DaemonSet

在应用级别,常常使用守护进程为应用程序提供一些特殊服务。Kubernetes中,提供了DaemonSet用以提供Pod级别的服务。

DaemonSet可以保证在每个节点都拥有一个Pod的副本,当有新节点加入集群时,会自动为它们创建Pod副本,当节点从集群移出时,Pod也会被回收。

DaemonSet 的一些典型用法:

  • 在每个节点上运行集群守护进程
  • 在每个节点上运行日志收集守护进程
  • 在每个节点上运行监控守护进程

Demo

来自https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# this toleration is to have the daemonset runnable on master nodes
# remove it if your masters can't run pods
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers

格式

  • apiVersion: 创建该对象所使用的 Kubernetes API 的版本
  • kind: 必须准确写为DaemonSet
  • metadata: DadmonSet对象的元数据
  • spec: 配置信息
    • template: spec下的必须字段,对Pod模板进行描述,见ReplicaSetDeployment的.spec.template字段
      • restartPolicy: 容器重启策略,这个字段一定存在,且值为Always,这个值未指定时,它是默认值Always
    • selector: 匹配算符必须合理

Job

负责创建仅执行一次的Pods(这些Pods应该会在一定时间内退出),保证一个或多个Pods成功结束(返回0)。

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
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

格式

  • apiVersion: 创建该对象所使用的 Kubernetes API 的版本
  • kind: 必须准确写为Job。
  • spec: 描述信息。
    • template: 唯一的必须字段。
      • RestartPolicy: 重启策略,只能设置为Never或OnFailure之一。
    • parallelism: 一个非负整数,表示并行数量,默认值为1,如果这个值为0,那么在Job启动后便会被暂停,直至这个数增加。
    • completions: 正整数,用于指定应该成功完成的pod的数量,如果设置为nil,表示着任何pod的完成都意味着所有pod的成功,并允许并行度为任意正值。这个值默认为1,如果设置为1,那么并行度parallelism也会限制为1,且该pod的成功意味着Job的成功。

Job 的并行执行

适合以 Job 形式来运行的任务主要有三种:

  1. 非并行 Job:
    • 通常只启动一个 Pod,除非该 Pod 失败。
    • 当 Pod 成功终止时,立即视 Job 为完成状态。
  2. 具有确定完成计数的并行 Job:
    • .spec.completions 字段设置为非 0 的正数值。
    • Job 用来代表整个任务,当成功的 Pod 个数达到 .spec.completions 时,Job 被视为完成。
    • 当使用 .spec.completionMode="Indexed" 时,每个 Pod 都会获得一个不同的 索引值,介于 0 和 .spec.completions-1 之间。
  3. 带工作队列的并行 Job:
    • 不设置 spec.completions,默认值为 .spec.parallelism
    • 多个 Pod 之间必须相互协调,或者借助外部服务确定每个 Pod 要处理哪个工作条目。 例如,任一 Pod 都可以从工作队列中取走最多 N 个工作条目。
    • 每个 Pod 都可以独立确定是否其它 Pod 都已完成,进而确定 Job 是否完成。
    • 当 Job 中 任何 Pod 成功终止,不再创建新 Pod。
    • 一旦至少 1 个 Pod 成功完成,并且所有 Pod 都已终止,即可宣告 Job 成功完成。
    • 一旦任何 Pod 成功退出,任何其它 Pod 都不应再对此任务执行任何操作或生成任何输出。 所有 Pod 都应启动退出过程。

CronJob

CronJob 用于执行周期性的动作,例如备份、报告生成等。对Job的封装

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

格式

  • apiVersion: 创建该对象所使用的 Kubernetes API 的版本。
  • kind: 必须准确写为CronJob。
  • metadata: 元数据。
  • spec: 描述信息。
    • schedule: 什么时候被调度,时间表语法详见cronitor
    • jobTemplate: 被调度的Job的模板,但是没有apiVersion和kind,这里不再叙述。
    • concurrencyPolicy: 并行性规则,值必须是以下几个之一: “Allow”(默认值)表示允许并行执行,”Forbid”表示禁止并行执行,”Replace”表示取消当前Job并移除它,然后用一个新的Job替换掉它。
    • suspend: 挂起,如果为true,会告诉从controller暂停后续执行,但不会应用到已经开始的执行,主要用于暂停对CronJob的使用,这个值默认为假。
    • startingDeadlineSeconds: 以秒为单位的截止时间,超时的执行会被认为Job失败。

StatefulSets

StatefulSet 是用来管理有状态应用的工作负载 API 对象。

TODO: 完成这一章节

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
文章目录
  1. 1. DaemonSet
    1. 1.1. Demo
    2. 1.2. 格式
  2. 2. Job
    1. 2.1. Demo
    2. 2.2. 格式
    3. 2.3. Job 的并行执行
  3. 3. CronJob
    1. 3.1. Demo
    2. 3.2. 格式
  4. 4. StatefulSets
    1. 4.1. Demo
|