[kubernetes] 컨트롤러 - Replicaset, Deployment, DaemonSet

Hoon·2022년 9월 11일
0

Kubernetes

목록 보기
4/7
post-thumbnail

controler 종류

  1. 레플리카세트, 디플로이먼트: 웹 서비스 처럼 오랜 시간동안 계속 실행되어야 하는 파드들을 관리할 때 주로 사용
  2. 데몬세트: 클러스터의 전체 노드에 같은 파드를 실행할 때 사용
  3. 스테이트풀세트: stateful 앱을 실행할 때 사용하도록 만듦
  4. 잡: 1회성 작업을 할 때 사용
  5. 크론잡: 주기적인 배치 작업을 실행할 때 사용

ReplicaSet

  • set-based selector 지원
  • replicas로 지정한 파드 개수를 라벨을 기준으로 맞춰 줌.
  • 파드를 실행하던 노드에 장애가 발생하여 파드가 종료된다면 클러스터 안 다른 노드에 다시 파드를 실행시킨다.
  • yaml 파일 명세 (예시는 아래 deployment에서 참고)
    • metadata.name: 레플리카세트 이름
    • spec.metadata.name: 파드 이름
    • spec.metadata.labels.app: 오브젝트를 식별하는 레이블이 앱 컨테이너고 해당 이름으로 식별한다고 설정.
    • spec.replicas: 파드를 몇 개 유지할지 개수 지정
    • spec.selector: 어떤 레이블의 파드를 선택해서 관리할지를 설정. 레이블을 기준으로 파드를 관리하므로 실행중인 파드르 중단하거나 재시작하지않고 레플리케이션 컨트롤러가 관리하는 파드를 변경할 수 있다. spec.template.metadata.labels의 하위 필드 설정과 spec.selector.matchLabels의 하위 필드 설정이 같아야 한다. 템플릿에 별도의 spec.selctor 설정이 없으면 spec.template.metadata.labesl.app에 있는 내용을 기본값으로 설정한다.

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
        image: nginx
        ports:
        - containerPort: 80
  • nginx-deployment: 디플로이 이름. nginx-deployment-69cfxxxxx: 디플로이가 관리하는 레플리카 세트. 69cfxxxx는 레플리카세트를 구분하는 UUID 해시 문자. nginx-deployment-69cfxxxxx-yyyyyy 형식의 파드들이 생성

컨테이너 이미지 설정 정보 업데이트 방법

  1. kubectl set 명령으로 직접 컨테이너 이미지를 지정
  2. kubectl edit 명령으로 현재 파드의 설정 정보를 연 다음 컨테이너 이미지 정보 수정
  • kubectl edit deploy nginx-deployment -> image 부분 수정
  1. 처음 적용했던 템플릿의 컨테이너 이미지 정보를 수정한 다음 apply로 재 배포

디플로이먼트 롤백

  • kubectl rollout histroy deploy 디플로이먼트이름 으로 확인
  • --revision==리비전숫자 옵션으로 특정 리비전의 상세 내용 확인
  • kubectl rollout undo deploy 디플로이먼트이름: 이전 리비전으로 되돌림. 되돌리면 레플리카세트 이름이 이전 버전으로 바뀜.
    리비전 버전도 바뀐다. 여기서 CHANGE-CAUSE는 해당 리비전에서 무엇을 수정했는지 확인하기 위한 옵션이다. CHANGE-CAUSE에 내용을 출력하려면 metadata.annotaitions 필드를 추가하면 된다.

디플로이먼트 상태

  • Progressing, complete, failed
  • kubectl rollout status 로 확인 가능
  • Progressing
    • 디플로이먼트가 새로운 레플리카세트를 만들 때
    • 디플로이먼트가 새로운 레플리카세트의 파드 개수를 늘릴 때
    • 디플로이먼트가 예전 레플리카세트의 파드 개수를 줄일 때
    • 새로운 파드가 준비 상태가 되거나 이용 가능한 상태가 되었을 때
  • Complete
    • 디플로이먼트가 관리하는 모든 레플리카세트가 업데이트 완료되었을 때
    • 모든 레플리카세트가 사용 가능해졌을 때
    • 예전 레플리카세트가 모두 종료되었을 때
  • Faild 원인
    • 쿼터 부족
    • readinessProbe 진단 실패
    • 컨테이너 이미지 가져오기 에러
    • 권한 부족
    • 제한 범위 초과
    • 앱 실행 조건을 잘못 지정

Daemonset

  • 클러스터 전체 노드에 특정 파드를 실행할 때 사용하는 컨트롤러. 클러스터안에 새롭게 노드가 추가 되었을 때 데몬세트가 자동으로 해당 노드에 파드를 실행시킨다.
  • 따라서 보통 로그 수집기, 모니터링용 데몬 등을 사용
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: flu-ES
  namespace: kube-system
  labels:
    k8s-app: flu-log
spec:
  selector:
    matchLabels:
      name: flu-ES
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: flu-ES
    spec:
      containers:
      - name: flu-ES
        image: fluent/fluentd-kubernetes-daemonset:elasticsearch
        env:
        - name: testenv
          value: value
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
  • 로그 수집기는 쿠버네티스 관리용 파드나 설정에 해당하므로 kube-system 네임스페이스로 지정
  • 데몬세트의 파드를 업데이트하는 방법은 spec.updateStrategy.type 필드 값을 설정하는 것.
    • OnDelete: 데몬셋의 템플릿을 수정하더라도 바로 적용되지 않는다. 변경된 템플릿을 적용하려면 데몬셋으로 실행한 포드를 직접 지워야지 그 노드에 새로운 템플릿 버전의 포드가 실행.
      출처: https://arisu1000.tistory.com/27834 [아리수:티스토리]
    • RollingUpdate: 기본 값. 템플릿을 변경하면 바로 변경사항 반영. 모든 파드를 한번에 변경하지 않고 지정한 개수만큼 이전 파드를 삭제 후 실행.

Reference

  • 정원천, 공용준, 홍석용, 정경록. 『쿠버네티스 입문 : 90가지 예제로 배우는 컨테이너 관리 자동화 표준』동양북스, 2020

0개의 댓글