0

Kindクラスターでオペレーターを実行しています。私の開発マシンは、その Kind クラスターを実行するために Docker for Mac を実行します。私のオペレーター機能の 1 つは、実行中の Pod でコマンドを実行することです。kubectl exec

オペレーターが Linux ホスト上で Kind i k3s なしで実行されている場合、Pod のログをストリーミングできます。このようなもの:

--- start of exec pod logs ---
/home/ubuntu
--- end of exec pod logs ---

しかし、Kind クラスターで実行すると、Pod のログが表示されなくなります。私が見るのはただ:

--- start of exec pod logs ---
--- end of exec pod logs ---

これが私のオペレーターコードです(Go):

import (
    "sigs.k8s.io/controller-runtime/pkg/client/config"
    "k8s.io/client-go/tools/remotecommand"
    "k8s.io/client-go/kubernetes"
    "k8s.io/api/core/v1"
)

func performExec() error {
    restConfig, err := config.GetConfig()
    if err != nil {
        return err
    }

    clientset, err := kubernetes.NewForConfig(restConfig)
    if err != nil {
        return err
    }

    cmd := []string{
        "sh",
        "-c",
        "pwd",
    }

    // getting a pod for exec operation (execPod) here...
    execPodName := execPod.Name
    log.Printf("Running exec command in pod %s ...\n", execPodName)

    req := clientset.CoreV1().RESTClient().Post().Resource("pods").Name(execPodName).
        Namespace("default").SubResource("exec")
    option := &v1.PodExecOptions{
        Command: cmd,
        Stdin:   true,
        Stdout:  true,
        Stderr:  true,
        TTY:     true,
    }
    req.VersionedParams(
        option,
        scheme.ParameterCodec,
    )

    exec, err := remotecommand.NewSPDYExecutor(restConfig, "POST", req.URL())
    if err != nil {
        return err
    }

    fmt.Println("--- start of exec pod logs ---")
    err = exec.Stream(remotecommand.StreamOptions{
        Stdin:  os.Stdin,
        Stdout: os.Stdout,
        Stderr: os.Stderr,
    })
    if err != nil {
        return err
    }
    fmt.Println("--- end of exec pod logs ---")

    return nil
}

両方のクラスターに適用した RBAC は次のとおりです。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: manager-role
rules:
- apiGroups:
  - ""
  resources:
  - pods/exec
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch

私は何を取りこぼしたか?Kindで実行されているかどうかに関係なく、これを機能させるにはどうすればよいですか?

4

0 に答える 0