本节概述一些常用工作负载,并介绍一些关键配置
工作负载是在 Kubernetes 上运行的应用程序,它们由各自的yaml文件来配置其运行规则,并使用 kubectl create 来创建
目录
Pod
Pod 是 Kubernetes 集群中的最小计算单元。代表集群中一组运行的容器,这些容器共享存储,网络。通常不会被直接创建(指 yaml 文件里写 kind:Pod 的方式),而是通过诸如 Deployment,DeamonSet 等控制器来创建。
- 通过其 yaml 中的 metadata.labels 来表明自己的标签(这相当重要,因为其他控制器以此作为判断标准该控制哪些 Pod )
- 通过其 yaml 中的 spec.containers 来表明内部的容器
生命周期
Pod 启示于 Pending 阶段,至少有一个主要容器正常启动,则进入 Running 阶段,然后根据Pod中的容器是正常结束还是失败终止而进入 Succeeded 或 Failed 阶段。
在 Pod 的生命周期里只会被调度一次。一旦 Pod 被调度到某一节点,会一直在该节点运行直到被删除。
Pod 不具备自愈性,节点失效,调度操作失败,节点资源耗尽都会导致 Pod 被删除。被“重新调度”的Pod是一个全新的 Pod。
Pod阶段
阶段 | 描述 |
---|---|
Pending(悬决) | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 |
Running(运行中) | Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 |
Succeeded(成功) | Pod 中的所有容器都已成功终止,并且不会再重启。 |
Failed(失败) | Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 |
Unknown(未知) | 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。 |
如果某节点死掉或者与集群中其他节点失联,Kubernetes 会实施一种策略,将失去的节点上运行的所有 Pod 的 phase 设置为 Failed。
容器状态
状态 | 描述 |
---|---|
Waiting(等待) | 容器仍在进行启动所需操作,kubectl descibe pod <podname>可查看等待原因。 |
Running(运行中) | 容器正常运行中,kubectl descibe pod <podname>可查看运行信息。 |
Terminated(已终止) | 容器正常结束或者因某些原因失败,kubectl descibe pod <podname>可查看原因,退出代码,起止时间。 |
ReplicaSet
ReplicaSet 是负责控制集群中Pod副本的稳定,如针对某类 Pod 指定副本数为3,即集群中同一时刻最多有三个这类 Pod。通常不会被直接创建,而是通过一个更高级的概念 Deployment 来管理
- 通过其 yaml 文件中 spec.replicas 的值来指定 Pod 副本数
- 通过其 yaml 文件中 spec.selector.matchLabels 的值来指定需要负责的 Pod
Deployment
Deployment 可为 ReplicaSet 和 Pod 提供声明式更新的能力。且用于无状态应用的管理(无状态指认为所有 Pod 平等,无需关心在哪个节点运行,随意扩容缩容等)
- 通过其 yaml 文件中 spec.template 来定义一个 Pod(真正创建 Pod 的描述)
- 与 ReplicaSet 一样关于副本的控制配置
- 通过其 yaml 文件中 spec.strategy 来指定 Pod 更新策略,有重新创建(先删除所有 Pod )和滚动更新(一批一批的更新)两种模式
StatefulSet
与 Deployment 类似,管理一组 Pod,不同的是 StatefulSet 是用于管理有状态 Pod 的(比如 zk 集群是一主多从,各个节点会有自己的数据),这种情况需要 Pod 重启后不管被分配到哪个 Node ,也要找到自己之前挂载的卷。
- StatefulSet 会为N个 Pod 副本分配唯一的序号,从0...N。这样做如果序号为3的 Pod 被删除,那重新创建的也是为序号3的 Pod。且 Pod 的主机名也根据此序号派生,保证网络稳定。
- 通过其 yaml 文件中 spec.serviceName 的值指定无头服务,可为Pod指定唯一服务名称
- 通过其 yaml 文件中 spec.volumeClaimTemplates 的值指定持久储存,可为Pod分别挂载一个存储(如果是 Deployment 中的 volumn,则是所有副本共享这个储存)
DaemonSet
DaemonSet 会保证一部分或所有节点上运行一个 Pod 副本,新节点加入,会为其添加 Pod,节点删除,Pod 回收。
- 可通过 Node 污点和 Pod 容忍度来控制 Pod 被调度到哪些节点上
Job
Job 会创建一个或多个 Pod 执行任务,并记录完成个数,当完成个数达到规定,即 Job 完成。
- 通过其 yaml 文件中 spec.completions 的值来指定期望完成个数
CronJob
CronJob 创建基于时间调度的 Jobs。通过 Cron 表达式来配置调度规则
- 通过其 yaml 文件中 spec.schedule 的值来编写 Cron 表达式
- 通过其 yaml 文件中 spec.jobTemplate 的来定义一个 Job