cronjob.yaml 文件
apiVersion: batch/v1
kind: CronJob
metadata:
name: k8s-springboot-demo
namespace: rz-dt
spec:
failedJobsHistoryLimit: 3
successfulJobsHistoryLimit: 1
startingDeadlineSeconds: 180
concurrencyPolicy: Forbid
schedule: "*/2 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: k8s-springboot-demo
image: rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:2023-05-23-10-54-54
imagePullPolicy: Always
command: ["java"]
args: ["-jar","/usr/local/cenobitor/k8s-springboot-demo.jar","sendEmail"]
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
volumes:
- name: time-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
Command.java
package com.example.demo.job;
public interface Command {
/**
* 遵循Unix约定,如果命令执行正常,则返回0;否则为非0。
*/
int execute(String... args);
}
SendEmailCommand.java
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 {
// 省略业务逻辑代码
log.info("send email success");
return 0;
} catch (Exception e) {
log.error("send email error", e);
return -1;
}
}
}
ProjectCommandLineRunner.java
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;
@PostConstruct
private void init() {
commandMap.put("sendEmail", sendEmailCommand);
}
@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);
}
Command command = commandMap.get(args[0]);
String[] arguments = Arrays.copyOfRange(args, 1, args.length);
System.exit(command.execute(arguments));
//执行成功则,正常退出0, 异常退出非0
System.exit(0);
}
}
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
#指定容器启动时要执行的命令
ENTRYPOINT ["java","-jar","/usr/local/cenobitor/k8s-springboot-demo.jar"]
k8s 一键部署 脚本 deploy.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=aliyun0398513192 rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com --password=1234
echo "镜像最新版本提交"
docker tag k8s-springboot-demo:2023-05-23-10-54-54 rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:2023-05-23-10-54-54
docker push rz-dt-image-server-registry.cn-shanghai.cr.aliyuncs.com/rz-dt/k8s-springboot-demo:2023-05-23-10-54-54
echo "k8s一键部署"
export IMG_TAG=${image_tag}
envsubst < cronjob.yaml | kubectl apply -f -