2015-09-13 4 views
8

Ich kämpfe mit der Kubernetes Go-Bibliothek. Die Dokumentation - at least the ones I found - erscheint nicht mehr aktuell in der Bibliothek. Das angegebene Beispiel wird aufgrund von Problemen mit den Importen nicht erstellt. Ich versuche nur, etwas Einfaches zu tun: Holen Sie ein Service-Objekt nach Namen und drucken Sie einige Attribute (wie nodePort). Ich brauche nur ein einfaches Beispiel für die Benutzung der Bibliothek, um mich zum Laufen zu bringen.Wie kann ich eine einfache Client-App mit der Kubernetes Go-Bibliothek erstellen?

Ich könnte dies leicht mit der RESTful API tun, aber das fühlt sich an wie das Rad neu zu erfinden.

Antwort

5

Also nach ein wenig experimentieren und einen Tipp von der k8s Slack-Kanal, habe ich dieses Beispiel. Vielleicht kann jemand das Beispiel mit einem korrekten Importpfad aktualisieren.

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

So geht's mit dem neuesten Go-Client.

Wenn Sie innerhalb des K8S Cluster sind:

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

Und wenn Sie außerhalb des Clusters sind:

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

Ich habe mehr ins Detail zu diesem Thema in einem blog post gegangen.

+0

Mein Code nicht in der Lage ist "c.Pods" in der Zeile pod zu lösen, err: = c.Pods (v1.NamespaceDefault) .Get ("my-pod") Irgendeine Idee warum? – Chetan

+0

@Chetan Dieser Code verwendet explizit die Version 1.5 der 'Go-Client'-Bibliothek mit Unterstützung bis zu Kubernetes-1.4. Wenn Sie sich mit einem GKE-Cluster verbinden, benötigen Sie wahrscheinlich die 2.0-Version, um eine Verbindung zu kubernetes 1.5.x herzustellen. Überprüfen Sie die Kompatibilitätsmatrix: https://github.com/kubernetes/client-go#compatibility-matrix – itorres

+0

Mein Kubernetes ist 1.5 und die Go-Client-Bibliothek ist Master/HEAD. Das habe ich auch mit Go-Client 2.0 versucht. Auch ein Haken, der davon betroffen sein könnte, war, dass ich kein "go get k8s.io/client-go/..." machen konnte. Also habe ich den Client manuell heruntergeladen und in den Arbeitsbereich gestellt. Also ich denke, die Abhängigkeiten haben sich nicht aufgelöst. Wenn ja, irgendeine Idee, wie man sie löst? – Chetan

3

Mit Kubernetes gehen Client, könnte es auf diese Weise geschehen:

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) 
     } 
    } 
} 
Verwandte Themen