2015-09-13 19 views
8

Kubernetes Go kütüphanesi ile uğraşıyorum. Dokümanlar-- at least the ones I found - kütüphanenin kendisi ile güncel değil. Sağlanan örnek, içe aktarmalarla ilgili sorunlar nedeniyle oluşturulmuyor. Sadece basit bir şey yapmaya çalışıyorum: bir hizmet nesnesini ada göre al ve bazı özellikleri (nodePort gibi) yazdır. Gitmem için basit bir kütüphane kullanımı örneğine ihtiyacım var.Kubernetes Go kütüphanesiyle nasıl basit bir istemci uygulaması oluşturabilirim?

Bunu RESTful API kullanarak kolayca yapabilirim, ancak bu, tekerleği yeniden icat etmek gibi geliyor.

cevap

5

Biraz deneme yaptıktan ve k8s Slack kanalından bir ipucu aldıktan sonra, bu örneğe sahibim. Belki birisi örneği doğru bir içe aktarma yolu ile güncelleyebilir.

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

En son Go istemcisi ile bunu nasıl yapacağınız.

Eğer K8S kümesinin içinde iseniz:

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()) 
} 

Ve küme dışında iseniz:

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()) 
} 

Ben blog post bu konuyu daha ayrıntılı girmiş. Kubernetes ile

+0

Kodum hattı "Kapsülde c.Pods", err çözmek mümkün değildir: (v1.NamespaceDefault) = c.Pods .Get ("benim-pod") Herhangi bir fikrin neden? – Chetan

+0

@Chetan bu kod, kubernetes-1.4'e kadar destekli "go-client" kitaplığının 1.5 sürümünü kullanır. Bir GKE kümesine bağlanıyorsanız, kubernetes 1.5.x'e bağlanmak için muhtemelen 2.0 sürümüne ihtiyacınız vardır. Uyumluluk matrisini kontrol edin: https://github.com/kubernetes/client-go#compatibility-matrix – itorres

+0

Kubernetes 1.5'tir ve go-client kütüphanesi master/HEAD'dir. Aynı zamanda go-client 2.0 ile de aynı şeyi denedim. Ayrıca etkilenmiş olabilecek bir yakalama, "go get k8s.io/client-go/..." yapamamıştım, bu yüzden istemciyi elle yükledim ve çalışma alanına yerleştirdim. Bu yüzden bağımlılıkların çözülmediğini düşünüyorum. Eğer öyleyse, bunları nasıl çözeceğine dair bir fikrin var mı? – Chetan

3

istemci, bu şekilde yapılabilir gidin:

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) 
     } 
    } 
} 
İlgili konular