如何从 运行 pod 执行 Kubectl cp 到本地,说没有这样的文件或目录

How to Do Kubectl cp from running pod to local,says no such file or directory

如何从 运行 pod 执行 Kubectl cp 到本地,说没有那个文件或目录

我在 Ubuntu 容器中有如下内容

vagrant@ubuntu-xenial:~/k8s/pods$ kubectl exec command-demo-67m2b -c 
ubuntu 
-- sh -c "ls /tmp"
docker-sock

现在我只想使用下面的 kubectl cp 命令复制上面的 /tmp 内容

kubectl cp command-demo-67m2b/ubuntu:/tmp /home

我的命令输出如下

vagrant@ubuntu-xenial:~/k8s/pods$ kubectl cp command-demo-67m2b/ubuntu:/tmp 
/home
error: tmp no such file or directory

现在我只想将上面的 /tmp 文件夹复制到本地主机,不幸的是 kubectl 说没有这样的文件或目录。 当 /tmp 文件夹存在于 Ubuntu 容器中时,我很困惑,为什么 kubectl cp 说找不到文件夹

我的 pod 是 command-demo-67m2b,容器名称是 ubuntu

但是 pod 已经启动并且运行如下图

vagrant@ubuntu-xenial:~/k8s/pods$ kubectl describe pods  command-demo-67m2b
Name:           command-demo-67m2b
Namespace:      default
Node:           ip-172-31-8-145/172.31.8.145
Start Time:     Wed, 16 Jan 2019 00:57:05 +0000
Labels:         controller-uid=a4ac12c1-1929-11e9-b787-02d8b37d95a0
            job-name=command-demo
Annotations:    kubernetes.io/limit-ranger: LimitRanger plugin set: memory 
request for container ubuntu; memory limit for container ubuntu
Status:         Running
IP:             10.1.40.75
Controlled By:  Job/command-demo
Containers:
command-demo-container:
Container ID:   
docker://c680fb336242f456d90433a9aa89cf3e1cb1d45d73447769fcf86ce329176437
Image:          tarunkumard/fromscratch6.0
Image ID:       docker- ullable://tarunkumard/fromscratch6.0@sha256:709b588aa4edcc9bc2b39bee60f248bb02347a605da09fb389c448e41e2f543a
Port:           <none>
Host Port:      <none>
State:          Terminated
  Reason:       Completed
  Exit Code:    0
  Started:      Wed, 16 Jan 2019 00:57:07 +0000
  Finished:     Wed, 16 Jan 2019 00:58:36 +0000
Ready:          False
Restart Count:  0
Limits:
  memory:  1Gi
Requests:
  memory:     900Mi
Environment:  <none>
Mounts:
  /opt/gatling-fundamentals/build/reports/gatling/ from docker-sock (rw)
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-w6jt6 
(ro)
ubuntu:
Container ID:  
docker://7da9d43816253048fb4137fadc6c2994aac93fd272391b73f2fab3b02487941a
Image:         ubuntu:16.04
Image ID:      docker- 
Port:          <none>
Host Port:     <none>
Command:
  /bin/bash
  -c
  --
Args:
  while true; do sleep 10; done;
State:          Running
  Started:      Wed, 16 Jan 2019 00:57:07 +0000
Ready:          True
Restart Count:  0
Limits:
  memory:  1Gi
Requests:
  memory:  1Gi
Environment:
  JVM_OPTS:  -Xms900M -Xmx1G
Mounts:
  /docker-sock from docker-sock (rw)
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-w6jt6 
(ro)
Conditions:
Type              Status
Initialized       True
Ready             False
ContainersReady   False
PodScheduled      True
Volumes:
docker-sock:
Type:    EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
default-token-w6jt6:
Type:        Secret (a volume populated by a Secret)
SecretName:  default-token-w6jt6
Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
             node.kubernetes.io/unreachable:NoExecute for 300s

事件:

这是我的 yaml 文件以供您参考:-

apiVersion: batch/v1
kind: Job
metadata:
name: command-demo
spec:
ttlSecondsAfterFinished: 100
template:
spec:
  volumes:
    - name: docker-sock                   # Name of the AWS EBS Volume
      emptyDir: {}
  restartPolicy: Never
  containers:
    - name: command-demo-container
      image: tarunkumard/fromscratch6.0
      volumeMounts:
        - mountPath: /opt/gatling-fundamentals/build/reports/gatling/    
   # 
   Mount path within the container
          name: docker-sock                       # Name must match the 
  AWS 
  EBS volume name defined in spec.Volumes
      imagePullPolicy: Never
      resources:
        requests:
          memory: "900Mi"
        limits:
          memory: "1Gi"
    - name: ubuntu
      image: ubuntu:16.04
      command: [ "/bin/bash", "-c", "--" ]
      args: [ "while true; do sleep 10; done;" ]
      volumeMounts:
        - mountPath: /docker-sock    # Mount path within the container
          name: docker-sock                       # Name must match the 
   AWS 
   EBS volume name defined in spec.Volumes
      imagePullPolicy: Never
      env:
      - name: JVM_OPTS
        value: "-Xms900M -Xmx1G"

我希望 kubectl cp 命令将内容从 pod 容器复制到本地

在您执行到容器中的原始命令中,您传递了 -c ubuntu 命令,这意味着您正在从 pod 中选择 Ubuntu 容器:

kubectl exec command-demo-67m2b -c 
ubuntu 
-- sh -c "ls /tmp"

但是,在您的 kubectl cp 命令中,您没有指定同一个容器:

kubectl cp command-demo-67m2b/ubuntu:/tmp /home

试试这个:

kubectl cp command-demo-67m2b:/tmp /home -c ubuntu