이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

105. kubectl cp 명령 특징

이쿠우우 2022. 7. 5. 08:32
반응형

 

 
 

 

kubectl cp 명령 특징

 

 

목표

kubectl cp 명령의 특징에 대해 알아봄
 
 

 

kubectl cp 특징 (tar)

 
kubectl cp 명령은 
kubernetes cluster에 배포되어있는 pod간에 file, directory 복사를 해주는 명령어.
pod -> host
host > pod
전송이 가능함.
 
kubectl 코드의 cp 부분을 확인해 보면 
cp 명령은 tar를 통해 진행된다는 것을 알 수 있음.
# !!!Important Note!!!
Requires that the 'tar' binary is present in your container
# image.  If 'tar' is not present, 'kubectl cp' will fail.
#
# For advanced use cases, such as symlinks, wildcard expansion or
# file mode preservation, consider using 'kubectl exec'.
# Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
tar cf - /tmp/foo | kubectl exec -i -n <some-namespace> <some-pod> -- tar xf - -C /tmp/bar
# Copy /tmp/foo from a remote pod to /tmp/bar locally
kubectl exec -n <some-namespace> <some-pod> -- tar cf - /tmp/foo | tar xf - -C /tmp/bar
# Copy /tmp/foo_dir local directory to /tmp/bar_dir in a remote pod in the default namespace
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
# Copy /tmp/foo local file to /tmp/bar in a remote pod in a specific container
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>
# Copy /tmp/foo local file to /tmp/bar in a remote pod in namespace <some-namespace>
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar
# Copy /tmp/foo from a remote pod to /tmp/bar locally
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar`))
 
 
복사하고자 하는 대상을 tar로 압축 한 후 전송하고
도착지에서 tar압축을 해제하는 과정으로 진행됨.
 
pod -> host,
host -> pod 모두 양쪽에 tar 명령이 사용 가능해야 cp 명령을 사용할 수 있음.
 
다음과 같이 scratch container의 경우
container에 tar가 없어서 kubectl cp 명령이 불가능함
 
pod(scratch container) -> host 

 

host -> pod(scratch container)

 
 

 

docker cp의 경우

 
kubectl cp 명령은 tar에 기반하지만
docker cp는 tar없이 사용 가능함.
 
다음과 같이 scratch container에 cp 명령 사용 시 정상적으로 파일이 복사 됨.
directory를 통째로 복사해도 tar를 사용하지 않기 때문에 
link 파일을 포함해서 모두 하드 copy됨.

 
 
 

 
 

cp 사용 시 tar 압축 과정에서 symblic 파일 누락 해결법

 
kubectl cp 명령으로 directory를 통째로 복사하는 경우 다음과 같이
symlink 파일은 누락되는 문제가 발생함.

 

원인

tar 압축 명령의 특징 때문에 발생.
 

해결법

해당 문제를 해결하기 위해서는 kubectl exec 로 tar 명령을 직접 사용해야함.
심볼릭 링크, 와일드카드 확장, 파일 모드 보존과 같은 고급 사용 사례에 대해서는
kubectl exec 를 고려해야함.
 
[로컬 파일 /tmp/foo 를 my-namespace 네임스페이스의 my-pod 파드 안의 /tmp/bar 로 복사]
tar zcf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar zxf - -C /tmp/bar          
 
[my-namespace 네임스페이스의 my-pod 파드 안의 파일 /tmp/foo 를 로컬의 /tmp/bar 로 복사]
kubectl exec -n my-namespace my-pod -- tar zcf - /tmp/foo | tar zxf - -C /tmp/bar   
 
(주의사항)
symlink 까지 복사하기 위해서는
kubectl exec 명령으로 tar zcf 로 압축하고 tar zxf 로 해제해야함
 
참고
 
 
그외 해결방법 참고

 


 

tar가 없는 경우 대처방법

 
 

rsync 사용

container와 host간에 rsync 기능을 사용해서
동기화 처리하여 
host에서 container file 내용을 확인 할 수 있는 방법이 있음.
 
 
 
 

ksync 사용

 
host와 kubernetes cluster에 배포되어있는 pod의 container와 동기화 됨.
container directory가 host에 그대로 복사되고
host에서 내용을 수정하면 container에 바로 반영됨.
말그대로 동기화.
 
[주의 사항]
ksync는 container runtime tool이 docker로 설정되어있어야만 사용할 수 있음.
 
[설치 방법]
ksync init
 
[결과]
curl 명령으로 ksync 설치하고
ksync를 초기화하고 클러스터에 서버 구성 요소를 설치함. (일회성 작업)

[설치 확인]

반응형