2 분 소요

OS환경은 Windows 10 기준으로 작성되었습니다.

3.2 쿠버네티스 기본 사용법 배우기

3.2.1 파드를 생성하는 방법

  kubectl run nginx-pod --image=nginx 
  kubectl create nginx --image=nginx

run과 create 차이

  • run으로 파드를 생성하면 단일 파드 1개만 생성되고 관리 된다.
  • create deployment 로 생성하면 디플로이먼트 라는 관리 그룹 내에서 파드가 생성된다.

3.2.2 오브젝트란

  • 쿠버네티스를 사용하는 관점에서 파드와 디플로이먼트는 스펙상태 등의 값을 가지고 있다.
  • 이러한 값을 가지고 있는 파드와 디플로이먼트를 개별 속성을 포함해 오브젝트라 한다.

기본 오브젝트

  • 파드
    • 쿠버네티스에서 실행되는 최소 단위
    • 독립적인 공간과 사용 가능한 IP를 가지고 있음.
  • 네임스페이스
    • 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹.
    • 기본으로 할당 되는 default
    • 쿠버네티스 시스템에서 사용되는 kube-system
    • 쿠버네티스 외부에서 내부로 접속하게 도와주는 metallb-system
  • 볼륨
    • 파드 생성시 파드에 사용할 디렉터리를 임시로 제공하나 설정을 통해 저장과 보존이 가능한 디렉터리를 사용할 수 도 있다
  • 서비스
    • 파드 접속을 안정적으로 유지하도록 서비스를 통해 내/외부로 연결.
    • 기존 인프라에서 로드밸런서, 게이트웨이와 비슷한 역할

디플로이먼트

  • 기본 오브젝트만으로 쿠버네티스를 사용하기에는 한계가 있어서 좀 더 효율적으로 작동하도록 기능들을 조합하고 추가해 구현한 것.
  • 파드에 기반을 두며,레플리카셋 오브젝트를 합쳐놓은 형태.

3.2.3 레플리카셋으로 파드 수 관리하기

  • --replicas 옵션을 통해 파드의 개수를 지정할 수 있다.
    kubectl scale deployment dpy-nginx --replicas=3
    
  • kubectl get pods -o wide 명령어를 통해 모든 파드가 워커 노드에 적용되고 IP가 부여ㅑ 됬는지 확인 할 수있다.
    kubectl delete deployment dpy-nginx
    
  • kubectl delete deployment dpy-nginx 명령어를 통해 생성한 디플로이먼트를 삭제할 수 있 다.
    kubectl delete deployment dpy-nginx
    

3.2.4 스펙을 지정해 오브젝트 생성하기

  • 오브젝트 스펙은 야믈(YAML) 문법으로 작성한다.
  • 야믈 파일을 참조하여 생성 된 디플로이먼트는 sed 라는 명령어로 속성을 변경한다. 또는 참조하는 야믈 파일을 직접 수정해도 된다.

3.2.5 apply로 오브젝트 생성하고 관리하기

  • run의 단점이 많아 쿠버네티스에서는 apply라는 명령어를 제공한다.
  • 명령창에 직접 애드혹(일회적 사용)으로 오브젝트를 생성할때는 create를 사용하고, 변경이 생길 가능성이 있는 복잡한 오브젝트는 파일로 작성한 후 apply로 적용하는것이 좋다.

  • 오브젝트 생성 명령어 비교 |구분|Run|Create|Apply| |:—:|:—:|:—:|:—:| |명령 실행|제한적임|가능함|안 됨| |파일 실행|안 됨|가능함|가능함| |변경 가능|안 됨|안 됨|가능함| |실행 편의성|매우 좋음|매우 좋음|좋음| |기능 유지|제한적임|지원됨|다양하게 지원됨|

3.2.6 파드의 컨테이너 자동 복구 방법

  • 파드의 자동 복구 기술을 셀프 힐링 이라고 한다.

  • nginx-pod 컨테이너에서 배시셸에 접속.
    kubectl exec -it nginx-pod -- /bin/bash
    
  • 컨테이너에서 구동하는 nginx의 PID 확인
    cat /run/nginx.pid
    
  • 터미널을 한개 더 띄우고 nginx-pod에서 돌아가는 웹페이지를 1초마다 한번씩 요청
    i=1; while true; do sleep 1; echo $((i+++)) `curl --silent 아이피 | grep title` ; done
    
  • 배시 셸에서 nginx 프로세서인 PID 1번을 kill 명령어로 종료
    kill 1
    

3.2.7 파드의 동작 보증 기능

  • 파드 자체에 문제가 발생하면 파드를 자동 복구해서 파드가 항상 동작하도록 보장.
  • replicas는 파드를 선언한 수대로 유지하도록 항상 확인하고 부족하면 새로운 파드를 만든다.
  • 파드의 동작을 보장하기 위한 조건으로는 디플로이먼트로 생성해야 한다.

3.2.8 노드 자원 보호하기

  • 노드는 쿠버네티스 스케줄러에서 파드를 할당받고 처리하는 역할
  • cordon 명령을 통해 문제가 생길 가능성이 있는 노드에 파드가 할당되지 않게 스케줄되지 않는 상태라는 표시를 한다.
  • uncordon 명령어로 파드가 할당되지 않게 설정했던 것을 해제 할수 있다.

3.2.9 노드 유지보수하기

  • drain은 지정된 노드의 파드를 전부 다른 곳으로 이동시켜 해당 노드를 유지보수 할 수 있게 한다.
  • 파드는 언제라도 삭제할 수 있기 때문에 drain은 실제로 파드를 옮기는 것이 아니라 노드에서 파드를 삭제하고 다른 곳에 다시 생성한다.

3.2.10 파드 업데이트하고 복구하기

업데이트하기

  • --record 옵션은 배포한 정보의 히스토리를 기록한다.
    kubectl apply -f ~~~~.yaml --record deployment.apps/rollout-nginx created
    
  • --record 옵션으로 기록된 히스토리는 rollout history 명령으로 확인이 가능하다.
    kubectl rollout history deployment rollout-nginx
    
  • set image 명령으로 파드의 nginx 컨테이너 버전을 1.16.0으로 업데이트
    kubectl set image deployment rollout-nginx nginx=nginx:1.16.0 --record deployment.apps/rollout-nginx image updated
    

업데이트 실패 시 파드 복구하기

  • rollout history 명령으로 실행된 명령어 히스토리를 확인한다.
  • rollout undo 명령어로 명령 실행을 취소하여 이전 단계로 상태를 되돌린다.

특정 시점으로 파드 복구하기

  • --to-revision 옵션으로 특정 시점으로 돌아갈 수 있다.
  • 처음상태인 revision 1 로 돌아가고 싶다면 아래와 같이 입력하면 된다.
    kubectl rollout undo deployment rollout-nginx --to-revision=1