K8S获取部署活动探测状态

时间:2020-10-08 14:32:58

标签: go kubernetes

我们在部署资源中定义了K8的活动性和就绪性探针(我们已经定义了活动性...),我们需要client-go lib才能访问此活动性探针,如何我们这样做吗?

我已经尝试过client-go lib

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

如下:

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

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

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

最后,我需要根据部署中定义的活动性探针获取吊舱活动性状态。我的意思是生或死

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如何执行此操作取决于您要执行的操作。

部署

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。

豆荚示例列表:

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
    }
}

Status的{​​{1}}部分包含Pod和一些conditions:信息,以及ProbecontainerStatuses:,在Go语言中也有说明上面的例子。使用您的自定义逻辑来使用此信息。

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

restartCount:

的示例
Pod Status