목차
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 버전 등의 정보를 확인할 수 있다.
이제 실습했던 파드와 서비스를 삭제한다.