본문 바로가기
킷도우의 클라우드, 쿠버네티스/쿠버네티스(kubernetes)

[kubectl 명령어 정리] kubectl exec, kubectl cp (쿠버네티스 클러스터에서 컨테이너로 터미널 접속하는 방법 및 로컬 머신, 컨테이너간 파일 복사 방법)

by 킷도우 2023. 2. 6.
반응형

안녕하세요. IT Window 킷도우입니다.

오늘 여러분들에게 소개시켜 드릴 글은 바로 쿠버네티스 클러스터에서 내가 만든 컨테이너에 직접 터미널로 접속하는 방법과 [로컬 머신↔컨테이너]간 파일을 자유롭게 이동하는 방법에 대해서 공유드리도록 하겠습니다.

 

글을 시작하기 앞서 GCP 환경에서 GKE(구글 쿠버네티스 엔진)을 활용해 쿠버네티스 클러스터를 구축하는 방법이 궁금하신 분들은 아래 링크를 참조해 주세요.

https://kitdow.tistory.com/23

 

[구글 클라우드 플랫폼] GCP 프로젝트 생성, GKE(Google Kubernetes Engine) API 활성화 및 VM 생성 방법

안녕하세요. IT Window 킷도우입니다. BBQ 신입 연봉 33.5% 파격 인상! 우리도 열심히 하다보면 좋은 날이 오겠죠? ㅎㅎ 오늘 포스팅할 글은 바로 GCP 구글 클라우드 플랫폼에서 프로젝트를 만들고, 가

kitdow.tistory.com

 

쿠버네티스 클러스터에 접속하고 위 kubectl exec, cp 명령어를 테스트 하기에 위해 test-pod.yaml 매니페스트 파일을 아래와 같이 하나 만들어 주겠습니다.

cat <<EOF > test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
 name: test-pod
spec:
 containers:
 - name: nginx-container
   image: nginx:1.16
EOF

pod를 생성하고 정사적으로 동작하는 조회해 보겠습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl apply -f test-pod.yaml
pod/test-pod created
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
test-pod   1/1     Running   0          15s

네 테스트를 위한 준비가 끝났습니다. 바로 본론으로 들어가겠습니다.

 

1. 컨테이너에 접속하는 방법

결론부터 말씀드리면 컨테이너에 접속하는 방법은 아래 명령어를 활용하면 됩니다.

kubectl exec -it (pod name) -c (컨테이너 이름) -- (컨테이너에서 실행하고 싶은 명령어)

명령어에 대해 설명 드리면

-it 옵션 : it 옵션에서 t는 터미널을 생성하겠다는 것을 의미합니다. i는 표준 입출력을 사용하겠다는 의미입니다. 즉 -it 옵션은 터미널로 명령어를 전달하고 결과를 받겠다 정도의 의미로 받아드리시면 됩니다.

-c 옵션 : 접속하고자하는 컨테이너를 지정합니다.

-- 이후 : it 옵션을 사용한만큼 컨테이너에서 실행할 명령어를 해당 구문에 정의합니다. 반드시 한 칸 띄어쓰기를 하고 작성해야합니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl exec -it test-pod -c nginx-container -- /bin/bash
root@test-pod:/# cd /bin
root@test-pod:/bin# ls
bash   chmod  dash  df     dnsdomainname  egrep  findmnt  gzexe     ln     lsblk  mktemp  mountpoint     pidof  readlink  run-parts  sleep  sync      touch   uname       wdctl         zcat   zegrep  zgrep  znew
cat    chown  date  dir    domainname     false  grep     gzip      login  mkdir  more    mv             pwd    rm        sed        stty   tar       true    uncompress  which         zcmp   zfgrep  zless
chgrp  cp     dd    dmesg  echo           fgrep  gunzip   hostname  ls     mknod  mount   nisdomainname  rbash  rmdir     sh         su     tempfile  umount  vdir        ypdomainname  zdiff  zforce  zmore

위처럼 우리가 생성한 pod 내 nginx-container의 root 계정으로 접속이 된걸 볼 수 있습니다.

 

그럼 꼭 컨테이너에서 뭔가 작업을 해주려면 반드시 터미널로 붙어서 작업을 해줘야 할까요? 정답은 아닙니다. 참고로 이렇게 곧장 컨테이너에 접속이 돼버린 건 /bin 폴더 밑에 bash 명령어를 실행했기 때문인데요. 위에 보시는 것처럼 bin 폴더 밑에는 다양한 명령어들이 있습니다. bash, ls, mkdir 등등 우리가 흔히 알고 잇는 linux 명령어들입니다. 즉, 컨테이너에 접속하지 않고도 /bin/ls , /bin/mkdir 등의 명령어를 활용하면 쿠버네티스 클러스터(로컬 머신)에서도 충분히 원격에서 작업할 수 있습니다.

 

추가로, 저 bin 폴더 밑에 없는 명령어들은 다운을 받아줘야 되겠죠? curl같은 명령어는 없으니 apt-get install curl과 같이 직접 명령어를 다운받도록 합시다.

 

그리고 터미널에서 빠져나올 땐 exit 명령어를 사용합니다!

반응형

 

2. 컨테이너에 파일 복사하기

다음으로 이번엔 로컬 머신에서 파일을 하나 만들고 컨테이너로 파일을 복사해 보겠습니다. 반대로 컨테이너에서 만든 파일을 로컬 머신으로 복사할 수도 있습니다. 사용법은 간단합니다.

kubectl cp (복사하고 싶은 파일) 컨테이너 명:(복사할 파일 위치)

 

우선 로컬 머신에서 아래와 같이 파일 하나를 만들어 주겠습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ cat <<EOF > cp-test
> copy test!
> EOF
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ ls
cp-test  README-cloudshell.txt  test-pod.yaml
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ cat cp-test
copy test!

kubectl 명령어를 활용해 nginx-container 컨테이너로 해당 파일을 복사해보겠습니다. 그리고 이번엔 bash로 직접 터미널에 붙지 않고 로컬 머신에서 kubectl을 활용해 컨테이너에 파일이 잘 복사 됐는지 확인해 보겠습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl cp cp-test test-pod:/usr
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl exec -it test-pod -c nginx-container -- /bin/ls /usr
bin  cp-test  games  include  lib  local  sbin  share  src
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl exec -it test-pod -c nginx-container -- /bin/cat cp-test
/bin/cat: cp-test: No such file or directory
command terminated with exit code 1
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl exec -it test-pod -c nginx-container -- /bin/cat /usr/cp-test
copy test!

 

이번엔 역으로 컨테이너에서 로컬 머신으로 파일을 복사해 보겠습니다. cp-test 내용은 그대로 하고 파일명만 cp-test2로 변경하여 로컬 머신으로 가져와 보겟습니다.

kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ kubectl cp test-pod:usr/cp-test ./cp-test2
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ ls
cp-test  cp-test2  README-cloudshell.txt  test-pod.yaml
kitdow_on@cloudshell:~ (gke-cloud-nexacro)$ cat cp-test2
copy test!

네 이렇게 정상적으로 복사가 된 것을 활인할 수 있습니다.

이상으로 오늘도 포스팅 마치겠습니다.

 

감사합니다!

반응형

댓글