3. K8s 실전 활용을 위한 10단계

김하영·2021년 9월 30일
0

'15단계로 배우는 도커와 쿠버네티스' 기반으로 내용 정리하였습니다.

  • 디플로이먼트
    디플로이먼트의 역할 이해하기

디플로이먼트가 백엔드의 워크로드에 적합하다고 설명했다. ( FLO 서비스에 적합하군! )

주된 역할은

파드의 개수를 관리하는 것이다.

: K8s 클러스터에서는 파드가 서버의 역할을 담당한다. 그래서 처리 능력을 높이고 싶은 경우에는 파드의 수를 늘리면 된다. 파드의 개수를 관리하는 것은 시스템의 처리 능력, 서비스를 중간하지 않는 가용성, 그리고 비용 측면에서 매우 중요하다.

디플로이먼트는 요청한 개수만큼 파드를 기동하며, 장애 등의 이유로 파드의 개수가 줄어들면 새롭게 파드를 만들어 기동한다. 그리고 애플리케이션의 버전을 업그레이드 할 때 새로운 버전의 파드로 조금씩 바꾸는 기능도 제공한다.

로드밸런서에 해당하는 기능은 디플로이먼트에 포함되어 있지 않다. 이기능은 서비스가 담당하고 있다.
( 요청을 각 파드에 분산하여 처리하는 행위를 말함 )

디플로이먼트는 레플리카셋과 함께 동작한다.
레플리카셋은 디플로이먼트의 매니페스트에 적힌 레플리카의 값을 기준으로 파드의 개수를 제어한다.

8.1 디플로이먼트의 생성과 삭제

  • 생성

    kubectl apply -f <YAML_파일명>

  • 삭제

    kubectl delete -f <YAML_파일명>

  • 디플로이먼트 생성 YAML 파일

piVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
  labels:
    app: test-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: test-deployment
        image: nginx:1.7.9
        ports:
        - containerPort: 80

[디플로이먼트 사양]

  • replicas : 파드 템플릿을 사용해서 기동할 파드의 개수를 지정한다. 디플로이먼트는 이 값을 유지하도록 동작한다.
  • selector : 디플로이먼트 제어하의 레플리카셋과 파드를 대응시키기 위해 matchLabels의 라벨을 사용된다. 이 라벨이 파드 템플릿의 레이블과 일치하지 않으면, kubectl create/apply 시 에러가 발생한다.
  • template : 파드 템플릿

[파드 템플릿]

  • metadata : 이 라벨의 내용은 상기의 실렉터가 지정하는 라벨과 일치해야 한다.
  • containers : 파드의 컨테이너의 사양

8.2 스케일 기능

레플리카의 값을 변경하여 파드의 수를 조절하여 처리 능력을 높이거나 낮추는 기능을 말한다.
수동과 오토 스케일 기능이 존재한다.

replicas 값을 조절하여 apply 시, 지정한 값 대로 파드의 개수가 조절된다.

(우리는 오토 스케일 기능을 쓰겠지..?)

8.3 롤아웃 기능

쿠버네티스에서 롤아웃은 컨테이너의 업데이트를 의미한다.

롤아웃을 하기 위해서는 사전에 새로운 이미지를 빌드하고, 리포지터리에 등록해 놓아야 한다.

새로운 이미지를 매니페스트의 image 항목에 기재하고

'kubectl apply -f'

를 적용하면 롤아웃이 시작된다.

8.4 롤백 기능

쿠버네티스에서 롤아웃 전에 사용하던 예전 컨테이너로 되돌리는 것을 의미한다.
롤백을 할 때도 롤아웃과 마찬가지로 사용자의 요청을 처리하면서 파드를 점진적으로 교체한다.

데이터까지 롤백되는 것은 아니므로 데이터 리커버리는 별도로 구현해야 한다.

kubectl rollout undo deployment web-deploy

한 줄의 명령어로 롤아웃 취소가 가능하다!

8.5 파드의 IP 주소가 변경되는 경우와 아닌 경우

파드 재가동 시에는 IP 주소가 변경된다 . 즉, 스케일 / 롤아웃 / 롤백 다 해당한다.
컨테이너 재가동 시에는 IP 주소가 변경되지 않는다.

8.6 자동 복구

파드 내에 컨테이너가 어떤 이유로 종료한 경우, 기본 동작으로 파드가 컨테이너를 재시작한다.
즉, 파드는 컨테이너 수준의 장애에 대해 자동복구를 시도한다.

이에 반해 디플로이먼트의 자동 복구 기능은 파드 단위로 복구한다.
디플로이먼트는 성급하게 복구를 시도하지 않으며 천천히 신중하게 동작하도록 만들어졌다.

마무리

  • 롤아웃과 롤백은 서비스를 유지하면서 파드를 교체한다. 이를 위해서는 애플리케이션의 설계와 구현도 뒷받침 되어야 한다. ( 이거 설계가 제일 중요할 것 같은데.. 클라우드 전환 시...)
  • 자동 복구 기능은 노드 수준에서 장애가 발생했을 때 파드를 복구하는 기능이다.
  • 디플로이먼트, 퍼시스턴트 볼륨, 서비스 컨트롤러 이 3개를 조합하면 HA(고가용성) 구성이 가능하다.

[ 이번 스텝에서 새로 사용한 kubectl 명령어 ]

  • kubectl scale : 레프리카 값을 변경
  • kubectl rollout : 롤 아웃 상태 표시, 일시정지와 재개, 취소, ㅣㅇ력 표시
  • kubectl drain <노드명> : 가동 중인 파드를 다른 노드로 이동
  • kubectl cordon <노드명> : 노드에 새로운 파드의 스케줄 금지
  • kubectl uncordon <노드명> : 노드에 새로운 파드의 스케줄 재개
  • 목표 : 주말에 쿠버네티스 환경 로컬에 셋팅해야겠다!
profile
Back-end Developer

0개의 댓글