Kubernetes Cron作业松弛通知

Kubernetes Cron作业松弛通知,kubernetes,kubernetes-cronjob,Kubernetes,Kubernetes Cronjob,我有一个创建postgres备份作业的cronjob。。我想通过webhook向slack频道发送通知,通知状态为cronjob fail或success。如何添加条件或指定作业和发送到slack的状态?我想下面的curl请求也可以,但如果您发现任何错误,请发出警告 kind: CronJob metadata: name: standup spec: schedule: "* 17 * * 1-5" jobTemplate: spec: template:

我有一个创建postgres备份作业的cronjob。。我想通过webhook向slack频道发送通知,通知状态为cronjob fail或success。如何添加条件或指定作业和发送到slack的状态?我想下面的curl请求也可以,但如果您发现任何错误,请发出警告

kind: CronJob
metadata:
  name: standup
spec:
  schedule: "* 17 * * 1-5"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: standup
            image: busybox
            resources:
              requests:
                cpu: 1m
                memory: 100Mi
            env:
              - args: /bin/sh
              - -c 
              - curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/TQPCENFHP/
      restartPolicy: OnFailure 


我认为我们可以创建一个简单的脚本来获取cronjob状态:

import json
import os
from kubernetes import client, config, utils
from kubernetes.client.rest import ApiException
from api.exceptions import BatchApiNamespaceNotExistedException

class Constants:
    BACKOFF_LIMIT = 1
    STATUS_RUNNING = "RUNNING"
    STATUS_SUCCEED = "SUCCEED"
    STATUS_FAILED = "FAILED"
    STATUS_NOT_FOUND = "NOT FOUND"

class KubernetesApi:
    def __init__(self):
        try:
            config.load_incluster_config()
        except:
            config.load_kube_config()
        self.configuration = client.Configuration()
        self.api_instance = client.BatchV1Api(client.ApiClient(self.configuration))
        self.api_instance_v1_beta = client.BatchV1beta1Api(client.ApiClient(self.configuration))

    def get_job_status(self, job):
        if job is not None:
            total_failed_pod = job.status.failed or 0
            total_succeeded_pod = job.status.succeeded or 0
            if total_failed_pod + total_succeeded_pod < Constants.BACKOFF_LIMIT:
                return Constants.STATUS_RUNNING
            elif total_succeeded_pod > 0:
                return Constants.STATUS_SUCCEED
            return Constants.STATUS_FAILED
        return Constants.STATUS_NOT_FOUND

    def get_cron_job_status(self, namespace):
        try:
            cron_job_list = self.api_instance_v1_beta.list_namespaced_cron_job(namespace=namespace,
                                                                          watch=False)
        except ApiException as e:
            raise BatchApiNamespaceNotExistedException("Exception when calling BatchV1Api->list_namespaced_cron_job: %s\n" % e)

        for cron_job in cron_job_list.items:
          if cron_job.status.active is not None:
            for active_cron_job in cron_job.status.active:
              job = self.api_instance.read_namespaced_job(namespace=namespace,
                                                       name=active_cron_job.name)
              if job_status == Constants.STATUS_FAILED:
                # Do whatever you want in there
                print(job_status)
导入json
导入操作系统
从kubernetes导入客户端,配置,utils
从kubernetes.client.rest导入ApiException
从api.exceptions导入BatchApiNamespaceNotExistedException
类常量:
退避限制=1
状态\u RUNNING=“RUNNING”
状态\u SUCCEED=“SUCCEED”
状态\u FAILED=“失败”
STATUS\u NOT\u FOUND=“未找到”
KubernetesApi类:
定义初始化(自):
尝试:
config.load\u incluster\u config()
除:
config.load_kube_config()
self.configuration=client.configuration()
self.api_instance=client.BatchV1Api(client.ApiClient(self.configuration))
self.api_实例_v1_beta=client.BatchV1beta1Api(client.ApiClient(self.configuration))
def get_job_状态(自我、作业):
如果作业不是无:
total_failed_pod=作业状态失败或0
total_successed_pod=job.status.successed或0
如果total\u失败\u pod+total\u成功\u pod<常数。退避\u限制:
返回常量。状态\正在运行
elif总成功率>0:
返回常量。状态\u成功
返回常量。状态_失败
返回常量。未找到状态
def get_cron_job_状态(自身、命名空间):
尝试:
cron_job_list=self.api_instance_v1_beta.list_namespaced_cron_job(namespace=namespace,
手表=假)
APIE除外:
引发BatchApiNamespaceNotExistedException(“调用BatchV1Api->list_namespaced_cron_作业时出现异常:%s\n”%e)
对于cron_作业列表中的cron_作业。项:
如果cron_job.status.active不是无:
对于cron_job.status.active中的活动cron_作业:
job=self.api\u instance.read\u namespaced\u job(namespace=namespace,
名称=活动\u cron\u作业。名称)
如果作业状态==常量.status\u失败:
#你想在里面做什么就做什么
打印(作业状态)

因此,如果状态为失败,那么我们可以将日志发送到slack。

我认为我们可以创建一个简单的脚本来获取cronjob状态:

import json
import os
from kubernetes import client, config, utils
from kubernetes.client.rest import ApiException
from api.exceptions import BatchApiNamespaceNotExistedException

class Constants:
    BACKOFF_LIMIT = 1
    STATUS_RUNNING = "RUNNING"
    STATUS_SUCCEED = "SUCCEED"
    STATUS_FAILED = "FAILED"
    STATUS_NOT_FOUND = "NOT FOUND"

class KubernetesApi:
    def __init__(self):
        try:
            config.load_incluster_config()
        except:
            config.load_kube_config()
        self.configuration = client.Configuration()
        self.api_instance = client.BatchV1Api(client.ApiClient(self.configuration))
        self.api_instance_v1_beta = client.BatchV1beta1Api(client.ApiClient(self.configuration))

    def get_job_status(self, job):
        if job is not None:
            total_failed_pod = job.status.failed or 0
            total_succeeded_pod = job.status.succeeded or 0
            if total_failed_pod + total_succeeded_pod < Constants.BACKOFF_LIMIT:
                return Constants.STATUS_RUNNING
            elif total_succeeded_pod > 0:
                return Constants.STATUS_SUCCEED
            return Constants.STATUS_FAILED
        return Constants.STATUS_NOT_FOUND

    def get_cron_job_status(self, namespace):
        try:
            cron_job_list = self.api_instance_v1_beta.list_namespaced_cron_job(namespace=namespace,
                                                                          watch=False)
        except ApiException as e:
            raise BatchApiNamespaceNotExistedException("Exception when calling BatchV1Api->list_namespaced_cron_job: %s\n" % e)

        for cron_job in cron_job_list.items:
          if cron_job.status.active is not None:
            for active_cron_job in cron_job.status.active:
              job = self.api_instance.read_namespaced_job(namespace=namespace,
                                                       name=active_cron_job.name)
              if job_status == Constants.STATUS_FAILED:
                # Do whatever you want in there
                print(job_status)
导入json
导入操作系统
从kubernetes导入客户端,配置,utils
从kubernetes.client.rest导入ApiException
从api.exceptions导入BatchApiNamespaceNotExistedException
类常量:
退避限制=1
状态\u RUNNING=“RUNNING”
状态\u SUCCEED=“SUCCEED”
状态\u FAILED=“失败”
STATUS\u NOT\u FOUND=“未找到”
KubernetesApi类:
定义初始化(自):
尝试:
config.load\u incluster\u config()
除:
config.load_kube_config()
self.configuration=client.configuration()
self.api_instance=client.BatchV1Api(client.ApiClient(self.configuration))
self.api_实例_v1_beta=client.BatchV1beta1Api(client.ApiClient(self.configuration))
def get_job_状态(自我、作业):
如果作业不是无:
total_failed_pod=作业状态失败或0
total_successed_pod=job.status.successed或0
如果total\u失败\u pod+total\u成功\u pod<常数。退避\u限制:
返回常量。状态\正在运行
elif总成功率>0:
返回常量。状态\u成功
返回常量。状态_失败
返回常量。未找到状态
def get_cron_job_状态(自身、命名空间):
尝试:
cron_job_list=self.api_instance_v1_beta.list_namespaced_cron_job(namespace=namespace,
手表=假)
APIE除外:
引发BatchApiNamespaceNotExistedException(“调用BatchV1Api->list_namespaced_cron_作业时出现异常:%s\n”%e)
对于cron_作业列表中的cron_作业。项:
如果cron_job.status.active不是无:
对于cron_job.status.active中的活动cron_作业:
job=self.api\u instance.read\u namespaced\u job(namespace=namespace,
名称=活动\u cron\u作业。名称)
如果作业状态==常量.status\u失败:
#你想在里面做什么就做什么
打印(作业状态)

因此,如果状态为failed,那么我们可以将日志发送到slack。

给出CronJob@Kartoch,我更新了我的问题。。不确定如何从cronjobJob和CronJob启动pods获取日志以执行pod规范,请搜索以CronJob名称为前缀的pods并获取它们的日志logs@Kartoch,猜ıdid并更新我的问题这不是一个好的日志,请阅读以了解job、cronjob和相关POD的名称。查看CronJob@Kartoch,我更新了我的问题。。不确定如何从cronjobJob和CronJob启动pods获取日志以执行pod规范,请搜索以CronJob名称为前缀的pods并获取它们的日志logs@Kartoch,猜ı做了并更新了我的问题这不是一个好日志,请阅读以了解工作是如何进行的,cronjob和相关的pod被命名为感谢您的响应。这可能是一个简单的问题,但首先我应该将此脚本存储在哪里,其次我应该如何触发此脚本?您可以创建另一个包含此脚本的部署,然后执行while true,继续检查是否有作业失败。@semural我将代码放在这里:谢谢你的回答。这可能是一个简单的问题,但首先我应该将此脚本存储在哪里,其次我应该如何触发它