【问题标题】:How to Check If A Kubernetes Job Is Running如何检查 Kubernetes 作业是否正在运行
【发布时间】:2021-06-13 11:13:50
【问题描述】:

我们正在使用client-go与我们的kubernetes集群(api版本:batchv1/appv1/corev1)对话,我们主要使用三种资源:Job、Deployment和Service。

我的问题是,我们如何判断 A Job 或 deployment 何时准备就绪并处于运行状态?

对于A Job,我们发现当batchV1.Spec.Active > 0时,这个job控制的pod可能处于pending状态或者running状态。那么要检查一个 Kubernetes Job 的 pod 是否都处于运行状态,我们是否必须枚举 Kubernetes Job 的每个 pod 并检查它们是否都处于运行状态,那么 Job 是否准备就绪并正在运行?有简单的方法吗?

kubernetes 部署和服务怎么样?有没有简单的方法来检查部署是否准备就绪?

【问题讨论】:

    标签: linux kubernetes client-go


    【解决方案1】:

    要检查部署状态,您需要检查此部署创建的 pod 状态。 示例:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: myapp
      name: myapp
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - image: myimage
            name: myapp
            livenessProbe:
              # your desired liveness check
    

    您可以使用 client-go 从部署中获取所需的 PodTemplate

    例如:

    clientset := kubernetes.NewForConfigOrDie(config)
    deploymentClient := clientset.AppsV1().Deployments("mynamespace")
    deployment, err := deploymentClient.Get("myapp", metav1.GetOptions{})
    
    for _, container := range deployment.Spec.Template.Spec.Containers {
        container.LivenessProbe // add your logic
    }
    

    注意: Deployment 仅包含所需的 PodTemplate,因此要查看任何状态,您必须查看已创建的 Pod。 豆荚

    您可以使用与部署选择器中相同的标签列出从部署创建的 Pod。

    Pod 示例列表:

    pods, err := clientset.CoreV1().Pods(namespace).List(metav1.ListOptions{
        LabelSelector: "app=myapp",
    })
    
    // check the status for the pods - to see Probe status
    for _, pod := range pods.Items {
        pod.Status.Conditions // use your custom logic here
    
        for _, container := range pod.Status.ContainerStatuses {
            container.RestartCount // use this number in your logic
        }
    }
    

    Pod 的 Status 部分包含条件:with some Probe-information 和 containerStatuses: with restartCount:,在上面的 Go 示例中也有说明。使用您的自定义逻辑来使用此信息。

    只要 livenessProbe 失败,Pod 就会重新启动。

    Pod 状态示例:

    status:
      conditions:
      - lastProbeTime: null
        lastTransitionTime: "2020-09-15T07:17:25Z"
        status: "True"
        type: Initialized
      containerStatuses:
      - containerID: docker://25b28170c8cec18ca3af0e9c792620a3edaf36aed02849d08c56b78610dec31b
        image: myimage
        imageID: docker-pullable://myimage@sha256:a432251b2674d24858f72b1392033e0d7a79786425555714d8e9a656505fa08c
        name: myapp
        restartCount: 0
    

    希望能帮助您解决问题。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 2014-08-08
      • 2016-03-23
      • 2012-01-23
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多