ホームページ >バックエンド開発 >Golang >Go クライアントを使用して Kubernetes ポッドでコマンドを実行する際のエラーをトラブルシューティングするにはどうすればよいですか?

Go クライアントを使用して Kubernetes ポッドでコマンドを実行する際のエラーをトラブルシューティングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 14:11:13577ブラウズ

How to Troubleshoot Errors When Executing Commands in Kubernetes Pods Using the Go Client?

Kubernetes Go Client を使用したポッドでのコマンドの実行

Kubernetes では、exec コマンドを使用してポッド上でコマンドをリモートで実行できます。 Go クライアントは、この操作を実行するための便利なインターフェイスを提供します。

次のシナリオを考えてみましょう: wordpress-mysql-213049546-29s7d という名前のポッドで ls コマンドを実行する必要があります。

config := &restclient.Config{
    Host:     "http://192.168.8.175:8080",
    Insecure: true,
}

config.ContentConfig.GroupVersion = &api.Unversioned
config.ContentConfig.NegotiatedSerializer = api.Codecs

restClient, err := restclient.RESTClientFor(config)
if err != nil {
    panic(err.Error())
}

req := restClient.Post().Resource("pods").Name("wordpress-mysql-213049546-29s7d").Namespace("default").SubResource("exec").Param("container", "mysql")
req.VersionedParams(&api.PodExecOptions{
    Container: "mysql",
    Command:   []string{"ls"},
    Stdin:     true,
    Stdout:    true,
}, api.ParameterCodec)

exec, err := remotecommand.NewExecutor(config, "POST", req.URL())
if err != nil {
    panic(err.Error())
}
sopt := remotecommand.StreamOptions{
    SupportedProtocols: remotecommandserver.SupportedStreamingProtocols,
    Stdin:              os.Stdin,
    Stdout:             os.Stdout,
    Stderr:             os.Stderr,
    Tty:                false,
}

err = exec.Stream(sopt)
if err != nil {
    panic(err.Error())
}

このコードを実行しようとすると、メッセージなしでエラーが発生します。この問題に対処する方法は次のとおりです:

コードのデバッグ

  1. Kubernetes API サーバー接続の確認: コードが Kubernetes API サーバーと通信できることを確認します。
  2. ポッドと名前空間を確認します: 再確認しますpodName と名前空間が正しいことを確認します。
  3. ポッド マニフェストの確認: ポッド マニフェストを調べて、mysql コンテナに ls コマンドを実行するために必要な権限があることを確認します。

正しい例の使用

あるいは、次のコードを参照することもできます動作例のスニペット:

import (
    "io"

    v1 "k8s.io/api/core/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/kubernetes/scheme"
    restclient "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/remotecommand"
)

// ExecCmd exec command on specific pod and wait the command's output.
func ExecCmdExample(client kubernetes.Interface, config *restclient.Config, podName string,
    command string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
    cmd := []string{
        "sh",
        "-c",
        command,
    }
    req := client.CoreV1().RESTClient().Post().Resource("pods").Name(podName).
        Namespace("default").SubResource("exec")
    option := &v1.PodExecOptions{
        Command: cmd,
        Stdin:   true,
        Stdout:  true,
        Stderr:  true,
        TTY:     true,
    }
    if stdin == nil {
        option.Stdin = false
    }
    req.VersionedParams(
        option,
        scheme.ParameterCodec,
    )
    exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
    if err != nil {
        return err
    }
    err = exec.Stream(remotecommand.StreamOptions{
        Stdin:  stdin,
        Stdout: stdout,
        Stderr: stderr,
    })
    if err != nil {
        return err
    }

    return nil
}

このコード サンプルは、Kubernetes Go クライアントを使用してポッド上でコマンドを正常に実行するのに役立ちます。

以上がGo クライアントを使用して Kubernetes ポッドでコマンドを実行する際のエラーをトラブルシューティングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。