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

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

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

Go
Qyouu 2021-12-20 10:58:43
尝试编写微服务来管理 Openshift 集群上的镜像流。我阅读了oc客户端代码以了解如何读取我的kubeconfig和创建Client.我可以使用 Kubernetes 发出请求Client以获取 Kubernetes 对象,例如 pod,但是我使用 Openshift 发出的任何请求都会Client返回一个空列表。我也是 Go 的新手,所以我确定我做错了什么。这是我到目前为止所拥有的:package mainimport (    "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))    }}
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您曾经如此接近,但问题很小:您需要包含以下额外导入:


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 main


import (

    "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 vendor

mkdir -p vendor/github.com/openshift/origin

ln -s $GOPATH/src/github.com/openshift/origin/vendor/* vendor

ln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/* vendor/github.com

ln -s $GOPATH/src/github.com/openshift/origin/vendor/github.com/openshift/* vendor/github.com/openshift

ln -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。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

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