【问题标题】:K8S Get deployment liveness probe statusK8S 获取部署活跃度探测状态
【发布时间】:2021-01-23 15:15:13
【问题描述】:

我们在 deployment 资源中定义了 K8s liveness 和 readiness probes(我们已经定义了 liveness...),我们需要 client-go lib 来访问这个 liveness probe,我们该怎么做那个?

我已经用client-go lib 试过了

https://github.com/kubernetes/client-go

如下:

client.Discovery().RESTClient().Get()

我也尝试过使用 go 库,但在 client.CoreV1() 上没有找到任何 deployment 属性。但是我确实找到了servicepod 等。我在这里缺少什么?

PodList, err := client.CoreV1().Pods("mynamespace").List(metav1.ListOptions{LabelSelector: "run=liveness-app"})

最后我需要根据部署中定义的 liveness probe 来获取 pod 的 liveness 状态。我的意思是生或死

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:
    pods, err := client.CoreV1().Pods("").List(meta_v1.ListOptions{})
    if err != nil {
        log.Fatal(err)
    }
    
    for _, pod := range pods.Items {
        for _, container := range pod.Spec.Containers {
            fmt.Println(container.LivenessProbe)
            fmt.Println(container.ReadinessProbe)
        }
    }
    

    您可以遍历 pod.Items 以获取容器 LivenessProbe 和 ReadinessProbe

    【讨论】:

    • 谢谢,我需要deployment liveness 探针,如何获取?
    • @bredstraruts 部署主要包含一个用于 Pod 的 模板。 Deployment 中的 readinessProbes 是 PodTemplates 的一部分。
    • @Jonas - 您能否提供示例作为答案,我会检查它并用赏金结束问题
    【解决方案2】:

    如何做到这一点取决于你想做什么。

    部署

    Deployment 包含一个 PodTemplate,用于创建每个副本。

    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。

    豆荚

    您可以使用与Deployment选择器中相同的标签列出从部署中创建的 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
        }
    }
    

    PodStatus 部分包含 conditions: 和一些 Probe-信息,containerStatuses:restartCount:,也在上面的 Go 示例中说明。使用您的自定义逻辑来使用此信息。

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

    Pod Status 示例

    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
    

    【讨论】:

    • 谢谢,我试了1+,我看到它打印了liveness,但是我需要得到prob负责的status,我的意思是根据pod获得live与否活力,我该怎么做?
    • @bredstraruts 没有办法检查 livenessprobe 的状态,因为如果它失败了,pod 会被杀死并创建一个新的 pod。
    • 你能得到的最接近的是restartCount:中的containerStatuses:
    • 谢谢!你的自定义逻辑是什么意思,你能提供例子吗?我需要知道在我称之为up 的时候,我还应该检查什么吗?
    • 这是一个数字,你可以随意使用这个数字。
    猜你喜欢
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多