猿问

通过 Go 客户端 API 列出 Openshift 对象

尝试编写微服务来管理 Openshift 集群上的镜像流。我阅读了oc客户端代码以了解如何读取我的kubeconfig和创建Client.


我可以使用 Kubernetes 发出请求Client以获取 Kubernetes 对象,例如 pod,但是我使用 Openshift 发出的任何请求都会Client返回一个空列表。


我也是 Go 的新手,所以我确定我做错了什么。这是我到目前为止所拥有的:


package main


import (

    "fmt"

    "log"


    "github.com/spf13/pflag"


    kapi "k8s.io/kubernetes/pkg/api"


    "github.com/openshift/origin/pkg/cmd/util/clientcmd"

)


func main() {

    flags := pflag.FlagSet{}

    factory := clientcmd.New(&flags)

    osclient, kclient, err := factory.Clients()

    if err != nil {

        log.Fatalln("Error:", err)

    }


    config, _ := factory.ClientConfig()

    fmt.Println("KClient config", config)

    config, _ = factory.OpenShiftClientConfig.ClientConfig()

    fmt.Println("OSClient config", config)


    // Empty list!

    projects, err := osclient.Projects().List(kapi.ListOptions{})

    if err != nil {

        log.Println("Error:", err)

    } else {

        fmt.Println("Projects", projects, len(projects.Items))

    }


    // Also empty list

    buildconfigs, err := osclient.BuildConfigs("my-project").List(kapi.ListOptions{})

    if err != nil {

        log.Println("Error:", err)

    } else {

        fmt.Println("Buildconfigs", buildconfigs, len(buildconfigs.Items))

    }


    // Works!

    pods, err := kclient.Pods("my-project").List(kapi.ListOptions{})

    if err != nil {

        log.Println("Error:", err)

    } else {

        fmt.Println("Pods", len(pods.Items))

        for _, pod := range pods.Items {

            fmt.Println(pod.ObjectMeta.Name)

        }

    }


    // Permission error, as expected

    namespaces, err := kclient.Namespaces().List(kapi.ListOptions{})

    if err != nil {

        log.Println("Error:", err)

    } else {

        fmt.Println("Namespaces", namespaces, len(namespaces.Items))

    }

}



Qyouu
浏览 159回答 1
1回答

至尊宝的传说

您曾经如此接近,但问题很小:您需要包含以下额外导入:import _ "github.com/openshift/origin/pkg/api/install"我不完全清楚导入的实际作用,但显然它会导致将必要的附加功能链接到二进制文件中,否则 OpenShift 客户端将无法工作(返回空列表)。所有 OpenShift 命令行工具都包含该导入,在撰写本文时,许多命令行工具还包含以下部分/全部内容:import (    _ "github.com/openshift/origin/pkg/api/install"    _ "k8s.io/kubernetes/pkg/api/install"    _ "k8s.io/kubernetes/pkg/apis/autoscaling/install"    _ "k8s.io/kubernetes/pkg/apis/batch/install"    _ "k8s.io/kubernetes/pkg/apis/extensions/install")最后,这是一个对我有用的完整代码示例(针对 origin v3.6.0-alpha 更新):package mainimport (    "fmt"    _ "github.com/openshift/origin/pkg/api/install"    "github.com/openshift/origin/pkg/cmd/util/clientcmd"    "github.com/spf13/pflag"    "k8s.io/apimachinery/pkg/apis/meta/v1")func main() {    factory := clientcmd.New(pflag.CommandLine)    pflag.Parse()    oc, kc, err := factory.Clients()    if err != nil {        panic(err)    }    namespace, _, err := factory.DefaultNamespace()    if err != nil {        panic(err)    }    pods, err := kc.Core().Pods(namespace).List(v1.ListOptions{})    if err != nil {        panic(err)    }    for _, pod := range pods.Items {        fmt.Printf("Pod: %s\n", pod.Name)    }    buildconfigs, err := oc.BuildConfigs(namespace).List(v1.ListOptions{})    if err != nil {        panic(err)    }    for _, buildconfig := range buildconfigs.Items {        fmt.Printf("BuildConfig: %s\n", buildconfig.Name)    }}要运行此示例,您当前需要供应 OpenShift 及其依赖项。一种非常hacky的方法如下:rm -rf vendormkdir -p vendor/github.com/openshift/originln -s $GOPATH/src/github.com/openshift/origin/vendor/* vendorln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/* vendor/github.comln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/openshift/* vendor/github.com/openshiftln -s $GOPATH/src/github.com/openshift/origin/pkg vendor/github.com/openshift/origin最后,它旨在为 OpenShift 制作一个合适的独立 Go 客户端 - 积压卡位于https://trello.com/c/PTDrY0GF/794-13-client-provide-go-client-similar-to- Kubernetes。
随时随地看视频慕课网APP

相关分类

Go
我要回答