亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述Kubernetes Cronjob的第一次使用相关的知识,希望能为你提供帮助。
背景虽然用了好几年的kubernetes服务了。但是服务应用的类型一般都是deployments statefuset daemonset几种类型,至于job cronjob确实是没有怎么用过。现在正好有一个php应用的服务需要每五分钟执行一次,恰好可以去熟悉一个CronJob的使用!
首先还是复习一遍kubernetes 的workloads参照:https://kubernetes.io/zh/docs/concepts/workloads/
- Deployment 和 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 容器。
参照:https://kubernetes.io/zh/docs/concepts/workloads/pods/
Cronjob的第一次使用 明确一下需求1. 镜像 php7.4 以上 需要安装gd mysql依赖
2. 每五分钟运行一次
基础镜像构建由于我php镜像都是与nginx打包在一起的。且这个应用就算一个纯php应用。就决定重新构建一个镜像,参照dockerhub:https://registry.hub.docker.com/_/php
Dockerfile
FROM 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流水线构建流水线参照:https://duiniwukenaihe.blog.csdn.net/article/details/116661391
参照:stage 的单选多选问题
文章图片
pipeline做when 判断
when
environment name: XXXX, value: true
子项目文件夹下添加Dockerfile
FROM ccr.ccs.tencentyun.com/xxxx/php:7.4-fpm
ADD html /var/www/html
WORKDIR /var/www/html[
注:由于为这是git项目下增加了一个新的子文件目录并不是新项目就不写完整的pipeline只添加片段了!
1. 构建上传镜像到镜像仓库
stage(docker build worldmap-job)
agentlabel"build"
when
environment name: worldmap-job, value: truesteps
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: truesteps
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 。参照:https://duiniwukenaihe.blog.csdn.net/article/details/116661391
tpl模板文件worldmap-job.tpl
apiVersion: 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
关于几点要注意的:
scheduleschedule: " /5 *" ###5分钟执行一次
imagePullPolicyimagePullPolicy: IfNotPresent###imagePullPolicy自断貌似三必须的,我copy deployments的配置过来改的开始没有加这个貌似报错了
args 执行脚本依然是 数要加引号强调
envFrom 是我引用了configmap中的变量
env 限制了php limit
sesources 做了资源限制
imagePullSecrets镜像仓库secret
restartPolicy容器重启策略
nowjenkins触发构建。登陆kubernetes集群验证:
[root@k8s-master-01 develop]# kubectl get cronjob -n develop
NAMESCHEDULESUSPENDACTIVELAST SCHEDULEAGE
worldmap-job*/5 * * * *False02m36s28h
[root@k8s-master-01 develop]# kubectl get pods -n develop|grep world
worldmap-job-27357635-274hp0/1Completed012m
worldmap-job-27357640-wb4590/1Completed07m53s
worldmap-job-27357645-cndb40/1Completed02m53s
[root@k8s-master-01 develop]# kubectl get jobs --watch -n develop
NAMECOMPLETIONSDURATIONAGE
worldmap-job-273576351/111s13m
worldmap-job-273576401/111s8m43s
worldmap-job-273576451/112s3m43s
貌似就是这样的,只现实当前最新的3个job当然了有兴趣的可以研究一下更改这个的数量?(successfulJobsHistoryLimit: 3) k可以修改一下。查看了一遍pod日志是正常的。还有job5分钟触发的时间是0 5 10这样依次的
一些自己想到的:
- cronjob要做资源的限制
- cronjob也可以挂载configmap
- 任务类型的应用可以尝试应用jobor cronjob
- 镜像还是需要重新构建的,不同的应用。这样可以减少镜像的大小,减少漏洞的可能性
推荐阅读
- Linux之tar命令
- 9DNS主从和iptables使用
- JVM升级篇八(工具篇)
- 更便捷的Mybatis插件——EasyMybatis
- Linux 脚本初步等练习
- oeasy教您玩转vim - 84 - #命令command
- 设计模式-- 外观模式(没那么高大上)
- 如何实现vSphere Replication 负载均衡
- 在页面模板中按类别获取自定义帖子类型