当前位置: 首页 > news >正文

网站开发公司排行/今日的新闻

网站开发公司排行,今日的新闻,短域名生成,建设一个网站需要些什么材料在前面的几篇文章中,我和你详细分享了 Deployment、StatefulSet,以及 DaemonSet 这三个编排概念。你有没有发现它们的共同之处呢? 实际上,它们主要编排的对象,都是“在线业务”,即:Long Runnin…

在前面的几篇文章中,我和你详细分享了 Deployment、StatefulSet,以及 DaemonSet 这三个编排概念。你有没有发现它们的共同之处呢?

实际上,它们主要编排的对象,都是“在线业务”,即:Long Running Task(长作业)。比如,我在前面举例时常用的 Nginx、Tomcat,以及 MySQL 等等。这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直保持在 Running 状态。

但是,有一类作业显然不满足这样的条件,这就是“离线业务”,或者叫作 Batch Job(计算业务)。这种业务在计算完成后就直接退出了而此时如果你依然用 Deployment 来管理这种业务的话,就会发现 Pod 会在计算结束后退出,然后被 Deployment Controller 不断地重启;而像“滚动更新”这样的编排功能,更无从谈起了。 

所以,早在 Borg 项目中,Google 就已经对作业进行了分类处理,提出了 LRS(Long Running Service)和 Batch Jobs 两种作业形态,对它们进行“分别管理”和“混合调度”。

不过,在 2015 年 Borg 论文刚刚发布的时候,Kubernetes 项目并不支持对 Batch Job 的管理。直到 v1.4 版本之后,社区才逐步设计出了一个用来描述离线业务的 API 对象,它的名字就是:Job。

Job API 对象的定义非常简单,我来举个例子,如下所示:

apiVersion: batch/v1
kind: Job
metadata:name: pi
spec:template:spec:containers:- name: piimage: resouer/ubuntu-bc command: ["sh", "-c", "echo 'scale=10000; 4*a(1)' | bc -l "]restartPolicy: NeverbackoffLimit: 4

此时,相信你对 Kubernetes 的 API 对象已经不再陌生了。在这个 Job 的 YAML 文件里,你肯定一眼就会看到一位“老熟人”:Pod 模板,即 spec.template 字段。

在这个 Pod 模板中,我定义了一个 Ubuntu 镜像的容器(准确地说,是一个安装了 bc 命令的 Ubuntu 镜像),它运行的程序是:

echo "scale=10000; 4*a(1)" | bc -l 

其中,bc 命令是 Linux 里的“计算器”;-l 表示,我现在要使用标准数学库;而 a(1),则是调用数学库中的 arctangent 函数,计算 atan(1)。这是什么意思呢?

中学知识告诉我们:tan(π/4) = 1。所以,4*atan(1)正好就是π,也就是 3.1415926…。

所以,这其实就是一个计算π值的容器。而通过 scale=10000,我指定了输出的小数点后的位数是 10000。在我的计算机上,这个计算大概用时 1 分 54 秒。

但是,跟其他控制器不同的是,Job 对象并不要求你定义一个 spec.selector 来描述要控制哪些 Pod。具体原因,我马上会讲解到。

现在,我们就可以创建这个 Job 了:

$ kubectl create -f job.yaml

在成功创建后,我们来查看一下这个 Job 对象,如下所示:

$ kubectl describe jobs/pi
Name:             pi
Namespace:        default
Selector:         controller-uid=c2db599a-2c9d-11e6-b324-0209dc45a495
Labels:           controller-uid=c2db599a-2c9d-11e6-b324-0209dc45a495job-name=pi
Annotations:      <none>
Parallelism:      1
Completions:      1
..
Pods Statuses:    0 Running / 1 Succeeded / 0 Failed
Pod Template:Labels:       controller-uid=c2db599a-2c9d-11e6-b324-0209dc45a495job-name=piContainers:...Volumes:              <none>
Events:FirstSeen    LastSeen    Count    From            SubobjectPath    Type        Reason            Message---------    --------    -----    ----            -------------    --------    ------            -------1m           1m          1        {job-controller }                Normal      SuccessfulCreate  Created pod: pi-rq5rl

可以看到,这个 Job 对象在创建后,它的 Pod 模板,被自动加上了一个 controller-uid=< 一个随机字符串 > 这样的 Label。而这个 Job 对象本身,则被自动加上了这个 Label 对应的 Selector,从而 保证了 Job 与它所管理的 Pod 之间的匹配关系。

而 Job Controller 之所以要使用这种携带了 UID 的 Label,就是为了避免不同 Job 对象所管理的 Pod 发生重合。需要注意的是,这种自动生成的 Label 对用户来说并不友好,所以不太适合推广到 Deployment 等长作业编排对象上。

接下来,我们可以看到这个 Job 创建的 Pod 进入了 Running 状态,这意味着它正在计算 Pi 的值。

$ kubectl get pods
NAME                                READY     STATUS    RESTARTS   AGE
pi-rq5rl                            1/1       Running   0          10s

而几分钟后计算结束,这个 Pod 就会进入 Completed 状态:

$ kubectl get pods
NAME                                READY     STATUS      RESTARTS   AGE
pi-rq5rl                            0/1       Completed   0          4m

这也是我们需要在 Pod 模板中定义 restartPolicy=Never 的原因:离线计算的 Pod 永远都不应该被重启,否则它们会再重新计算一遍。 

事实上,restartPolicy 在 Job 对象里只允许被设置为 Never 和 OnFailure;而在 Deployment 对象里,restartPolicy 则只允许被设置为 Always。

此时,我们通过 kubectl logs 查看一下这个 Pod 的日志,就可以看到计算得到的 Pi 值已经被打印了出来:

$ kubectl logs pi-rq5rl
3.141592653589793238462643383279...

这时候,你一定会想到这样一个问题,如果这个离线作业失败了要怎么办?

比如,我们在这个例子中定义了 restartPolicy=Never,那么离线作业失败后 Job Controller 就会不断地尝试创建一个新 Pod,如下所示:

$ kubectl get pods
NAME                                READY     STATUS              RESTARTS   AGE
pi-55h89                            0/1       ContainerCreating   0          2s
pi-tqbcz                            0/1       Error               0          5s

可以看到,这时候会不断地有新 Pod 被创建出来。

当然,这个尝试肯定不能无限进行下去。所以,我们就在 Job 对象的 spec.backoffLimit 字段里定义了重试次数为 4(即,backoffLimit=4),而这个字段的默认值是 6。

需要注意的是,Job Controller 重新创建 Pod 的间隔是呈指数增加的,即下一次重新创建 Pod 的动作会分别发生在 10 s、20 s、40 s …后。

而如果你定义的 restartPolicy=OnFailure,那么离线作业失败后,Job Controller 就不会去尝试创建新的 Pod。但是,它会不断地尝试重启 Pod 里的容器。这也正好对应了 restartPolicy 的含义。

如前所述,当一个 Job 的 Pod 运行结束后,它会进入 Completed 状态。但是,如果这个 Pod 因为某种原因一直不肯结束呢?

在 Job 的 API 对象里,有一个 spec.activeDeadlineSeconds 字段可以设置最长运行时间,比如:

spec:backoffLimit: 5activeDeadlineSeconds: 100

 一旦运行超过了 100 s,这个 Job 的所有 Pod 都会被终止。并且,你可以在 Pod 的状态里看到终止的原因是 reason: DeadlineExceeded。

http://www.lbrq.cn/news/1549585.html

相关文章:

  • idc销售网站php源码/seo优化工具软件
  • 电子商务网站建设的毕业论文/360关键词推广
  • 女做受网站/免费推广引流怎么做
  • 孝感58同城网站建设/百度竞价包年推广是怎么回事
  • 个人网站怎么做支付功能/2024最火的十大新闻
  • 南部县人民医院搬迁/优化一个网站需要多少钱
  • b2c平台网站建设/企业推广公司
  • 网站兼容手机/互联网广告推广好做吗
  • wordpress 无法登入/天津seo选天津旗舰科技a
  • 免费网站建设程序/百度推广点击软件
  • 湖南昌华建设集团网站/关键词seo排名优化软件
  • 外贸公司网站模板免费/某网站seo诊断分析
  • 网站备案法律法规/培训学校管理制度大全
  • 淮北网站建设制作/google付费推广
  • 重庆工程信息网官网首页/seo投放
  • 平台小程序/seo和sem推广
  • 品牌网站建设怎么收费/2021年关键词有哪些
  • 建筑工程挂网甩浆/seo免费工具
  • 京东联盟的网站怎么做的/电商数据分析
  • 网站前后端用什么软件做/深圳今天重大事件新闻
  • 前端做的好的网站/seo矩阵培训
  • 广东企业网站seo点击软件/百度竞价排名一年费用
  • 淘宝网网站开发部技术部/百度竞价广告怎么投放
  • 什么样的网站需要改版/nba最新交易汇总实时更新
  • 在线学做衣服 的网站/会员营销
  • 网站建设服务费属于/活动推广宣传方案
  • 买国外空间哪个网站好/热搜榜百度一下你就知道
  • 沂水网站建设/培训网站设计
  • 免费建站推广/网络开发
  • 如何做优化网站的原创性文章/嘉兴关键词优化报价
  • Less (CSS 预处理器)
  • 解锁 JavaScript 高级技能:从基础到实战的进阶指南
  • 【OLAP】trino安装和基本使用
  • 编程算法实例-Armstrong数(阿姆斯特朗数)
  • 生成模型实战 | InfoGAN详解与实现
  • (一)React企业级后台(Axios/localstorage封装/动态侧边栏)