쿠버네티스는 컨테이너 오케스트레이션 툴
※ 오케스트레이션: 컨테이너를 스케줄링/클러스터링/서비스 디스커버리/로깅 및 모니터링 하는 것
애플리케이션을 물리 서버에서 실행함. 성능 저하를 대비해 여러 물리 서버에서 각 애플리케이션을 실행함. 물리 서버를 많이 유지하기 위한 인력과 비용이 많이 발생함
단일 물리 서버에서 가상화를 사용하여 VM 간에 애플리케이션을 격리하여 리소스를 보다 효율적으로 사용할 수 있음
VM과 유사하지만 애플리케이션 간에 운영체제를 공유함. 그러므로 컨테이너는 VM 환경보다 가벼움
yaml 파일을 이용하여 매번 명령어를 입력할 필요 없어 더욱 손쉽게 쿠버네티스를 다룰 수 있다.
yaml 파일만 잘 작성해 둔다면 대규모 인프라도 명령어 몇번 만으로 생성이나, 수정, 삭제등을 할 수 있다.
쿠버네티스를 구성하고 기본으로 생성된 파드들을 출력하면 아래와 같이 나온다.
nginx 이미지를 이용해 간단하게 pod, deployment를 생성하고 지워보자
kubectl run nginx-pod --image=nginx nginx #nginx 이미지로 파드 생성
kubectl get pod #생성된 파드 확인
kubectl delete pod nginx-pod #생성한 파드 삭제
kubectl create deployment nginx-deploy --image=nginx #디플로이먼트 방식으로 생성
kubectl get pod
kubectl scale deployment nginx-deploy --replicas=3 #파드 수를 증가
kubectl get pod
kubectl delete deployment nginx-deploy #디플로이먼트 삭제
앞서 설명한 yaml 파일을 이용해 더 쉽게 오브젝트를 생성 및 관리할 수 있다.
간단하게 nginx deployment를 생성하는 파일을 만든 후 nginx-deploy.yaml라는 이름으로 저장한다.
kubectl create -f nginx-deploy.yaml #create로 위의 yaml 파일에 기재된 스펙으로 오브젝트를 생성
kubectl get pods
replicas:3 -> replicas: 6 #nginx-deploy.yaml의 replicas를 3에서 6으로 변경
kubectl create -f nginx-deploy.yaml #create는 리소스를 새로 생성하는 명령어이기 때문에 create를 사용할 시 명령어가 적용되지 않는다.
kubectl apply -f nginx-deploy.yaml #따라서 apply를 통해 바뀐 내용을 적용한다.
kubectl get pods #파드의 개수가 증가하였는지 확인
kubectl get pods #앞서 생성한 파드 목록을 확인
kubectl delete pods nginx-pod-6799fc88d8-7dbrk #생성한 파드 중 하나를 삭제한다. 파드 이름은 임의로 생성되기 때문에 예시와 다를 것이다.
kubectl get pods #파드를 삭제하였지만 다른 파드가 추가로 생성되어 6개를 유지한다.
kubectl exec -it 파드이름 #bin/bash 생성한 nginx pods 중 하나 접속
cat /run/nginx/pid #nginx 프로세서 ID 확인
kill 1 #nginx 프로세서를 종료함
kubectl get pods #접속했던 pod의 restarts 숫자 확인
※ kubectl get pods -w 로 'w' 옵션을 주면 파드의 상태를 실시간으로 확인할 수 있다.
nginx 프로세스가 종료되었지만 다시 복구하여 Running 상태로 바뀌는 걸 볼 수 있다
파드를 업데이트 해야하는 상황에서 파드를 지우고 다시 만드는 것 보단 아래의 방법으로 더욱 쉽게 파드를 업데이트 할 수 있다.
kubectl apply -f rollout-nginx.yaml --record #현재 상태를 기록
kubectl rollout history deployment rollout-nginx #기록 확인
kubectl exec -it 파드이름 /bin/bash #파드에 접속
nginx -v #nginx 버전을 확인한다.
kubectl set image deployment rollout-nginx nginx=nginx:1.16.0 --record #nginx의 버전을 업데이트 한다.
kubectl get pods -w #파드가 업데이트 되는 걸 확인한다.
kubectl rollout status deployment rollout-nginx #상태 확인
kubectl exec -it 파드이름 /bin/bash #다시 한 번 파드에 접속 후 버전이 바뀌었는지 확인한다.
파드를 업데이트 하였지만 배포한 코드 및 다른 이유들로 파드에 에러가 발생할 경우 아래와 같이 조치할 수 있다.
kubectl set image deployment rollout-nginx nginx=nginx:1.17.23 --record #nginx에 존재하지 않는 버전으로 업데이트를 시도하여 에러를 유발
kubectl get pods #파드 상태 확인
kubectl rollout history deployment rollout-nginx #업데이트 내역을 확인
kubectl rollout undo deployment rollout-nginx #이전 버전으로 롤백하는 명령
kubectl get pods
kubectl rollout history deployment rollout-nginx #다시 한 번 업데이트 내역을 확인하여 전과 어떤 부분이 달라졌는지 체크한다.
kubectl rollout status deployment rollout-nginx
kubectl exec -it 파드이름 /bin/bash
nginx -v #nginx 버전을 확인하여 1.17.23으로 올리기 전으로 돌아갔는지 체크한다.
이전 버전이 아닌 특정 시점으로 파드를 복구할 수도 있다.
kubectl rollout history deployment rollout-nginx #업데이트 내역을 다시 확인한다.
kubectl rollout undo deployment rollout-nginx --to-revision=1 #이번엔 우리가 되돌리고 싶은 버전을 명시하여 복구를 시도한다.
kubectl get pods -w
kubectl exec -it 파드이름 /bin/bash
nginx -v 버전 확인 #nginx 버전이 잘 바뀌었는지 확인
kubectl delete -f rollout-nginx.yaml #실습이 끝났으니 삭제를 원하면 해당 명령어를 입력한다.