前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes Cronjob的第一次使用

Kubernetes Cronjob的第一次使用

原创
作者头像
对你无可奈何
发布2022-01-06 17:14:04
8050
发布2022-01-06 17:14:04
举报
文章被收录于专栏:运维专栏运维专栏

背景

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

首先还是复习一遍kubernetes 的workloads

参照:https://kubernetes.io/zh/docs/concepts/workloads/

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

代码语言:txt
复制
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(貌似前段时间都合并一起了,过去就是个人版仓库)

构建镜像,并推送基础镜像到基础仓库:

代码语言:txt
复制
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 的单选多选问题

image.png
image.png

pipeline做when 判断

代码语言:txt
复制
            when {
                environment name: 'XXXX', value: 'true'
            }

子项目文件夹下添加Dockerfile

代码语言:txt
复制
FROM ccr.ccs.tencentyun.com/xxxx/php:7.4-fpm
ADD html /var/www/html
WORKDIR /var/www/html[

注:由于为这是git项目下增加了一个新的子文件目录并不是新项目就不写完整的pipeline只添加片段了!

1. 构建上传镜像到镜像仓库

代码语言:txt
复制
        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. 部署应用

代码语言:txt
复制
                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 。参照:https://duiniwukenaihe.blog.csdn.net/article/details/116661391

tpl模板文件

worldmap-job.tpl

代码语言:txt
复制
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

关于几点要注意的:

schedule   schedule: "/5 * * *"  ###5分钟执行一次

imagePullPolicy  imagePullPolicy: IfNotPresent  ###imagePullPolicy自断貌似三必须的,我copy deployments的配置过来改的开始没有加这个貌似报错了

args 执行脚本依然是 数要加引号强调

envFrom 是我引用了configmap中的变量

env 限制了php limit

sesources 做了资源限制

imagePullSecrets  镜像仓库secret

restartPolicy  容器重启策略

now jenkins触发构建。登陆kubernetes集群验证:

代码语言:txt
复制
[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这样依次的

一些自己想到的:

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 首先还是复习一遍kubernetes 的workloads
  • Cronjob的第一次使用
    • 明确一下需求
      • 基础镜像构建
        • jenkins pipeline流水线构建
          • 1. 构建上传镜像到镜像仓库
          • 2. 部署应用
        • tpl模板文件
        • 一些自己想到的:
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档