首页 > 解决方案 > 使Springboot应用程序Pod自动删除

问题描述

我正在尝试在 Kubernetese 上部署 Springboot 应用程序,我不希望 Pod 无休止地运行。一旦进程完成,我希望 pod 自行终止。现在,由于某些业务逻辑,我们在 Springboot 应用程序中每隔 45 分钟生成一次令牌@Scheduled(FixedRateString...),这意味着该进程将继续运行。为了确保我们的进程被终止,我们System.exit(0)在应用程序结束时使用。

我使用下面的 deployment.yml 文件部署了代码。一旦进程终止,我就会看到新的 Pod 再次启动,我如何确保它在进程完成后自动终止/删除。

部署.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    tier: pred-d
    app: test-prov-img
  name: test-prov-img
spec:
  selector:
    matchLabels:
      app: test-prov-img
  replicas: 1
  template:
    metadata:
      labels:
        app: test-prov-img
    spec:
      containers:
        - image: docker.repo1.com/apps/test-prov-img:1.2
          imagePullPolicy: Always
          name: test-prov-img
          ports:
            - containerPort: 8080
              name: service
              protocol: TCP
          envFrom:
            - configMapRef:
                name: configmap
          resources:
            limits:
              cpu: 1
              memory: 1.25Gi
            requests:
              cpu: 0.1
              memory: 0.25Gi

请建议我必须在 deployment.yml 中进行哪些更改以使 Pod 自动终止/删除。

标签: spring-bootkubectlkubernetes-pod

解决方案


带有注释的方法@Scheduled旨在重复。与其安排一些事情,不如让应用程序做它需要做的任何事情,然后完成。一种选择是添加一个CommandLineRunner实现,该实现执行该@Scheduled方法当前正在完成的工作。

@Component
public class TaskPerformer implements CommandLineRunner {

    @Override
    // @Scheduled(fixedRateString = ...) We no longer need this
    public void run(String... args) {
        // TODO: Generate token here
    }
}

然后,您可以将您的应用程序转换为Kubernetes CronJob,您可以指示它每 45 分钟运行一次。然后它将按时启动,CronJob运行生成令牌的应用程序,然后自行关闭。


推荐阅读