🥞 BE
home

Ch3. 쿠버네티스로 컨테이너 실행하기

목차

Kubectl

쿠버네티스 클러스터를 관리하는 동작은 대부분이 kubectl이라는 CLI로 실행할 수 있다.
kubectl에서 지원하는 명령들
쿠버네티스 자원들의 생성, 업데이트, 삭제(create, update, delete)
디버그, 모니터링, 트러블 슈팅(log, exec, cp, top, attach, …)
클러스터 관리(cordon, top, drain, taint, …)

Kubectl 설치

Kubespray, Kubeadm 등은 마스터 노드에 kubectl이 설치되어 있고, 마스터 노드에 접근하여 관리자 권한으로 kubectl 관련 명령들을 사용할 수 있다. 그런데 이 방식으로는 여러 사용자의 권한을 제어할 수 없다. 따라서 클러스터 사용자 각각은 클러스터 외부에 kubectl을 설치하고 인증 정보를 설정해야한다.
또는 OS에 따른 패키지 매니저로 최신 버전 설치가 가능하다.
# macOS(homebrew) brew install kubernetes-cli # 윈도우(chocolatey) choco install kubernetes-cli
Plain Text
복사

기본 사용법

kubectl은 다음 형식으로 명령을 작성한다.
kubectl [command] [TYPE] [NAME] [flags]
Plain Text
복사
command : 자원에 실행하려는 동작. create, update, delete 등
TYPE : 자원 타입. pod, service, ingress 등
NAME : 자원 이름.
flags : 부가적으로 설정할 옵션을 입력.
간단한 에코 서버(클라이언트가 전송하는 데이터를 그대로 되돌려 전송하는 서버)를 동작시키는 kubectl 명령 예
$ kubectl run echoserver --image="k8s.gcr.io/echoserver-arm:1.8" --port=8080 pod/echoserver created
Plain Text
복사
먼저 echoserver 파드 생성
$ kubectl expose po echoserver --type=NodePort service/echoserver exposed
Plain Text
복사
파드 접근을 위한 echoserver 이름의 서비스 생성
$ kubectl get pods NAME READY STATUS RESTARTS AGE echoserver 0/1 CrashLoopBackOff 15 (2m30s ago) 4h4m
Plain Text
복사
파드가 정상적으로 생성되었는지 확인
근데 READY가 0/1, STATUS에 CrashLoopBackOff가 떴다. kubectl logs echoserver echoserver 로 에러를 확인해보니, 맥북 M2칩에 맞는 arm 아키텍처용으로 빌드된 echoserver-arm 이미지를 사용하지 않았기 때문이었다. 따라서 kubectl delete pod echoserver 로 기존 파드를 삭제하고, kubectl run echoserver --image="k8s.gcr.io/echoserver-arm:1.10" --port=8080 명령어로 새로 설치했다.
그랬더니.. 이번엔 다음과 같이 떴다.
$ kubectl get pods NAME READY STATUS RESTARTS AGE echoserver 0/1 ImagePullBackOff 0 24s
Plain Text
복사
ImagePullBackOff는 또 뭘까…
구글링 결과 위에서 설치한 k8s.gcr.io/echoserver-arm:1.10 의 이미지 경로가 존재하지 않아서였다. 때문에 다시 삭제후 k8s.gcr.io/echoserver-arm:1.8 로 바꿔서 다시 파드를 생성했더니 성공했다.
$ kubectl get pods NAME READY STATUS RESTARTS AGE echoserver 1/1 Running 0 19s
Plain Text
복사
NAME : 파드 이름을 표시.
READY : 숫자/숫자 형태로 파드의 준비 상태를 표시.
0/1 : 현재 파드는 생성되었으나 사용될 준비가 되지 않음.
1/1 : 파드가 생성되었고 사용할 준비가 끝남.
STATUS : 파드의 현재 상태를 나타냄. Running은 파드가 실행되었다는 뜻. 온갖 오류가 있으니 아래의 참고문헌을 찾아보자..
RESTARTS : 해당 파드가 몇 번 재시작했는지를 표시. 아직 재시작하지 않았으므로 0.
AGE : 파드를 생성한 후 얼마나 시간이 지났는지 나타냄.
다음은 서비스가 정상적으로 생성되었는지 확인한다.
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echoserver NodePort 10.104.182.53 <none> 8080:32390/TCP 62s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m43s
Plain Text
복사
NAME : 서비스의 이름을 표시
TYPE : 서비스 타입을 뜻함.
CLUSTER-IP : 현재 클러스터 안에서 사용되는 IP
EXTERNAL-IP : 클러스터 외부에서 접속할 때 사용하는 IP
PORT(S) : 해당 서비스에 접속하는 포트를 표시함.
AGE : 자원을 생성한 후 얼마나 시간이 지났는지 나타냄.
에코 서버에 접속할 수 있도록 로컬 컴퓨터로 포트포워딩한다.
$ kubectl port-forward svc/echoserver 8080:8080 Forwarding from 127.0.0.1:8080 -> 8080 Forwarding from [::1]:8080 -> 8080
Plain Text
복사
http://localhost:8080 으로 접속.
에코 서버 실행
에코 서버 실행 후 테스트할 때는 다른 터미널 실행 후 curl http://localhost:8080 명령 실행
이후 에코 서버의 실행 중 로그를 수집할 때는 kubectl logs -f 파드이름 을 실행한다.
오류가 뜨긴 했지만 그냥 넘기자…
시간, HTTP 버전, 웹 브라우저, OS 버전 등의 정보를 확인할 수 있다.
이제 실습했던 파드와 서비스를 삭제한다.

Reference