乐趣区

关于kubernetes: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') {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。参照: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

对于几点要留神的:
schedule schedule: “/5 *” ###5 分钟执行一次
imagePullPolicy imagePullPolicy: IfNotPresent ###imagePullPolicy 自断貌似三必须的,我 copy deployments 的配置过去改的开始没有加这个貌似报错了
args 执行脚本仍然是 数要加引号强调
envFrom 是我援用了 configmap 中的变量
env 限度了 php limit
sesources 做了资源限度
imagePullSecrets 镜像仓库 secret
restartPolicy 容器重启策略
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 这样顺次的

一些本人想到的:

  1. cronjob 要做资源的限度
  2. cronjob 也能够挂载 configmap
  3. 工作类型的利用能够尝试利用 job or cronjob
  4. 镜像还是须要从新构建的,不同的利用。这样能够缩小镜像的大小,缩小破绽的可能性

退出移动版