如何使用 client-go 库列出与持久卷声明关联的 Pods?
How to list Pods which are associated with persistent volume claim using client-go library?
使用下面的 client-go 调用列出特定命名空间中的 PVC。
x, err := clientset.CoreV1().PersistentVolumeClaims("namespace_name").List(context.TODO(), metav1.ListOptions{})
我们如何获得与 PVC 关联的 Pods 列表?
看来我们需要use loop and filtering - similar question on the GitHub:
No, looping and filtering is the only way to locate pods using a specific PVC
将在特定命名空间中通过 pods 的简单代码,将带有 PVC 的 pods 保存到新列表并打印:
// Set namespace
var namespace = "default"
// Get pods list
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
// Create new pod list
podsWithPVC := &corev1.PodList{}
// Filter pods to check if PVC exists, if yes append to the list
for _, pod := range podList.Items {
for _, volume := range pod.Spec.Volumes {
if volume.PersistentVolumeClaim != nil {
podsWithPVC.Items = append(podsWithPVC.Items, pod)
fmt.Println("Pod Name: " + pod.GetName())
fmt.Println("PVC Name: " + volume.PersistentVolumeClaim.ClaimName)
}
}
}
完整代码(基于this code):
package main
import (
"context"
"flag"
"fmt"
"path/filepath"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
// Set namespace
var namespace = "default"
// Get pods list
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
// Create new pod list
podsWithPVC := &corev1.PodList{}
// Filter pods to check if PVC exists, if yes append to the list
for _, pod := range podList.Items {
for _, volume := range pod.Spec.Volumes {
if volume.PersistentVolumeClaim != nil {
podsWithPVC.Items = append(podsWithPVC.Items, pod)
fmt.Println("Pod Name: " + pod.GetName())
fmt.Println("PVC Name: " + volume.PersistentVolumeClaim.ClaimName)
}
}
}
}
使用下面的 client-go 调用列出特定命名空间中的 PVC。
x, err := clientset.CoreV1().PersistentVolumeClaims("namespace_name").List(context.TODO(), metav1.ListOptions{})
我们如何获得与 PVC 关联的 Pods 列表?
看来我们需要use loop and filtering - similar question on the GitHub:
No, looping and filtering is the only way to locate pods using a specific PVC
将在特定命名空间中通过 pods 的简单代码,将带有 PVC 的 pods 保存到新列表并打印:
// Set namespace
var namespace = "default"
// Get pods list
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
// Create new pod list
podsWithPVC := &corev1.PodList{}
// Filter pods to check if PVC exists, if yes append to the list
for _, pod := range podList.Items {
for _, volume := range pod.Spec.Volumes {
if volume.PersistentVolumeClaim != nil {
podsWithPVC.Items = append(podsWithPVC.Items, pod)
fmt.Println("Pod Name: " + pod.GetName())
fmt.Println("PVC Name: " + volume.PersistentVolumeClaim.ClaimName)
}
}
}
完整代码(基于this code):
package main
import (
"context"
"flag"
"fmt"
"path/filepath"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err)
}
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
// Set namespace
var namespace = "default"
// Get pods list
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
// Create new pod list
podsWithPVC := &corev1.PodList{}
// Filter pods to check if PVC exists, if yes append to the list
for _, pod := range podList.Items {
for _, volume := range pod.Spec.Volumes {
if volume.PersistentVolumeClaim != nil {
podsWithPVC.Items = append(podsWithPVC.Items, pod)
fmt.Println("Pod Name: " + pod.GetName())
fmt.Println("PVC Name: " + volume.PersistentVolumeClaim.ClaimName)
}
}
}
}