【问题标题】:How can I create a simple client app with the Kubernetes Go library?如何使用 Kubernetes Go 库创建简单的客户端应用程序?
【发布时间】:2015-12-09 20:52:42
【问题描述】:

我正在为 Kubernetes Go 库而苦苦挣扎。文档--at least the ones I found--与库本身相比显得过时了。由于导入问题,提供的示例无法构建。我只是想做一些简单的事情:按名称获取服务对象并打印一些属性(如 nodePort)。我只需要一个简单的库使用示例就可以开始了。

我可以使用 RESTful API 轻松做到这一点,但这感觉就像是在重新发明轮子。

【问题讨论】:

    标签: go kubernetes


    【解决方案1】:

    所以经过一些实验和来自 k8s Slack 频道的提示后,我有了这个例子。也许有人可以使用正确的导入路径更新示例。

    package main
    
    import (
        "fmt"
        "log"
    
        "github.com/kubernetes/kubernetes/pkg/api"
        client "github.com/kubernetes/kubernetes/pkg/client/unversioned"
    )
    
    func main() {
    
        config := client.Config{
            Host: "http://my-kube-api-server.me:8080",
        }
        c, err := client.New(&config)
        if err != nil {
            log.Fatalln("Can't connect to Kubernetes API:", err)
        }
    
        s, err := c.Services(api.NamespaceDefault).Get("some-service-name")
        if err != nil {
            log.Fatalln("Can't get service:", err)
        }
        fmt.Println("Name:", s.Name)
        for p, _ := range s.Spec.Ports {
            fmt.Println("Port:", s.Spec.Ports[p].Port)
            fmt.Println("NodePort:", s.Spec.Ports[p].NodePort)
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是使用最新的 Go 客户端的方法。

      如果你在 k8s 集群中:

      package main
      
      import (
        "fmt"
      
        "k8s.io/client-go/1.5/kubernetes"
        "k8s.io/client-go/1.5/pkg/api/v1"
        "k8s.io/client-go/1.5/rest"
      )
      
      func main()  {
          config, err = rest.InClusterConfig()
          if err != nil {
            return nil, err
          }
      
          c, err := kubernetes.NewForConfig(config)
          if err != nil {
            return nil, err
          }
      
          // Get Pod by name
          pod, err := c.Pods(v1.NamespaceDefault).Get("my-pod")
          if err != nil {
              fmt.Println(err)
              return
          }
      
          // Print its creation time
          fmt.Println(pod.GetCreationTimestamp())
      }
      

      如果您在集群之外:

      package main
      
      import (
        "fmt"
      
        "k8s.io/client-go/1.5/kubernetes"
        "k8s.io/client-go/1.5/pkg/api/v1"
        "k8s.io/client-go/1.5/tools/clientcmd"
      )
      
      func main()  {
          config, err := clientcmd.BuildConfigFromFlags("", <kube-config-path>)
          if err != nil {
            return nil, err
          }
      
          c, err := kubernetes.NewForConfig(config)
          if err != nil {
            return nil, err
          }
      
          // Get Pod by name
          pod, err := c.Pods(v1.NamespaceDefault).Get("my-pod")
          if err != nil {
              fmt.Println(err)
              return
          }
      
          // Print its creation time
          fmt.Println(pod.GetCreationTimestamp())
      }
      

      我在blog post 中对此进行了详细介绍。

      【讨论】:

      • 我的代码无法解析 pod 行中的“c.Pods”,错误:= c.Pods(v1.NamespaceDefault).Get("my-pod") 知道为什么吗?
      • @Chetan 这段代码明确使用了 1.5 版本的 go-client 库,最高支持 kubernetes-1.4。如果您要连接到 GKE 集群,您可能需要 2.0 版本才能连接到 kubernetes 1.5.x。检查兼容性矩阵:github.com/kubernetes/client-go#compatibility-matrix
      • 我的 kubernetes 是 1.5,go-client 库是 master/HEAD。我也对 go-client 2.0 进行了同样的尝试。还有一个可能受到影响的问题是,我无法执行“go get k8s.io/client-go/...”,所以我手动下载了客户端并将其放置在工作区中。所以我认为依赖关系没有解决。如果是这样,知道如何解决它们吗?
      【解决方案3】:

      使用 kubernetes go 客户端,可以这样完成:

      package main
      
      import (
          "flag"
          "fmt"
      
          "k8s.io/client-go/kubernetes"
          "k8s.io/client-go/pkg/api/v1"
          "k8s.io/client-go/tools/clientcmd"
      )
      
      var (
          kubeconfig = flag.String("kubeconfig", "./config", "absolute path to the kubeconfig file")
      )
      
      func main() {
          flag.Parse()
          // uses the current context in kubeconfig
          config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
          if err != nil {
              panic(err.Error())
          }
          // creates the clientset
          clientset, err := kubernetes.NewForConfig(config)
          if err != nil {
              panic(err.Error())
          }
          services, err := clientset.Core().Services("").List(v1.ListOptions{})
          if err != nil {
              panic(err.Error())
          }
          fmt.Printf("There are %d pods in the cluster\n", len(services.Items))
      
          for _, s := range services.Items {
              for p, _ := range s.Spec.Ports {
                  fmt.Println("Port:", s.Spec.Ports[p].Port)
                  fmt.Println("NodePort:", s.Spec.Ports[p].NodePort)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 1970-01-01
        • 2018-02-27
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        相关资源
        最近更新 更多