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

List Openshift objects via Go client API

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

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

我也是 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))
    }
}

你曾经如此接近,问题很小:你需要包括以下额外的导入:

import _ "github.com/openshift/origin/pkg/api/install"

我不完全清楚导入的实际作用,但显然它会导致将必要的附加功能链接到二进制文件中,否则 OpenShift 客户端将无法工作(returns 空列表)。

所有 OpenShift 命令行工具都包含该导入,并且在撰写本文时,许多工具还包含 some/all 以下内容:

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 及其依赖项。一种非常 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