Pod
Pod是Kubernetes中的基本单位。容器本身不会直接分配到主机上,而会封装到名为Pod的对象中。Kubernetes以Pod为最小单位进行调度、伸缩并共享资源、管理生命周期。
Pod通常表示单个应用程序,由一个或多个关系紧密的容器构成,这些容器拥有同样的生命周期,作为一个整体一起编排到Node上。这些容器共享环境、存储卷(volume)和IP空间。尽管Pod基于一个或多个容器,但应将Pod视作一个单一的整体、单独的应用程序。
Pod模板
在创建Pod时,需要定义一个模板文件(.yml文件),并将其称为Pod模板。可以用Pod模板来定义资源,以下是Pod模板的主要内容及对应说明:
1 |
|
控制器——Pod的管理
一般来说,用户不会直接创建Pod,而是创建控制器,让控制器来管理Pod。在控制器中定义Pod的部署方式,如有多少个副本、需要在哪种Node上运行等。根据不同的业务场景,Kubernetes提供了多种控制器。
Deployment 控制器(部署)
Deployment控制器是最常用的工作负载对象之一。
在使用Kubernetes时,通常要管理由多个相同Pod所组成的Pod集合,而不是单个Pod。通过Deployment控制器,可以定义Pod模板,并设置相应控制参数以实现水平伸缩,以调节正在运行的相同Pod数。
Deployment控制器保证在集群中部署的Pod数量和配置中的Pod数量一致。若Pod或主机出现故障,则会自动启用新的Pod进行补充。
创建Deployment 控制器也需要定义一个模板文件(.yml文件)。可以用Deployment控制器的模板来定义资源,以下是模板的主要内容及对应说明:
1 |
|
DaemonSet 控制器(有状态副本集)
DaemonSet 控制器是一种特殊的Pod控制器,会在集群中的各个节点上运行单一的Pod副本。它非常适合部署那些为节点本身提供服务或执行维护的Pod。如对于日志收集和转发、监控以及运行以增加节点本身功能为目的的服务都使用DaemonSet 控制器。
DaemonSet 控制器的一些典型用法包括但不限于以下几种:
- 运行集群存储Daemon控制器,如在每个Node上运行glusterd、ceph。
- 在每个Node上运行日志收集Daemon控制器,如Fluentd、logstash。
- 在每个Node上运行监控Daemon控制器,如Prometheus Node Exporter、collectd、Datadog代理、New Relic代理或Ganglia gmond。
创建DaemonSet 控制器的模板与Deployment控制器的模板相同
Job与CronJob控制器
Job工作负载
Job的工作负载对象基于某一特定任务而运行,当运行任务的容器完成工作后,就会成功退出。若需要执行一次性任务,而非提供连续的服务,则适合创建job工作负载。
Job控制器可以执行3种类型的任务:
一次性任务:通常只会启动一个Pod(除非Pod失败)。一旦Pod成功终止,Job就算完成了。其模板如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: batch/v1 # 使用的API版本,V1表示使用稳定版本
kind: Job # 要创建的资源对象,这里为关键字Job
metadata: # 表示该资源对象的元数据,一个资源对象可拥有多个元数据。表示资源的标识信息
name: String # 元数据,必填,Job工作负载的名字
spec:
template: # 必填,Pod模板,它与Pod具有完全相同的结构,不过他是嵌套的,且不需要带apiVersion或kind字段
spec:
activeDeadlineSeconds: int # 指定执行任务的上限时间(单位为秒),超时时任务将强制终止并删除
ttlSecondsAfterFinished: int # 用于确定在所有任务执行完成后,需要等待多少秒才可删除Job,默认关闭
restartPolicy: [Never|OnFailure]
containers:
- name: String
image: String
imagePullPolicy:
command: [String]
- --feature-gates=TTLSecondsAfterFinished=true # 手动开启自动删除Job功能
args: [String]串行式任务:连续、多次地执行某一任务。当上一个任务完成时,接着执行下一个任务,直到全部任务执行完,可以通过spec.completions属性指定执行次数。其模板如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: batch/v1 # 使用的API版本,V1表示使用稳定版本
kind: Job # 要创建的资源对象,这里为关键字Job
metadata: # 表示该资源对象的元数据,一个资源对象可拥有多个元数据。表示资源的标识信息
name: String # 元数据,必填,Job工作负载的名字
spec:
activeDeadlineSeconds: int # 指定执行任务的上限时间(单位为秒),超时时任务将强制终止并删除
completions: int # 设置任务执行次数
template: # 必填,Pod模板,它与Pod具有完全相同的结构,不过他是嵌套的,且不需要带apiVersion或kind字段
spec:
restartPolicy: [Never|OnFailure]
containers:
- name: String
image: String
imagePullPolicy:
command: [String]
args: [String]
并行式任务:同一时间并发多次执行任务。可以通过spec.parallelism属性指定并发数,也可以配合spec.completions属性指定总任务的执行次数。其模板如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: batch/v1 # 使用的API版本,V1表示使用稳定版本
kind: Job # 要创建的资源对象,这里为关键字Job
metadata: # 表示该资源对象的元数据,一个资源对象可拥有多个元数据。表示资源的标识信息
name: String # 元数据,必填,Job工作负载的名字
spec:
activeDeadlineSeconds: int # 指定执行任务的上限时间(单位为秒),超时时任务将强制终止并删除
completions: int # 设置任务执行次数
parallelism: int # 设置任务并行数
template: # 必填,Pod模板,它与Pod具有完全相同的结构,不过他是嵌套的,且不需要带apiVersion或kind字段
spec:
restartPolicy: [Never|OnFailure]
containers:
- name: String
image: String
imagePullPolicy:
command: [String]
args: [String]
CronJob控制器
CronJob控制器是在Job的基础上增加了时间调度,可以在给定的时间点运行一个任务,也可以定期地运行。
通过CronJob控制器,可以实现以下类型的Job:
- 在未来的某个指定时间执行一次Job,例如某项临时任务
- 周期性地运行Job,例如,定期备份,发送邮件等
CronJob控制器的模板如下所示:
1 |
|