【问题标题】:List Openshift objects via Go client API通过 Go 客户端 API 列出 Openshift 对象
【发布时间】:2016-03-02 23:53:51
【问题描述】:

尝试编写一个微服务来管理我的 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))
    }
}

【问题讨论】:

    标签: go openshift-origin


    【解决方案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"
    )
    

    最后,这是一个适用于我的完整代码示例(针对原始 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 及其依赖项。一种非常老套的方法如下:

    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

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 1970-01-01
      • 2018-08-12
      • 2023-04-05
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      相关资源
      最近更新 更多