Heim >Backend-Entwicklung >Golang >Wie führe ich einen Befehl in einem Kubernetes-Pod mit dem Go-Client korrekt aus und verarbeite SPDY-Verbindungen?

Wie führe ich einen Befehl in einem Kubernetes-Pod mit dem Go-Client korrekt aus und verarbeite SPDY-Verbindungen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-14 06:22:101000Durchsuche

How to Correctly Execute a Command in a Kubernetes Pod Using the Go Client and Handle SPDY Connections?

Befehl in einem Kubernetes-Pod mit Go-Client ausführen

Problem:

Der bereitgestellte Code Snippet versucht, mithilfe des Kubernetes Go-Clients einen Befehl innerhalb eines Pods auszuführen, stößt jedoch beim Versuch, den zu streamen, auf einen Fehler Befehlsausgabe.

Lösung:

Das Problem liegt in der Verwendung von remotecommand.NewExecutor(), das für HTTP/1.1-Verbindungen gedacht ist. Für SPDY-Verbindungen, die typischerweise in Kubernetes-Clustern verwendet werden, sollten Sie stattdessen remotecommand.NewSPDYExecutor() verwenden.

Geänderter Code:

import (
    "fmt"
    "io"
    "os"

    container "k8s.io/api/core/v1"
    meta "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    restclient "k8s.io/client-go/rest"
    cmd "k8s.io/client-go/tools/remotecommand"
)

func main() {
    // Replace with your own config or use in-cluster config
    config := &restclient.Config{
        Host: "https://192.168.8.175:8080",
        // Insecure if using a self-signed certificate
        Insecure: true,
    }

    // Create a Kubernetes client
    client, err := kubernetes.NewForConfig(config)
    if err != nil {
        fmt.Println(err)
        return
    }

    // Define the pod and container to execute the command in
    podName := "wordpress-mysql-213049546-29s7d"
    namespace := "default"
    containerName := "mysql"

    // Define the command to execute
    command := []string{"ls"}

    // Create the PodExecOptions object
    execOptions := container.PodExecOptions{
        Container: containerName,
        Command:   []string{"ls"},
        Stdin:     true,
        Stdout:    true,
        Stderr:    true,
    }

    // Create the request
    req := client.CoreV1().RESTClient().Post().Resource("pods").Namespace(namespace).Name(podName).SubResource("exec")

    // Pass the PodExecOptions object as VersionedParams
    request := req.VersionedParams(&execOptions, meta.ParameterCodec)

    // Execute the command
    exec, err := cmd.NewSPDYExecutor(config, "POST", request.URL())
    if err != nil {
        fmt.Println(err)
        return
    }

    // Stream the output of the command to stdout and stderr
    err = exec.Stream(cmd.StreamOptions{
        Stdin:  os.Stdin,
        Stdout: os.Stdout,
        Stderr: os.Stderr,
    })
    if err != nil {
        fmt.Println(err)
        return
    }
}

Das obige ist der detaillierte Inhalt vonWie führe ich einen Befehl in einem Kubernetes-Pod mit dem Go-Client korrekt aus und verarbeite SPDY-Verbindungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn