gpt4 book ai didi

go - 观察 pod 状态的所有变化

转载 作者:行者123 更新时间:2023-12-03 10:07:35 26 4
gpt4 key购买 nike

我正在尝试编写行为类似于kubectl get pods --watch .
这样,每次 pod 的状态发生变化时,我都会被触发。
我创建了一个 go项目(在集群中运行)并添加以下代码:

podsWatcher, err := restAPIClient.CoreV1().Pods("").Watch(globalHTTPContext, metav1.ListOptions{Watch: true})
if err != nil {
// do something
}
podsChan := podsWatcher.ResultChan()
for event := range podsChan {
switch event.Type {
case watch.Added:
// do something
case watch.Modified:
// do something
case watch.Deleted:
// do something
case watch.Bookmark:
// do something
case watch.Error:
// do something
}
}
每次在 Pod 中进行重大更改时,我都会收到一个事件,但并非所有事件都如此。 ( events )。
我怎样才能触发 pod 状态中发生的每一个变化(比如 --watch 标志)?

最佳答案

显然,每次更改都会触发 watch (在 pod describe 中进行),我正在查看 pod.status.phase而不是看着 pod.Status.ContainerStatuses ,这就是为什么我认为我没有收到每个事件。
我添加了一个函数来处理如下事件:

// get ContainerStatuses. If there is no containerStatus, return the pod phase
func getPodStatus(pod *core.Pod) string {
containerStatuses := pod.Status.ContainerStatuses
status := ""
if len(containerStatuses) > 0 {
for i := range containerStatuses {
if containerStatuses[i].State.Terminated != nil {
status = containerStatuses[i].State.Terminated.Reason
}
if containerStatuses[i].State.Waiting != nil {
status = containerStatuses[i].State.Waiting.Reason
}
if containerStatuses[i].State.Running != nil {
if status == "" { // if none of the containers report an error
status = "Running"
}
}
}
}
if status == "" {
status = string(pod.Status.Phase)
}
return status
}

// PodWatch watch pod changes in all namespaces
func PodWatch() error {
podsWatcher, err := restAPIClient.CoreV1().Pods("").Watch(globalHTTPContext, metav1.ListOptions{Watch: true})
if err != nil {
return err
}
podsChan := podsWatcher.ResultChan()
for event := range podsChan {
pod, err := event.Object.(*core.Pod)
if err != nil {
return err
}
switch event.Type {
case watch.Added:
fmt.Println(getPodStatus(pod))
case watch.Modified:
fmt.Println(getPodStatus(pod))
case watch.Deleted:
fmt.Println(getPodStatus(pod))
case watch.Bookmark:
fmt.Println(getPodStatus(pod))
case watch.Error:
fmt.Println(getPodStatus(pod))
}
}
}
如果您希望实现 --watch,此解决方案适合我的需求。和kubectl一样,你可以找到实现 here .

关于go - 观察 pod 状态的所有变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65230668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com