英文:
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相关联的Pod列表?
英文:
Using below client-go call to list PVC in a particular namespace.
x, err := clientset.CoreV1().PersistentVolumeClaims("namespace_name").List(context.TODO(), metav1.ListOptions{})
How we can get a list of Pods associated with PVC?
答案1
得分: 0
似乎我们需要使用循环和过滤来定位使用特定 PVC 的 Pod。以下是一个简单的代码示例,它将遍历特定命名空间中的 Pod,将具有 PVC 的 Pod 保存到新列表中并打印出来:
// 设置命名空间
var namespace = "default"
// 获取 Pod 列表
podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
// 创建新的 Pod 列表
podsWithPVC := &corev1.PodList{}
// 过滤 Pod,检查是否存在 PVC,如果存在则添加到列表中
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)
                }
        }
}
完整的代码示例(基于此代码):
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)
        }
        // 设置命名空间
        var namespace = "default"
        // 获取 Pod 列表
        podList, _ := clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
        // 创建新的 Pod 列表
        podsWithPVC := &corev1.PodList{}
        // 过滤 Pod,检查是否存在 PVC,如果存在则添加到列表中
        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)
                        }
                }
        }
}
英文:
It seems that we need to use loop and filtering - similar question on the GitHub:
>No, looping and filtering is the only way to locate pods using a specific PVC
Simple code that will go through pods in specific namespace, save pods with PVC to new list and print:
// 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)
                }
        }
}
Whole code (based on 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)
                        }
                }
        }
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论