Kubernetes Cronjob的第一次使用

网友投稿 260 2022-09-29

Kubernetes Cronjob的第一次使用

背景

虽然用了好几年的kubernetes服务了。但是服务应用的类型一般都是deployments statefuset daemonset几种类型,至于job cronjob确实是没有怎么用过。现在正好有一个php应用的服务需要每五分钟执行一次,恰好可以去熟悉一个CronJob的使用!

首先还是复习一遍kubernetes 的workloads

参照:和 ReplicaSet (替换原来的资源 ReplicationController)。 Deployment 很适合用来管理你的集群上的无状态应用,Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被换掉。 StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pods。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。 DaemonSet 定义提供节点本地支撑设施的 Pods。这些 Pods 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某 DaemonSet 的规约匹配,则控制面会为该 DaemonSet 调度一个 Pod 到该新节点上运行。 Job 和 CronJob。 定义一些一直运行到结束并停止的任务。Job 用来表达的是一次性的任务,而 CronJob 会根据其时间规划反复运行。 第三方工作负载资源,通过 定制资源定义(CRD)添加第三方工作负载资源

---分割符Pods当然了以上的工作负载都最终管理的对象都是Pod,所以Pod该放在那里呢?Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元.Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。参照:镜像 php7.4 以上 需要安装gd mysql依赖2. 每五分钟运行一次

基础镜像构建

由于我php镜像都是与nginx打包在一起的。且这个应用就算一个纯php应用。就决定重新构建一个镜像,参照dockerhub:php:7.4-fpm RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd pdo_mysql mysqli

为了克服惰性,工作环境切换到linux了截图不方便就不上图了。镜像仓库使用了腾讯云的个人版仓库tcr(貌似前段时间都合并一起了,过去就是个人版仓库)构建镜像,并推送基础镜像到基础仓库:

docker build -t ccr.ccs.tencentyun.com/laya-master/php:7.4-fpm . docker push ccr.ccs.tencentyun.com/laya-master/php:7.4-fpm

jenkins pipeline流水线构建

when { environment name: 'XXXX', value: 'true' }

子项目文件夹下添加Dockerfile

FROM ccr.ccs.tencentyun.com/xxxx/php:7.4-fpm ADD html /var/www/html WORKDIR /var/构建上传镜像到镜像仓库

stage('docker build worldmap-job') { agent { label "build" } when { environment name: 'worldmap-job', value: 'true' } steps { sh " cd worldmap-job&&docker build -t ccr.ccs.tencentyun.com/xxxx/worldmap-job:$data ." withCredentials([usernamePassword(credentialsId: 'xxxx', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) { sh "docker login -u ${dockerUser} -p ${dockerPassword} ccr.ccs.tencentyun.com" sh "docker push ccr.ccs.tencentyun.com/xxxx/worldmap-job:$data" } } }

2. 部署应用

stage("develop worldmap-job") { when { environment name: 'worldmap-job', value: 'true' } steps { sh "sed -e 's/{data}/$data/g' /home/jenkins/workspace/yaml/develop/worldmap-job.tpl > /home/jenkins/workspace/yaml/develop/worldmap-job.yaml" sh "sed -e 's/{data}/$data/g' /home/jenkins/workspace/yaml/develop/worldmap-job.tpl > /home/jenkins/workspace/yaml/develop/worldmap-job.yaml" sh "sudo kubectl apply -f /home/jenkins/workspace/yaml/develop/worldmap-job.yaml --namespace=develop" sh "sudo kubectl apply -f /home/jenkins/workspace/yaml/develop/worldmap-job.yaml --namespace=develop" } }

注意我这里格式可能跟一般用户不一样,因为部署这里为用了并行 parallel 。参照:batch/v1 kind: CronJob metadata: name: worldmap-job spec: schedule: "*/5 * * * *" jobTemplate: spec: template: spec: containers: - name: worldmap-job image: ccr.ccs.tencentyun.com/xxxx/worldmap-job:{data} imagePullPolicy: IfNotPresent args: - /usr/local/bin/php - /var/www/html/DrawLandsMap.php - run_job - "6" envFrom: - configMapRef: name: deploy env: - name: PHP_MEM_LIMIT value: "256M" resources: requests: memory: "256M" cpu: "250m" limits: memory: "1024M" cpu: "2000m" imagePullSecrets: - name: tencent restartPolicy: OnFailure

关于几点要注意的:schedule   schedule: "/5 *"  ###5分钟执行一次imagePullPolicy  imagePullPolicy: IfNotPresent  ###imagePullPolicy自断貌似三必须的,我copy deployments的配置过来改的开始没有加这个貌似报错了args 执行脚本依然是 数要加引号强调envFrom 是我引用了configmap中的变量env 限制了php limitsesources 做了资源限制imagePullSecrets  镜像仓库secretrestartPolicy  容器重启策略now jenkins触发构建。登陆kubernetes集群验证:

[root@k8s-master-01 develop]# kubectl get cronjob -n develop NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE worldmap-job */5 * * * * False 0 2m36s 28h [root@k8s-master-01 develop]# kubectl get pods -n develop|grep world worldmap-job-27357635-274hp 0/1 Completed 0 12m worldmap-job-27357640-wb459 0/1 Completed 0 7m53s worldmap-job-27357645-cndb4 0/1 Completed 0 2m53s [root@k8s-master-01 develop]# kubectl get jobs --watch -n develop NAME COMPLETIONS DURATION AGE worldmap-job-27357635 1/1 11s 13m worldmap-job-27357640 1/1 11s 8m43s worldmap-job-27357645 1/1 12s 3m43s

貌似就是这样的,只现实当前最新的3个job当然了有兴趣的可以研究一下更改这个的数量?(successfulJobsHistoryLimit: 3) k可以修改一下。查看了一遍pod日志是正常的。还有job5分钟触发的时间是0 5 10这样依次的

一些自己想到的:

cronjob要做资源的限制 cronjob也可以挂载configmap 任务类型的应用可以尝试应用job or cronjob 镜像还是需要重新构建的,不同的应用。这样可以减少镜像的大小,减少漏洞的可能性

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Ceph概念及基本原理介绍
下一篇:SpringBoot设置动态定时任务的方法详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~