[復刻版]スクラッチエントリK8S:アプリケーションのスケジューリングと管理:仕事&DaemonSet

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

 
HTTPS:// www.infoq.cn/article/KceOuuS7somCYbfuykRG

 

読み込み:193 08時位置を2019年10月2日に

 

、仕事

需要元

仕事の背景に関する質問

まず、仕事の要求のソースを見てください。私たちは、私たちが直接タスクポッドプロセスを実行することができ、最小単位がポッド予定されている、内部K8Sを知っています。そうすることで、以下の質問が生成されます。

  • どのように我々は、ポッドプロセスの右端を確保するのですか?

  • どのプロセスが失敗の再試行を実行することを確認するには?

  • どのように複数のタスクを管理し、タスク間の依存関係がありますか?

  • どのように並列タスクで実行され、管理タスクは、サイズをキューイングするには?

職業:管理タスクコントローラ

私たちは、仕事のKubernetesが私たちのための機能を提供するものを見て:

  • ジョブの最初のkubernetesは、正常に実行または終了監視することができるかどうか番号を指定するために1つまたは複数のポッドポッドを作成できる管理タスクコントローラです。

  • 私たちは、モードをリセットすることができ、状況に応じて仕事ポッドへの再試行回数を設定します。

  • 我々はまた、タスクの実行が完了した後、次のタスクの再実行を確保するために、関係に頼ることができます。

  • しかし、また、並列動作完了時間と全体的な大きさを確保ポッドの間の並列度に応じて、タスクの並列処理を制御することができます。

ユースケースの解釈

私たちは、ビューのポイントを次の例に従った業務アプリケーションを完成する方法を見て。

ジョブの文法

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

図は、これは実際には内部ジョブコントローラのタイプで、これは主に仕事と呼ばれる新しい種類の紹介です、仕事フォーム最も単純なYAMLの仕事です。その後、実際にスペックのポッドで、次のspec.templateを名前のジョブを指定するには、名前の内側にメタデータ。

内容は同じである内側これは、2つのだけより多くのポイントです。

  • 最初は、私たちが仕事を決して、ONFAILURE、常に3回のリトライ戦略を設定することが可能なrestartPolicy、あります。あなたは再び、ONFAILUREすることができますもう一度試して失敗した実行したいとき;かかわらずなかれ時間や再放送のいずれかの状況下で仕事を私たちは決して使用することはできません、期待して再実行する必要があります。

  • また、実行時の仕事は無限の再試行に行くことができないので、私たちは再試行の回数を制御するためのパラメータを必要としています。このbackoffLimitを再試行できる回数を最後に仕事を確保することです。

ジョブだから、内部では、私たちの主な焦点は、restartPolicy再起動の戦略であるとbackoffLimitの数が制限値を再試行してください。

ジョブステータス

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

ジョブの作成が完了した後、我々は、ジョブの現在の動作ステータスを表示するには、ジョブには、このコマンドを取得kubectlことができます。内部の結果の値は、基本的な仕事の名前があり、完成ポッドの現在の数は、長かったです。

AGEは、現在の時刻を引いそれが作成された時点から数えて、このポッドの意味を指します。時間の長さは、主にあなたの前に作成したどのくらいポッド、ポッドの歴史を伝えるために使用されています。DURATIONは、主に私たちの時間のパフォーマンスチューニングは、このパラメータは非常に有用であろうどのくらいの最後に実際の業務の内側に私たちの仕事を参照してください。補完は、それがその後、状態の数を完了したポッド、いくつかの合計、内部の私たちの主な使命を見て、このフィールドに表示されます内側ください。

ビューポッド

ここでは、ジョブの最後の実行ユニットまたはポッド、実際には、ポッドを見てください。我々だけジョブ「PI」ポッドと呼ばれるものを作成する作成、タスクは円周の比率を計算することで、ポッド名が「になりJ O B - N- m個のE -ジョブ-名- {ランダムサフィックス}」我々はYAMLフォーマット下のポッドで見ることができます。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

它比普通的 Pod 多了一个叫 ownerReferences,这个东西来声明此 pod 是归哪个上一层 controller 来管理。可以看到这里的 ownerReferences 是归 batch/v1,也就是上一个 Job 来管理的。这里就声明了它的 controller 是谁,然后可以通过 pod 返查到它的控制器是谁,同时也能根据 Job 来查一下它下属有哪些 Pod。

并行运行 Job

我们有时候有些需求:希望 Job 运行的时候可以最大化的并行,并行出 n 个 Pod 去快速地执行。同时,由于我们的节点数有限制,可能也不希望同时并行的 Pod 数过多,有那么一个管道的概念,我们可以希望最大的并行度是多少,Job 控制器都可以帮我们来做到。

这里主要看两个参数:一个是 completions,一个是 parallelism。

  • 首先第一个参数是用来指定本 Pod 队列执行次数。可能这个不是很好理解,其实可以把它认为是这个 Job 指定的可以运行的总次数。比如这里设置成 8,即这个任务一共会被执行 8 次;

  • 第二个参数代表这个并行执行的个数。所谓并行执行的次数,其实就是一个管道或者缓冲器中缓冲队列的大小,把它设置成 2,也就是说这个 Job 一定要执行 8 次,每次并行 2 个 Pod,这样的话,一共会执行 4 个批次。

查看并行 Job 运行

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

下面来看一下它的实际运行效果,上图就是当这个 Job 整体运行完毕之后可以看到的效果,首先看到 job 的名字,然后看到它一共创建出来了 8 个 pod,执行了 2 分 23 秒,这是创建的时间。

接着来看真正的 pods,pods 总共出来了 8 个 pod,每个 pod 的状态都是完成的,然后来看一下它的 AGE,就是时间。从下往上看,可以看到分别有 73s、40s、110s 和 2m26s。每一组都有两个 pod 时间是相同的,即:时间段是 40s 的时候是最后一个创建、 2m26s 是第一个创建的。也就是说,总是两个 pod 同时创建出来,并行完毕、消失,然后再创建、再运行、再完毕。

比如说,刚刚我们其实通过第二个参数来控制了当前 Job 并行执行的次数,这里就可以了解到这个缓冲器或者说管道队列大小的作用。

Cronjob 语法

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

下面来介绍另外一个 Job,叫做 CronJob,其实也可以叫定时运行 Job。CronJob 其实和 Job 大体是相似的,唯一的不同点就是它可以设计一个时间。比如说可以定时在几点几分执行,特别适合晚上做一些清理任务,还有可以几分钟执行一次,几小时执行一次等等,这就叫定时任务。

定时任务和 Job 相比会多几个不同的字段:

  • schedule:schedule 这个字段主要是设置时间格式,它的时间格式和 Linux 的 crontime 是一样的,所以直接根据 Linux 的 crontime 书写格式来书写就可以了。举个例子: */1 指每分钟去执行一下 Job,这个 Job 需要做的事情就是打印出大约时间,然后打印出“Hello from the kubernetes cluster” 这一句话;

  • startingDeadlineSeconds:即:每次运行 Job 的时候,它最长可以等多长时间,有时这个 Job 可能运行很长时间也不会启动。所以这时,如果超过较长时间的话,CronJob 就会停止这个 Job;

  • concurrencyPolicy:就是说是否允许并行运行。所谓的并行运行就是,比如说我每分钟执行一次,但是这个 Job 可能运行的时间特别长,假如两分钟才能运行成功,也就是第二个 Job 要到时间需要去运行的时候,上一个 Job 还没完成。如果这个 policy 设置为 true 的话,那么不管你前面的 Job 是否运行完成,每分钟都会去执行;如果是 false,它就会等上一个 Job 运行完成之后才会运行下一个;

  • JobsHistoryLimit:这个就是每一次 CronJob 运行完之后,它都会遗留上一个 Job 的运行历史、查看时间。当然这个额不能是无限的,所以需要设置一下历史存留数,一般可以设置默认 10 个或 100 个都可以,这主要取决于每个人集群不同,然后根据每个人的集群数来确定这个时间。

操作演示

Job 的编排文件

下面看一下具体如何使用 Job。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

Job 的创建及运行验证

首先看一下 job.yaml。这是一个非常简单的计算 pi 的一个任务。使用 kubectl creat-f job.yaml,这样 job 就能提交成功了。来看一下 kubectl.get.jobs,可以看到这个 job 正在运行;get pods 可以看到这个 pod 应该是运行完成了,那么接下来 logs 一下这个 job 以及 pod。可以看到下图里面打印出来了圆周率。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

并行 Job 的编排文件

下面再来看第二个例子:

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

并行 Job 的创建及运行验证

这个例子就是指刚才的并行运行 Job 创建之后,可以看到有第二个并行的 Job。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

现在已经有两个 Pod 正在 running,可以看到它大概执行了快到 30s。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

30s 之后它应该会起第二个。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

第一批的 pod 已经执行完毕,第二批的 pod 正在 running,每批次分别是两个 Pod。也就是说后面每隔 40s 左右,就会有两个 pod 在并行执行,它一共会执行 4 批,共 8 个 pod,等到所有的 pod 执行完毕,就是刚才所说的并行执行的缓冲队列功能。

过一段时间再看这个 pods,可以发现第二批已经执行结束,接下来开始创建第三批······

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

Cronjob 的编排文件

下面来看第三个例子 —— CronJob。 CronJob 是每分钟执行一次,每次一个 job。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

Cronjob 的创建及运行验证

如下图 CronJob 已经创建了,可以通过 get cronjob 来看到当前有一个 CronJob,这个时候再来看 jobs,由于它是每分钟执行一次,所以得稍微等一下。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

同时可以看到,上一个 job 还在运行,它的时间是 2m12s 左右,它的完成度是 7/8、6/8,刚刚看到 7/8 到 8/8,也就是说我们上一个任务执行了最后一步,而且每次都是两个两个地去运行。每次两个运行的 job 都会让我们在运行一些大型工作流或者工作任务的时候感到特别的方便。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

上图中可以看到突然出现了一个 job,“hello-xxxx”这个 job 就是刚才所说的 CronJob。它距离刚才 CronJob 提交已经过去 1 分钟了,这样就会自动创建出来一个 job,如果不去干扰它的话,它以后大概每一分钟都会创建出来这么一个 job,除非等我们什么时候指定它不可以再运行的时候它才会停止创建。

在这里 CronJob 其实主要是用来运作一些清理任务或者说执行一些定时任务。比如说 Jenkins 构建等方面的一些任务,会特别有效。

架构设计

Job 管理模式

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

我们来看一下 job 的架构设计。Job Controller 其实还是主要去创建相对应的 pod,然后 Job Controller 会去跟踪 Job 的状态,及时地根据我们提交的一些配置重试或者继续创建。同时我们刚刚也提到,每个 pod 会有它对应的 label,来跟踪它所属的 Job Controller,并且还去配置并行的创建, 并行或者串行地去创建 pod。

Job 控制器

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

上图是一个 Job 控制器的主要流程。所有的 job 都是一个 controller,它会 watch 这个 API Server,我们每次提交一个 Job 的 yaml 都会经过 api-server 传到 ETCD 里面去,然后 Job Controller 会注册几个 Handler,每当有添加、更新、删除等操作的时候,它会通过一个内存级的消息队列,发到 controller 里面。

通过 Job Controller 检查当前是否有运行的 pod,如果没有的话,通过 Scale up 把这个 pod 创建出来;如果有的话,或者如果大于这个数,对它进行 Scale down,如果这时 pod 发生了变化,需要及时 Update 它的状态。

同时要去检查它是否是并行的 job,或者是串行的 job,根据设置的配置并行度、串行度,及时地把 pod 的数量给创建出来。最后,它会把 job 的整个的状态更新到 API Server 里面去,这样我们就能看到呈现出来的最终效果了。

二、DaemonSet

需求来源

DaemonSet 背景问题

下面介绍第二个控制器:DaemonSet。同样的问题:如果我们没有 DaemonSet 会怎么样?下面有几个需求:

  • 首先如果希望每个节点都运行同样一个 pod 怎么办?

  • 如果新节点加入集群的时候,想要立刻感知到它,然后去部署一个 pod,帮助我们初始化一些东西,这个需求如何做?

  • 如果有节点退出的时候,希望对应的 pod 会被删除掉,应该怎么操作?

  • 如果 pod 状态异常的时候,我们需要及时地监控这个节点异常,然后做一些监控或者汇报的一些动作,那么这些东西运用什么控制器来做?

DaemonSet:守护进程控制器

DaemonSet 也是 Kubernetes 提供的一个 default controller,它实际是做一个守护进程的控制器,它能帮我们做到以下几件事情:

  • 首先能保证集群内的每一个节点都运行一组相同的 pod;

  • 同时还能根据节点的状态保证新加入的节点自动创建对应的 pod;

  • 在移除节点的时候,能删除对应的 pod;

  • 而且它会跟踪每个 pod 的状态,当这个 pod 出现异常、Crash 掉了,会及时地去 recovery 这个状态。

用例解读

DaemonSet 语法

下面举个例子来看一下,DaemonSet.yaml 会稍微长一些。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

首先是 kind:DaemonSet。如果之前学过 deployment,其实我们再看这个 yaml 会比较简单。例如它会有 matchLabel,通过 matchLabel 去管理对应所属的 pod,这个 pod.label 也要和这个 DaemonSet.controller.label 想匹配,它才能去根据 label.selector 去找到对应的管理 Pod。下面 spec.container 里面的东西都是一致的。

这里用 fluentd 来做例子。DaemonSet 最常用的点在于以下几点内容:

  • 首先是存储,GlusterFS 或者 Ceph 之类的东西,需要每台节点上都运行一个类似于 Agent 的东西,DaemonSet 就能很好地满足这个诉求;

  • 另外,对于日志收集,比如说 logstash 或者 fluentd,这些都是同样的需求,需要每台节点都运行一个 Agent,这样的话,我们可以很容易搜集到它的状态,把各个节点里面的信息及时地汇报到上面;

  • 还有一个就是,需要每个节点去运行一些监控的事情,也需要每个节点去运行同样的事情,比如说 Promethues 这些东西,也需要 DaemonSet 的支持。

查看 DaemonSet 状态

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

创建完 DaemonSet 之后,我们可以使用 kubectl get DaemonSet(DaemonSet 缩写为 ds)。可以看到 DaemonSet 返回值和 deployment 特别像,即它当前一共有正在运行的几个,然后我们需要几个,READY 了几个。当然这里面,READY 都是只有 Pod,所以它最后创建出来所有的都是 pod。

这里有几个参数,分别是:需要的 pod 个数、当前已经创建的 pod 个数、就绪的个数,以及所有可用的、通过健康检查的 pod;还有 NODE SELECTOR,因为 NODE SELECTOR 在 DaemonSet 里面非常有用。有时候我们可能希望只有部分节点去运行这个 pod 而不是所有的节点,所以有些节点上被打了标的话,DaemonSet 就只运行在这些节点上。比如,我只希望 master 节点运行某些 pod,或者只希望 Worker 节点运行某些 pod,就可以使用这个 NODE SELECTOR。

更新 DaemonSet

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

其实 DaemonSet 和 deployment 特别像,它也有两种更新策略:一个是 RollingUpdate,另一个是 OnDelete。

  • RollingUpdate 其实比较好理解,就是会一个一个的更新。先更新第一个 pod,然后老的 pod 被移除,通过健康检查之后再去见第二个 pod,这样对于业务上来说会比较平滑地升级,不会中断;

  • OnDelete 其实也是一个很好的更新策略,就是模板更新之后,pod 不会有任何变化,需要我们手动控制。我们去删除某一个节点对应的 pod,它就会重建,不删除的话它就不会重建,这样的话对于一些我们需要手动控制的特殊需求也会有特别好的作用。

操作演示

DaemonSet 的编排

下面举一个例子。比如说我们去改了些 DaemonSet 的镜像,然后看到了它的状态,它就会去一个一个地更新。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

上图这个就是刚才 DaemonSet 的 yaml,会比刚才会多一些, 我们做一些资源的限制,这个都不影响。

DaemonSet 的创建与运行验证

下面我们创建一下 DaemonSet ,然后再看一下它的状态。下图就是我们刚才看到的 DaemonSet 在 ready 里打出来的状态。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

从下图中可以看到,一共有 4 个 pod 被创建出来。为什么是 4 个 pod 呢?因为只有 4 个节点,所以每个节点上都会运行一个对应的 pod。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

DaemonSet 的更新

这时,我们来更新 DaemonSet, 执行完了 kubectl apply -f 后,它的 DaemonSet 就已经更新了。接下来我们去查看 DaemonSet 的更新状态。

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

上图中可以看到:DaemonSet 默认这个是 RollingUpdate 的,我们看到是 0-4,现在是 1-4,也就是说它在更新第一个,第一个更新完成会去更新第二个,第二个更新完,就更新第三个······这个就是 RollingUpdate。RollingUpdate 可以做到全自动化的更新,不用有人值守,而是一个一个地去自动更新,更新的过程也比较平滑,这样可以有利于我们在现场发布或者做一些其他操作。

上图结尾处可以看到,整个的 DaemonSet 已经 RollingUpdate 完毕。

架构设计

DaemonSet 管理模式

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

接下来看一下 DaemonSet 架构设计。DaemonSet 还是一个 controller,它最后真正的业务单元也是 Pod,DaemonSet 其实和 Job controller 特别相似,它也是通过 controller 去 watch API Server 的状态,然后及时地添加 pod。唯一不同的是,它会监控节点的状态,节点新加入或者消失的时候会在节点上创建对应的 pod,然后同时根据你配置的一些 affinity 或者 label 去选择对应的节点。

DaemonSet 控制器

スクラッチK8Sから開始:アプリケーションのスケジューリングと管理:仕事&DaemonSet

最后我们来看一下 DaemonSet 的控制器,DaemonSet 其实和 Job controller 做的差不多:两者都需要根据 watch 这个 API Server 的状态。现在 DaemonSet 和 Job controller 唯一的不同点在于,DaemonsetSet Controller 需要去 watch node 的状态,但其实这个 node 的状态还是通过 API Server 传递到 ETCD 上。

ときノードノード状態変化、それはメモリでメッセージキューを送信し、その後DaemonSetコントローラがこの状態になります見てますが、各ノードを見ているではない場合、対応するポッドは、作成に行きました。もちろん、それがあれば、それはバージョンを比較し、その後RollingUpdateを行うかどうか、今述べた追加、比較をしますか?そうでない場合、それは再びそれを行うだろうと、再作成し、Ondeleteはポッドを削除更新するかどうか、チェックするためにチェックしますか、または対応するポッドを作成します。

もちろん、最後の時間は、更新が終わった後に、すべての場合、それは完全な、APIサーバに移動最後の更新のすべてを全体DaemonSetのステータスを更新します

概要

  • 仕事&cronジョブの基本的な概念と分析の操作:このホワイトペーパーでは、詳細なプレゼンテーション内のすべてのノートをジョブとcronジョブの概念を導入し、ジョブcronジョブとジョブcronジョブのための一例として2実用的で、かつ様々な機能を使って説明します;

  • DaemonSet基本的な操作と概念の分析:アナロジーの展開コントローラによって、我々はワークフローと方法DaemonSetコントローラについて理解、および操作の概念とモードは、対応するアップデートをロールDaemonSetの知識を更新することもできます。

alibabaの物品は、マイクロチャネルパブリック番号(:Alicloudnative ID)の元の雲から再生しました。

関連読書:

スケジューリングと管理アプリケーション:スクラッチK8Sから開始

K8Sのアプリケーションスケジューリングと管理:スクラッチK8Sから開始

コメントポッドやコンテナのデザインパターン:スクラッチK8Sから開始

スクラッチK8Sから開始:基本的な概念K8Sコンテナを説明

詳細K8Sコアコンセプト:スクラッチK8Sから開始

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/11621564.html
おすすめ