k8s+springboot+CronJob 定时任务部署

kubernetes+springboot+CronJob 定时任务配置如下代码:

  1. cronjob.yaml k8s 文件  
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: k8s-springboot-demo
      namespace: rz-dt
    spec:
      failedJobsHistoryLimit: 3 #执行失败job任务保留数量
      successfulJobsHistoryLimit: 5 #执行成功job任务保留数量
      startingDeadlineSeconds: 180
      concurrencyPolicy: Forbid
      schedule: "*/1 * * * *" #每分钟执行一次
      jobTemplate:
        spec:
          template:
            spec:
              containers:
                - name: k8s-springboot-demo
                  image: rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:$IMG_TAG
                  imagePullPolicy: Always
                  #command: ["java","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"]#dockerfile已有此处不需要配置
                  args: ["sendEmail","sendEmail2"] # 配置任务类的名称
                  volumeMounts:
                    - name: time-config
                      mountPath: /etc/localtime
                      readOnly: true
                  #envFrom:
                  # - configMapRef:
                  #      name: smcp-config
                  # - secretRef:
                  #     name: smcp-service-secret
                  resources:
                    requests:
                      cpu: "250m"
                      memory: 216Mi
                    limits:
                      cpu: "500m"
                      memory: 512Mi
              restartPolicy: Never
              #从私有仓库拉取镜像凭证
              imagePullSecrets:
                - name: rz-dt-miyue-vpc
              volumes:
                - name: time-config
                  hostPath:
                    path: /usr/share/zoneinfo/Asia/Shanghai
    
    -- 普通Deployment部署k8s脚本 k8s-springboot-demo.yaml 内容,定时任务job可忽略
    
    apiVersion: v1
    kind: Service
    metadata:
      name: k8s-springboot-demo
      namespace: rz-dt
      labels:
        app: k8s-springboot-demo
    spec:
      type: NodePort
      ports:
        - port: 8089
          nodePort: 30091 #service对外开放端口
      selector:
        app: k8s-springboot-demo
    ---
    apiVersion: apps/v1
    kind: Deployment #对象类型
    metadata:
      name: k8s-springboot-demo #名称
      namespace: rz-dt
      labels:
        app: k8s-springboot-demo #标注
    spec:
      replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
      selector:
        matchLabels:
          app: k8s-springboot-demo
      template:
        metadata:
          labels:
            app: k8s-springboot-demo
        spec:
          containers: #docker容器的配置
            - command:
                - java
                - '-Dserver.port=8055'
                - '-jar'
                - /usr/local/cenobitor/k8s-springboot-demo.jar
            - name: k8s-springboot-demo
              image: rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:2022-11-25-12-07 # pull镜像的地址 ip:prot/dir/images:tag
              imagePullPolicy: IfNotPresent #pull镜像时机,
              ports:
                - containerPort: 8089 #容器对外开放端口,需与springboot配置文件一致
          #从私有仓库拉取镜像凭证
          imagePullSecrets:
            - name: rz-dt-miyue
    

  2. Dockerfile 文件
    #基础镜像,如果本地仓库没有,会从远程仓库拉取 openjdk:8
    FROM openjdk:8
    #暴露端口
    EXPOSE 8089
    #容器中创建目录
    RUN mkdir -p /usr/local/cenobitor
    #编译后的jar包copy到容器中创建到目录内
    COPY target/k8s-springboot-demo.jar /usr/local/cenobitor/k8s-springboot-demo.jar
    #指定容器时区
    RUN rm -f /etc/localtime \
    && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone
    #指定容器启动时要执行的命令
    ENTRYPOINT ["java","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"]
    

  3. test.sh 文件

    echo "开始制作镜像..."
    image_tag=`date +%Y-%m-%d-%H-%M-%S` #_%H%M
    echo "当前时间:$image_tag"
    docker build -t k8s-springboot-demo:${image_tag} .
    echo "制作镜像成功!"
    
    echo "登录"
    sudo docker login --username=aliyun0398513152 rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com --password=1234
    
    echo "镜像最新版本提交"
    docker tag k8s-springboot-demo:${image_tag} rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:${image_tag}
    docker push rz-dt-image-server-registry-vpc.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:${image_tag}
    
    echo "k8s一键部署"
    export IMG_TAG=${image_tag}
    envsubst < cronjob.yaml | kubectl --kubeconfig ~/.kube-rz/config apply -f -
    
    
    

    4个代码实现类:

  4. package com.example.demo.job;
    
    public interface Command {
        /**
         * 遵循Unix约定,如果命令执行正常,则返回0;否则为非0。
         */
        int execute(String... args);
    }
    
    
    
    package com.example.demo.job;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    @Component
    @Slf4j
    public class SendEmailCommand implements Command {
    
        @Override
        public int execute(String... args) {
    
            try {
                // 省略业务逻辑代码
                for (String arg:args) {
                    log.info("send email  success args:" +arg);
                }
    
    
                log.info("send email success");
    
                return 0;
    
            } catch (Exception e) {
                log.error("send email error", e);
                return -1;
            }
        }
    }
    
    
    
    package com.example.demo.job;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    @Component
    @Slf4j
    public class SendEmail2Command implements Command {
    
        @Override
        public int execute(String... args) {
    
            try {
                // 省略业务逻辑代码
    
                for (String arg:args) {
                    log.info("send email 2  success args:" +arg);
                }
    
                log.info("send email 2 success");
    
                return 0;
    
            } catch (Exception e) {
                log.error("send email error", e);
                return -1;
            }
        }
    }
    
    
    
    package com.example.demo.job;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    @Component
    @Slf4j
    public class ProjectCommandLineRunner implements CommandLineRunner {
    
        Map<String, Command> commandMap = new HashMap<>();
    
        @Autowired
        private SendEmailCommand sendEmailCommand;
    
        @Autowired
        private SendEmail2Command sendEmail2Command;
    
        @PostConstruct
        private void init() {
            commandMap.put("sendEmail", sendEmailCommand);
            commandMap.put("sendEmail2", sendEmail2Command);
        }
    
        @Override
        public void run(String... args) throws Exception {
    
            if (args.length == 0) {
                return;
            }
    
            if (!commandMap.containsKey(args[0])) {
                log.error("'{}' command not found", args[0]);
                System.exit(-1);
            }
    
            for (String arg:args) {
                log.info("command args:" +arg);
            }
    
           for (int i = 0; i < args.length; i++) {
                Command command =  commandMap.get(args[i]);
                String[] arguments = Arrays.copyOfRange(args, 0, args.length);
                command.execute(arguments);
            }
    
            
            //执行成功则,正常退出0, 异常退出非0
            System.exit(0);
        }
    }
    
    
    

kubectl 客户端执行,sh test.sh :

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值