为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
翻阅古今 2022-06-21 10:36:43
我在 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"
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

似乎我一直都在工作,但只是CoreV1().Pods(ns).List(options)错误地处理了返回类型。它返回一个指向切片的指针PodList- https://pkg.go.dev/k8s.io/api/core/v1?tab=doc#PodList


这是最小的代码,我所做的工作可能对后代有用


package main


import (

        "fmt"

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

        "k8s.io/client-go/kubernetes"

        "k8s.io/client-go/tools/clientcmd"

        "os"

        "path/filepath"

)


func main() {


        kubeconfig := filepath.Join(

                os.Getenv("HOME"), ".kube", "config",

        )


        // Initialize kubernetes-client

        cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)

        if err != nil {

                fmt.Printf("Error building kubeconfig: %v\n", err)

                os.Exit(1)

        }


        // create new client with the given config

        // https://pkg.go.dev/k8s.io/client-go/kubernetes?tab=doc#NewForConfig

        kubeClient, err := kubernetes.NewForConfig(cfg)

        if err != nil {

                fmt.Printf("Error building kubernetes clientset: %v\n", err)

                os.Exit(2)

        }


        // use the app's label selector name. Remember this should match with 

        // the deployment selector's matchLabels. Replace <APPNAME> with the 

        // name of your choice

        options := metav1.ListOptions{

                LabelSelector: "app=<APPNAME>",

        }


        // get the pod list

        // https://pkg.go.dev/k8s.io/client-go@v11.0.0+incompatible/kubernetes/typed/core/v1?tab=doc#PodInterface

        podList, _ := kubeClient.CoreV1().Pods("default").List(options)


        // List() returns a pointer to slice, derefernce it, before iterating

        for _, podInfo := range (*podList).Items {

                fmt.Printf("pods-name=%v\n", podInfo.Name)

                fmt.Printf("pods-status=%v\n", podInfo.Status.Phase)

                fmt.Printf("pods-condition=%v\n", podInfo.Status.Conditions)

        }

}


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信