使用 client-go API 列出部署控制器管理的 pod 不起作用

我在 Go 中使用本机 client-go API 来获取在给定命名空间(“默认”)下由 Deployment 类型控制器管理的 Pod 列表,但返回的列表不包含 Pod 列表


labelSelector := labels.Set(obj.Spec.Selector.MatchLabels)

https://pkg.go.dev/k8s.io/api/apps/v1?tab=doc#Deploymentobj的类型*appsv1.Deployment在哪里


podsList, err := getPodList(string(labelSelector.AsSelector().String()), kubeClient, res.Namespace)

函数定义为


func getPodList( labelSelector string, client kubernetes.Interface, ns string ) (*corev1.PodList, error) {     

     options := metav1.ListOptions{

         LabelSelector: labelSelector,

     }


     podList, err := client.CoreV1().Pods(ns).List(options)

     return podList, err

 }

返回的类型 - https://pkg.go.dev/k8s.io/api/core/v1?tab=doc#PodList应该包含Items []Pod我返回的信息中不可用的切片。


在 Go 代码中使用以下包


appsv1 "k8s.io/api/apps/v1"    

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"k8s.io/apimachinery/pkg/labels"

"k8s.io/client-go/kubernetes"


翻阅古今
浏览 189回答 1
1回答

青春有我

似乎我一直都在工作,但只是CoreV1().Pods(ns).List(options)错误地处理了返回类型。它返回一个指向切片的指针PodList- https://pkg.go.dev/k8s.io/api/core/v1?tab=doc#PodList这是最小的代码,我所做的工作可能对后代有用package mainimport (&nbsp; &nbsp; &nbsp; &nbsp; "fmt"&nbsp; &nbsp; &nbsp; &nbsp; metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"&nbsp; &nbsp; &nbsp; &nbsp; "k8s.io/client-go/kubernetes"&nbsp; &nbsp; &nbsp; &nbsp; "k8s.io/client-go/tools/clientcmd"&nbsp; &nbsp; &nbsp; &nbsp; "os"&nbsp; &nbsp; &nbsp; &nbsp; "path/filepath")func main() {&nbsp; &nbsp; &nbsp; &nbsp; kubeconfig := filepath.Join(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; os.Getenv("HOME"), ".kube", "config",&nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; // Initialize kubernetes-client&nbsp; &nbsp; &nbsp; &nbsp; cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Error building kubeconfig: %v\n", err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; os.Exit(1)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // create new client with the given config&nbsp; &nbsp; &nbsp; &nbsp; // https://pkg.go.dev/k8s.io/client-go/kubernetes?tab=doc#NewForConfig&nbsp; &nbsp; &nbsp; &nbsp; kubeClient, err := kubernetes.NewForConfig(cfg)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Error building kubernetes clientset: %v\n", err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; os.Exit(2)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // use the app's label selector name. Remember this should match with&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // the deployment selector's matchLabels. Replace <APPNAME> with the&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // name of your choice&nbsp; &nbsp; &nbsp; &nbsp; options := metav1.ListOptions{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LabelSelector: "app=<APPNAME>",&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // get the pod list&nbsp; &nbsp; &nbsp; &nbsp; // https://pkg.go.dev/k8s.io/client-go@v11.0.0+incompatible/kubernetes/typed/core/v1?tab=doc#PodInterface&nbsp; &nbsp; &nbsp; &nbsp; podList, _ := kubeClient.CoreV1().Pods("default").List(options)&nbsp; &nbsp; &nbsp; &nbsp; // List() returns a pointer to slice, derefernce it, before iterating&nbsp; &nbsp; &nbsp; &nbsp; for _, podInfo := range (*podList).Items {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("pods-name=%v\n", podInfo.Name)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("pods-status=%v\n", podInfo.Status.Phase)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("pods-condition=%v\n", podInfo.Status.Conditions)&nbsp; &nbsp; &nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go