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で実行されているかどうかに関係なく、これを機能させるにはどうすればよいですか?