ZBLOG

我的应用在Kubernetes 集群的pod 里,如何使用 client-go 将其他的 pod 中的文件拷贝到本地 pod,不适用 kubectl cp 可以做到吗,是否需要使用什么 rbac 权限

使用 client-go 可以在 Kubernetes 集群中的 pod 中复制文件。具体步骤如下:

  1. 导入 client-go 包:
  1. import (
  2. "context"
  3. "fmt"
  4. "os"
  5. corev1 "k8s.io/api/core/v1"
  6. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  7. "k8s.io/client-go/kubernetes"
  8. "k8s.io/client-go/rest"
  9. )
  1. 建立 Kubernetes 集群客户端:
  1. config, err := rest.InClusterConfig()
  2. if err != nil {
  3. panic(err.Error())
  4. }
  5. clientset, err := kubernetes.NewForConfig(config)
  6. if err != nil {
  7. panic(err.Error())
  8. }
  1. 获取需要复制的 pod 和容器名称:
  1. podName := "my-pod"
  2. containerName := "my-container"
  3. namespace := "default"
  4. pod, err := clientset.CoreV1().Pods(namespace).Get(context.Background(), podName, metav1.GetOptions{})
  5. if err != nil {
  6. panic(err.Error())
  7. }
  1. 复制文件到本地 pod:
  1. copyFromPath := "/var/log/myapp.log"
  2. copyToPath := "/tmp/myapp.log"
  3. err = copyFile(clientset, namespace, podName, containerName, copyFromPath, copyToPath)
  4. if err != nil {
  5. panic(err.Error())
  6. }
  1. 实现 copyFile 函数:
  1. func copyFile(clientset *kubernetes.Clientset, namespace, podName, containerName, copyFromPath, copyToPath string) error {
  2. req := clientset.CoreV1().RESTClient().
  3. Post().
  4. Resource("pods").
  5. Name(podName).
  6. Namespace(namespace).
  7. SubResource("exec").
  8. VersionedParams(&corev1.PodExecOptions{
  9. Container: containerName,
  10. Command: []string{"sh", "-c", fmt.Sprintf("cat %s", copyFromPath)},
  11. Stdout: true,
  12. Stderr: true,
  13. }, metav1.ParameterCodec)
  14. exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
  15. if err != nil {
  16. return err
  17. }
  18. file, err := os.Create(copyToPath)
  19. if err != nil {
  20. return err
  21. }
  22. defer file.Close()
  23. err = exec.Stream(remotecommand.StreamOptions{
  24. Stdout: file,
  25. Stderr: os.Stderr,
  26. })
  27. if err != nil {
  28. return err
  29. }
  30. return nil
  31. }

需要注意的是,执行此操作需要具有相应的 RBAC 权限,可以在 Kubernetes 集群中创建一个新的 ServiceAccount,并将其绑定到具有访问源和目标 pod 的角色上。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1686

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?