Maison > développement back-end > Golang > Comment exécuter correctement une commande dans un pod Kubernetes à l'aide du client Go et gérer les connexions SPDY ?

Comment exécuter correctement une commande dans un pod Kubernetes à l'aide du client Go et gérer les connexions SPDY ?

Linda Hamilton
Libérer: 2024-12-14 06:22:10
original
1060 Les gens l'ont consulté

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

Commande d'exécution dans un pod Kubernetes à l'aide du client Go

Problème :

Le code fourni L'extrait tente d'exécuter une commande dans un pod à l'aide du client Kubernetes Go, mais rencontre une erreur lors de la tentative de diffusion de la commande. sortie.

Solution :

Le problème réside dans l'utilisation de remotecommand.NewExecutor(), qui est destiné aux connexions HTTP/1.1. Pour les connexions SPDY, qui sont généralement utilisées dans les clusters Kubernetes, vous devez plutôt utiliser remotecommand.NewSPDYExecutor().

Code modifié :

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
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal