[구름 k8s] TIL 3-2-3

Peppie·2022년 10월 13일
0

1. ReplicaSet

ReplicaSet

Pod를 정해진 수만큼 복제하고 관리
쿠버네티스 : 사용자가 요청한 상태 (자동으로) 유지관리 목적

  • Pod : 쿠버네티스 기본 단위; 한 개 또는 여러 개의 컨테이너를 추상화해 하나의 어플리케이션으로 동작하도록 만드는 컨테이너 묶음

  • 사용자가 직접 또는 YAML 파일을 정의해 Pod를 생성하면 해당 Pod의 생명주기는 오직 사용자에 의해서만 관리

  • 마이크로 서비스 아키텍처 구조의 어플리케이션을 배포하기 위해서는 여러 개의 Pod를 생성하여 배포

  • 따라서 사용자는 여러개의 Pod를 생성하여 외부 요청을 여러 Pod에 분배하는 방식으로 구성

동일한 여러 개의 Pod 생성 방법

  • 다른 이름을 갖는 여러 개의 Pod 직접 생성
    • 동일한 Pod 여러 개를 직접 생성
    • 만약 Pod가 어떤 이유에 의해 중지되었을 때 사용자가 직접 Pod를 생성/삭제하여 복구해야 함
  • 사용자가 직접 Pod을 관리한다면 -> 쿠버네티스를 사용하는 의미 X

ReplicaSet 동작

정해진 동일한 Pod가 항상 실행되도록 관리 => 사용자가 요구하는 상태가 되도록 Pod 관리

노드 (워커 노드) 장애 등의 이유로 Pod를 사용할 수 없다면 다른 노드 (워커 노드)에서 Pod를 재생성

ReplicaSet 실습

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx-pods-label
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx-pods-label
    spec: 
      containers:
        - name: nginx
          image: nginx:1.20.0
          ports:
            - containerPort: 80
  • spec.replicas : 동일한 Pod 유지할 개수
  • spec.selector.matchLabels : (ReplicaSet이 검색하는) 라벨 체크 조건
  • spec.template : (ReplicaSet에 의해) 생성할 Pod 명시

  • kubectl get replicasets : ReplicaSet 목록
  • kubectl describe replicaset/<ReplicaSet 이름> : 특정 ReplicaSet 상세 정보
  • kubectl get pod --show-labels : Pod 정보에 라벨 포함
  • kubectl label pod/<Pod 이름> app- : 특정 Pod의 라벨 내용 변경

  • ReplicaSet을 이용한 Scale In/Out
    • ReplicaSet YAML 파일의 replicas 값 변경
    • kubectl apply -f <ReplicaSet YAML 파일>

  • kubectl delete -f <ReplicaSet YAML 파일> : ReplicaSet (+ Pod도 겸해서) 삭제

2. Deployment

Deployment

Deployment는 ReplicaSet을 관리하는 컨트롤러 역할; 쿠버네티스에서 가장 많이 사용되는 오브젝트

=> ReplicaSet을 이용하여 Pod 업데이트하고 이력을 관리하여 rollback하거나 특정 버전(Revision)으로 돌아가는 기능 제공

Deployment 실습

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-nginx
  labels:
    app: deployment-nginx
spec: 
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pods
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx-pods
    spec: 
      containers:
        - name: nginx
          image: nginx:1.20.2
          ports:
            - containerPort: 80

기본적으로 Deployment와 ReplicaSet의 YAML 내용은 차이 X
but ReplicaSet과 차이점은 kind에 Deployment로 기술
(Deployment는 ReplicaSet을 제어하여 Pod 관리)

Deployment -> Replica -> Pod

Deployment

  • ReplicaSet 관리
  • Pod Update / Rollback / revision
  • 이력 관리

ReplicaSet

  • Pod 관리

Pod

  • 컨테이너 실행

kubectl apply -f <Deployment YAML 파일명> : Deployment 생성

kubectl get pod --show-labels : Pod 목록

kubectl get replicaset -o wide : ReplicaSet 목록

kubectl get deployments -o wide : Deployment 목록

  • READY : replicas에 의해 요청한 Pod 중 정상 동작중인 Pod 수
  • UP-TO-DATE : update된 Pod 수
  • AVAILABLE : 사용가능한 Pod 수

Deployment 생성시 ReplicaSet의 이름 형식

[Deployment 이름]-[pod-template-hash 값]




kubectl get replicaset/deployment-nginx-xxxxxxx -o yaml : ReplicaSet을 YAML 형식으로 출력

  • ownerReferences : ReplicaSet을 관리하는 Deployment 정보

kubectl get pod/deployment-nginx-xxxxxxx-xxxxx -o yaml : Pod을 YAML 형식으로 출력

  • ownerReferences : Pod를 관리하는 ReplicaSet 정보

어플리케이션 배포 (Update) 방식

서비스 제공을 위한 어플리케이션 배포 의미,
어플리케이션 배포시 기존 서비스를 제공하는 어플리케이션을 중단하고 배포하면 서비스 중단 시점 발생

downtime : 서비스가 중단되는 시점, 이를 줄이거나 없애기 위해 무중단 배포 방식 사용

Rolling Update (Rolling 배포)


무중단 방식의 가장 기본적인 방식; 사용중 인 인스턴스 내에서 새 버전을 점진적으로 교체

장점

  • 인스턴스마다 차례로 배포 진행 -> 상황에 따라 쉽게 롤백 가능
  • 추가적인 인스턴스를 늘리지 않아도 X
  • 간편한 관리

단점

  • 사용중인 인스턴스에 트래픽 몰릴수도
  • 배포 중 신버전과 구버전 공존 -> 호환성 문제 발생 가능성

Blue/Green Deployment


Blue는 구버전, Green은 신버전

운영중인 구버전과 동일한 신버전의 인스턴스 구성 후 Load Balancer를 통해 모든 트래픽을 한 번에 신버전 쪽으로 전환하는 방식

장점

  • 구버전의 인스턴스가 그대로 남아있어서 손쉬운 롤백 가능
  • 구버전의 환경을 다음 배포에 재사용 가능
  • 운영환경에 영향 X, 새 버전 테스트 가능

단점

  • 시스템 자원이 두배로 필요
  • 새로운 환경에 대한 테스트 전제

Canary Release (Canary 배포)


옛날 광부들이 유독가스 감지를 위해 카나리아 새를 이용한 것에서 유래, 잠재적 문제 상황을 미리 발견

  • 신버전을 소수의 이용자에게 배포해서 문제 없는지 확인 후 점차 사용자를 늘려 배포하는 기법
  • Blue/Green 배포와 유사하나 트래픽을 한번에 X 단계적으로 전환
    -> 부정적 영향 최소화 및 트래픽 양을 조절하여 롤백 가능

장점

  • 문제 상황 빠르게 감지
  • A/B 테스트로 활용 가능
    • A/B 테스트 : 대조군과 실험군을 나눠서 특정 UI나 알고리즘 효과 비교 테스트 방법론

단점

  • 네트워크 트래픽 제어 부담

Deployment를 이용한 어플리케이션 배포 (update)

Deployment는 ReplicaSet과 다르게 어플리케이션 업데이트 기능 가짐

Deployment Update 종류

  • Recreate : 전체를 한번에 업데이트, 기존 Pod 삭제 후 새 Pod 생성하여 업데이트 수행
  • RollingUpdate (default) : 점진적으로 Pod를 교체하면서 업데이트 수행
    • 기존 Pod 일부 제거 후 새롭게 업데이트된 Pod를 일부 배포하는 과정을 반복하는 형식
    • 점진적 배포과정 때문에 완료까지 시간이 더 걸려도 일부 Pod는 계속 running 상태 유지
      -> downtime 발생 X

Deployment YAML 파일의 spec.strategy 필드에 update 종류를 명시 + 생략시 RollingUpdate 기본 적용

Deployment 상태 변화 관찰을 위한 watch 명령

watch "kubectl get deployment deployment-nginx"

Recreate 방식으로 update 실습

Deployment YAML 파일에 spec.strategy:Recreate 설정 후 apply

kubectl apply -f <Deployment YAML 파일명>

apiVersion: apps/v1
kind: Deployment
metadata:
 name: deployment-nginx
 labels:
   app: deployment-nginx
spec:
 replicas: 3
 selector:
   matchLabels:
     app: nginx-pods
 strategy:
   type: Recreate
 template:
   metadata:
     name: nginx-pod
     labels:
       app: nginx-pods
   spec:
     containers:
       - name: nginx
         image: nginx:1.20.2
         ports:
           - containerPort: 80

update 내용 변경

  • Deployment YAML 파일에 업데이트할 내용 추가 후 apply
    • DEPLOYMENT YAML 파일 수정
    • kubectl apply -f <Deployment YAML 파일명>
  • kubectl set 명령으로 update 내용 변경 방법
    • kubectl set <set 대상필드> <set 대상필드를 가진 오브젝트> 변경내용
      ex) kubectl set image deployment/deployment-nginx nginx=nginx:1.22.0

RollingUpdate 방식으로 실습

Deployment YAML 파일에 추가 설정 내용

strategy.rollingUpdate.maxSurge

  • 업데이트시 최대 얼마만큼의 Pod를 더 생성할 수 있는지 설정
  • int (정수) 값 또는 string 값으로 % 사용가능
  • 최대 몇 개의 Pod를 추가 생성 가능한지 결정

strategy.rollingUpdate.maxUnavailable

  • 업데이트시 최대 얼마만큼의 Pod가 unavailable 상태여도 되는지 정할 수 있는 설정
  • int (정수) 값 또는 string 값으로 % 사용 가능
  • 최소 동작 Pod 수 결정

Deployment YAML 파일 apply

kubectl apply -f <Deployment YAML 파일명>

apiVersion: apps/v1
kind: Deployment
metadata:
 name: deployment-nginx
 labels:
   app: deployment-nginx
spec:
 replicas: 4
 selector:
   matchLabels:
     app: nginx-pods
 strategy:
   type: RollingUpdate
   rollingUpdate:
     maxSurge: 50%
     maxUnavailable: 50%
 template:
   metadata:
     name: nginx-pod
     labels:
       app: nginx-pods
   spec:
     containers:
       - name: nginx
         image: nginx:1.20.2
         ports:
           - containerPort: 80

Deployment와 Pod 상태 변화 모니터링

  • watch "kubectl get deployment"
  • watch "kubectl get pods"

update 수행 : Nginx 버전 변경

kubectl set image deployment/deployment-nginx nginx=nginx:1.23.0

update 배포 상태 확인

kubectl rollout status deployment/deployment-nginx

Deployment Rollback

Rollback : 새로운 어플리케이션을 배포했다가 문제가 생겨 이전 버전으로 되돌리는 과정

Deployment는 Rollback 기능 사용 가능

배포 이력 확인

  • kubectl rollout history deployment/<Deployment 이름>
    : Deployment 배포 이력 확인
  • kubectl rollout history deployment/<Deployment 이름> --revision=<revision 번호>
    : Deployment revision 에 대한 배포 정보 확인

이전 버전으로 롤백

  • kubectl rollout undo deployment/<Deployment 이름>
    : 이전 버전으로 롤백
  • kubectl rollout undo deployment/<Deployment 이름> --to-revision=<revision 번호>
    : 특정 revision 번호로 롤백

0개의 댓글