4 분 소요

쿠버네티스 기초학습의 튜토리얼입니다.

이 가이드는 Learn Kubernetes Basics의 대화형 튜토리얼 요약한 내용입니다.
자세한 내용은 원문은 참고해주세요.
편의를 위해 애플리케이션 이라고로 줄였습니다.

이 가이드는 Docker Desktop + WSL2 Ubuntu 환경을 기준으로 소개합니다.


모듈.1: 클러스터 생성하기

1 단계: 클러스터 생성하고 실행하기

Docker Desktop 이면 이 과정은 필요 없습니다.


2 단계: 클러스터 버전 확인하기

kubectl 설치를 확인합니다:

kubectl version


3 단계: 클러스터 세부 정보 확인하기

클러스터 세부 정보를 확인합니다:

kubectl cluster-info

클러스터의 노드를 확인합니다:

kubectl get nodes




모듈.2: 앱 배포하기

1 단계: 앱 배포하기

디플로이먼트를 생성합니다:

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

생성된 디플로이먼트를 확인합니다:

kubectl get deployments


2 단계: 서버 확인하기

두 번째 터미널을 열어 프록시를 실행합니다:

echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; 
kubectl proxy  
  Starting to serve on 127.0.0.1:8001  

첫 번째 터미널에서 서버를 확인합니다:

curl http://localhost:8001/version




모듈.3: 앱 살펴보기

1 단계: 앱 설정 확인하기

파드를 확인합니다:

kubectl get pods

파드 내의 컨테이너와 이미지를 확인합니다:

kubectl describe pods


2 단계: 앱을 터미널에서 확인하기

파드 이름을 얻어 POD_NAME 환경변수에 저장합니다:

export POD_NAME=$(kubectl get pods -o go-template --template '\n')
echo Name of the Pod: $POD_NAME

앱 출력결과를 확인합니다:

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/


3 단계: 컨테이너 로그 확인하기

앱 로그를 확인합니다:
앱이 STDOUT 으로 보내는 모든 것이 컨테이너의 로그가 됩니다.
컨테이너 로그를 확인하기 위해서 다음 명령을 실행합니다:

kubectl logs $POD_NAME


4 단계: 실행 중인 컨테이너에서 직접 명령 실행하기

환경 변수를 리스팅합니다:

kubectl exec $POD_NAME -- env

bash 세션을 실행합니다:

kubectl exec -ti $POD_NAME -- bash

exit 로 컨테이너에서 나갑니다:

exit




모듈.4: 앱 노출하기

1 단계: 새 서비스 만들기

현재 서비스를 확인합니다:

kubectl get services

서비스 생성하고 노출합니다:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

현재 서비스를 다시 확인합니다:

kubectl get services

서비스의 오픈 포트를 확인합니다:

kubectl describe services/kubernetes-bootcamp

서비스의 NodePort 를 NODE_PORT 환경변수에 저장합니다:

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='')
echo NODE_PORT=$NODE_PORT

서비스에 접근합니다:

curl localhost:$NODE_PORT


2 단계: 레이블 사용하기

자동으로 생성된 디플로이먼트 레이블 확인하기

kubectl describe deployment

파드에서 레이블 쿼리하기(-l)

kubectl get pods -l app=kubernetes-bootcamp

서비스에서 레이블 쿼리하기(-l)

kubectl get services -l app=kubernetes-bootcamp

파드 이름을 얻어 POD_NAME 환경변수에 저장하기

export POD_NAME=$(kubectl get pods -o go-template --template '\n')
echo Name of the Pod: $POD_NAME

새 레이블을 적용하기 위해서 label 명령과 함께 객체 타입, 이름, 새 레이블을 입력합니다:

kubectl label pod $POD_NAME version=v1

그러면 파드에 새 레이블이 적용되고(앱 버전을 파드에 고정) 다음 명령으로 자세히 확인할 수 있습니다:

kubectl describe pods $POD_NAME

이제 레이블이 파드에 연결되어 있는 것을 볼 수 있습니다.
이제 새 레이블을 사용하여 파드 목록을 쿼리할 수 있습니다.

kubectl get pods -l version=v1


3 단계: 서비스 삭제하기

서비스를 삭제하려면 delete service 명령을 사용합니다.
여기에서도 레이블을 사용할 수 있습니다.

kubectl delete service -l app=kubernetes-bootcamp

서비스가 삭제되었는 지 확인합니다:

kubectl get services

라우팅이 더 이상 노출되지 않았는 지 확인하려면 이전에 노출되었던 IP 및 포트를 curl 합니다:

curl localhost:$NODE_PORT

파드 내부에서 앱이 여전히 실행 중인지 curl 을 사용하여 확인할 수 있습니다:

kubectl exec -ti $POD_NAME -- curl localhost:8080




모듈.5: 앱 스케일링하기

1 단계: 디플로이먼트 스케일링하기

디플로이먼트를 리스팅하려면 get deployments 명령을 사용합니다:

kubectl get deployments

실행 결과는 다음과 같습니다:

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           11m

디플로이먼트로 생성된 레플리카셋(ReplicaSet)을 확인하기 위해 다음 명령을 실행합니다:

kubectl get rs

레플리카셋의 이름은 항상 [DEPLOYMENT-NAME]-[RANDOM-STRING] 형식입니다.
랜덤 문자열은 무작위로 생성되며 pod-template-hash 를 시드로 사용합니다.

다음으로 디플로이먼트를 레플리카 4 개로 확장하겠습니다.
kubectl scale 명령어를 뒤에 디플로이먼트 타입, 이름 및 원하는 인스턴스 수를 지정합니다:

kubectl scale deployments/kubernetes-bootcamp --replicas=4

get deployments 명령으로 디플로이먼트를 다시 리스팅합니다:

kubectl get deployments

변경 사항이 적용되었으며 4개의 앱 인스턴스를 사용할 수 있습니다. 다음으로 파드 수가 변경되었는 지 확인하겠습니다:

kubectl get pods -o wide

이제 다른 IP 주소를 가진 4개의 파드가 있습니다. 변경사항이 디플로이먼트 이벤트 로그에 기록되었습니다. 이를 확인하려면 describe 명령을 사용합니다.

kubectl describe deployments/kubernetes-bootcamp


2 단계: 로드밸런싱하기

서비스가 트래픽 부하를 분산하고 있는지 확인합니다.
노출된 IP 및 포트를 찾기 위해 이전 모듈에서 배운 describe service 를 사용합니다:

kubectl describe services/kubernetes-bootcamp

서비스의 NodePort 를 NODE_PORT 환경변수에 저장합니다:

export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='')
echo NODE_PORT=$NODE_PORT

노출된 IP 및 포트에 대해 curl 을 수행합니다.
명령을 여러 번 실행하세요.

curl localhost:$NODE_PORT

모든 요청에 대해 다른 포드에서 처리하는 것을 확인했습니다.
이것은 로드밸런싱이 동작하고 있음을 보여줍니다.


3 단계: 스케일 다운

서비스를 2 개의 레플리카로 축소하기위해 scale 명령을 다시 실행합니다:

kubectl scale deployments/kubernetes-bootcamp --replicas=2

디플로이먼트를 리스트하여 get deployments 명령으로 변경 사항이 적용되었는지 확인합니다:

kubectl get deployments

레플리카 수가 2로 감소했습니다. get pod 명령을 사용하여 파드 수를 리스트합니다.

kubectl get pods -o wide

이 명령으로 2 개의 파드가 종료되었는 지 확인합니다.




모듈.6: 앱 업데이트하기

1 단계: 앱 버전 업데이트하기

디플로이먼트를 리스팅하려면 get deployments 명령을 사용합니다:

kubectl get deployments

실행중인 파드를 나열하려면 get pods 명령어를 사용합니다.

kubectl get pods

앱의 현재 이미지 버전을 보려면 파드에 대해 describe 명령어를 실행합니다(이미지 필드 확인).

kubectl describe pods

앱의 이미지를 버전2 로 업데이트하려면 set image 명령을 사용한 다음 배포 이름과 새 이미지 버전을 지정합니다.

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

이 명령은 앱에 다른 이미지를 사용하도록 디플로이먼트에 알리고 지속적 업데이트를 시작했습니다.
새 파드의 상태를 확인하고 get pods 명령으로 종료되는 이전 파드를 확인합니다.

kubectl get pods 




참고자료

댓글남기기