어쩌다 IT
article thumbnail
반응형

리뷰 (Review)

더보기

Pod

  • Kubernetes에서 하나의 독립적인 서비스를 제공할 수 있는 container들을 모아서 관리하는 최소 배포 단위
  • Pod 단위로 container 작성, 시작, 정지, 삭제 등과 같은 조작 수행

 

Pod 특징

  • 동일한 Pod의 container는 반드시 동일한 node 상에 동시에 deploy 된다.
  • 같은 Pod 안에서 Port 번호는 중복될 수 없다.
  • Pod 안의 여러 container가 가상 NIC를 공유하는 구성을 취하기 떄문에 localhost를 통해 통신 가능하다.

 

Pod 생명 주기

  • Pod status
    • Pending
    • Running
    • Succeeded
    • Failed
    • Unkown
  • Pod conditions
    • Initialized
    • Ready
    • ContainersReady
    • PodScheduled
    • Unschedulable

 

Volume

  • Volume은 Pod의 일부분으로 정의되는 요소로, Pod와 동일한 생명 주기를 갖는 disk storage
  • 독립적인 리소스가 아니므로 자체적으로 생성, 삭제할 수 없다.
  • Volume은 Pod의 모든 container에서 사용 가능하며 사용 시 container에서 mount 해야 사용 가능
  • 각 container 파일 시스템의 어느 경로에도 mount 할 수 있다.

 

Volume 유형

  • emptyDir
  • hostPath
  • nfs
  • public cloud 전용 스토리지
  • configMap, secret, downwardAPI
  • persistentVolumeClaim

ReplicaSet

 

ReplicaSet

  • Pod를 정해진 수만큼 복제하고 관리

 

  • Kubernetes 사용 목적 - 사용자가 요청한 상태를 유지 관리 (자동으로) 하는 것이 목적
  • Pod는 Kubernetes 기본 단위로 한 개 또는 여러 개의 container를 추상화해 하나의 Application으로 동작하도록
    만드는 container 묶음
  • 사용자가 직접 또는 YAML 파일을 정의해 Pod를 생성하면 해당 Pod의 생명 주기는 오직 사용자에 의해서만 관리
  • 마이크로 서비스 아키텍처 구조의 Application을 배포하기 위해서는 여러 개의 Pod를 생성하여 배포해야 한다.
  • 따라서 사용자는 여러 개의 Pod를 생성하여 외부 요청을 여러 Pod에 분배하는 방식으로 구성하게 된다.
  • 동일한 여러 개의 Pod 생성 방법
    • 다른 이름을 갖는 여러 개의 Pod 직접 생성
      • 동일한 Pod 여러 개를 직접 생성
      • 만약 Pod가 어떤 이유에 의하여 중지되었을 때 사용자가 직접 Pod를 생성 / 삭제하여 복구해야 한다.
    • 사용자가 직접 Pod를 관리한다는 것은 Kubernetes를 사용하는 의미가 없다.

 

ReplicaSet 동작

  • 정해진 동일한 Pod가 항상 실행되도록 관리
  • node (worker node) 장애 등의 이유로 Pod를 생성할 수 없다면 다른 node에서 Pod를 다시 생성
  • 사용자가 요구하는 상태가 되도록 Pod 관리

 

ReplicaSet 실습

더보기
#### replicaset-nginx.yml #####
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:
            - containerPorts: 80
  • spec.replicas - 동일한 Pod 유지할 개수
  • spec.selector.matchLabels
    • label 체크 조건
    • ReplicaSet이 검색하는 Pod label
  • spec.template - 생성할 Pod 명시
    • ReplicaSet에 의해 생성할 Pod에 대해 명시

 

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

 

ReplicaSet을 이용한 Scale In / Scale Out

  • ReplicaSet YAML 파일의 replicas 값 변경 후 kubectl apply -f <ReplicaSet YAML 파일>

 

ReplicaSet 삭제

  • 생성된 Pod도 같이 삭제
  • kubectl delete -f <ReplicaSet 이름>

Deployment

 

Deployment

  • 참고 자료
  • Deployment는 Kubernetes에서 가장 많이 사용되는 Object
  • Deployment는 ReplicaSet을 관리하는 Controller 역할
  • ReplicaSet을 이용하여 Pod를 Update 하고 이력을 관리하여 Rollback 하거나 특정 버전으로 돌아가는 기능 제공

 

Deployment 실습

더보기
##### deployment-nginx.yml #####
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
  • ReplicaSet과 차이점은 kind에 Deployment로 기술
  • 기본적으로 Deployment와 ReplicaSet의 YAML 내용은 차이가 없다.
  • Deployment는 ReplicaSet을 제어하여 pod를 관리
  • Deployment → ReplicaSet → Pod
    • Deployment
      • ReplicaSet 관리
      • Pod Update / Rollback / Revision
      • 이력 관리
    • ReplicaSet - Pod 관리
    • Pod - container 실행

 

  • kubectl apply -f <Deployment YAML 파일 이름> - Deployment 생성
  • kubectl get pod --show-labels - Pod 목록
  • kubectl get replicasets -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=hash 값]
  • ex) kubectl get replicaset/deployment-nginx-76688c8 -o yaml - ReplicaSet을 YAML 형식으로 출력
    • ownerReferences - ReplicaSet을 관리하는 Deployment 정보
  • ex) kubectl get pod/deployment-nginx-76688c8-gsrtt -o yaml - Pod를 YAML 형식으로 출력
    • ownerReferences - Pod를 관리하는 ReplicaSet 정보

 

Application 배포 (update) 방식

  • 서비스 제공을 위한 Application 배포 의미
  • Application을 배포할 때 기존 서비스를 제공하는 Application을 중단하고 배포하게 되면 서비스가 중단되는 시점이 생긴다.

  • 서비스가 중단되는 시점을 downtime이라고 한다.
  • 이와 같은 downtime을 줄이거나 없애기 위해 무중단 배포 방식 사용


  • Rolling Update
    • 사용 중인 인스턴스 내에서 새 버전을 점진적으로 교체
    • 무중단 방식의 가장 기본적인 방식
    • 장점
      • 인스턴스마다 차례로 배포를 진행하기에 상황에 따라 쉽게 Rollback 가능
      • 추가적인 인스턴스를 늘리지 않아도 된다.
      • 간편한 관리
    • 단점
      • 사용 중인 인스턴스에 트래픽이 몰릴 수 있다.
      • 배포 중 신버전과 구버전이 공존하므로 호환성 문제 발생 가능성이 있다.


  • Blue / Green Deployment
    • Blue는 구버전, Green은 신버전
    • 운영 중인 구버전과 동일한 신버전의 인스턴스를 구성한 후 Load Balancer를 통해 모든 트래픽을 한 번에
      신버전 쪽으로 전환하는 방식
    • 장점
      • 구버전의 인스턴스가 그대로 남아있어서 손쉬운 Rollback 가능
      • 구버전의 환경을 다음 배포에 재사용할 수 있다.
      • 운영 환경에 영향을 주지 않고 새로운 버전 테스트 가능
    • 단점
      • 시스템 자원이 두 배로 필요
      • 새로운 환경에 대한 테스트가 전제되어야 한다.

배포 전
배포 후


  • Canary Release
    • 옛날 광부들이 유독 가스 감지를 위해 카나리아를 이용한 것이 유래로 잠재적 문제 상황을 미리 발견하는 방식
    • 신버전을 소수의 사용자에게 배포해서 문제가 없는지 확인한 후 점차 사용자를 늘려 배포하는 기법
    • Blue / Green Deployment와 유사한 면이 있지만 트래픽을 한 번에 바꾸는 것이 아니라 단계적으로 전환하기
      때문에 부정적 영향을 최소화하고 트래픽 양을 조절하여 Rollback 할 수 있다.
    • 장점
      • 문제 상황을 빠르게 감지
      • A/B 테스트로 활용 가능
        • A/B 테스트 - 대조군과 실험군을 나누어서 특정 UI나 Algorithm 효과 비교 테스트 방법론
    • 단점
      • 네트워크 트래픽 제어 부담


Deployment를 이용한 Application 배포 (Update)

  • Deployment는 ReplicaSet과 다르게 Application update 기능을 가지고 있다.
  • Deployment Update 종류
    • Recreate
      • 전체를 한 번에 update
      • 기존 Pod를 삭제하고 새로운 Pod를 생성하여 update 수행
    • RollingUpdate (default)
      • 점진적으로 Pod를 교체하면서 update 수행
      • 기존 Pod 일부를 제거하고 새롭게 Update 된 Pod 일부를 배포하는 과정을 반복하는 방식
      • 점진적 배포 과정 때문에 완료까지 시간이 더 걸리지만 일부의 Pod는 계속 running 상태를 유지하여
        downtime이 발생하지 않는다.
  • Deployment YAML 파일에 spec.strategy 필드에 update 방식을 명시하며 생략 시 RollingUpdate가 기본 적용

 

Recreate 방식으로 Update 실습

더보기
  • Deployment 상태 변화 관찰을 위한 watch 명령
    • watch "kubectl get deployment deployment-nginx"
  • Deployment YAML 파일에 spec.strategy : Recreate 설정 후 apply
    • kubectl apply -f <Deployment YAML 파일 이름>
##### deploy-nginx-recreate.yml #####
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 파일에 update할 내용을 추가한 후 apply
      • Deployment YAML 파일 수정
      • kubectl apply -f <Deployment YAML 파일 이름>
    • kubectl set 명령으로 update 내용 변경 방법
      • kubectl set <set 대상 필드> <set 대상 필드를 가지고 있는 Object> <변경 내용>
      • kubectl set image deployment/deployment-nginx nginx=nginx:1.22.0

 

RollingUpdate 방식으로 실습

더보기
  • Deployment YAML 파일에 추가 설정 내용
    • strategy.rollingUpdate.maxSurge
      • update 시 최대 얼마만큼의 Pod를 더 생성할 수 있는지 설정
      • int 값 또는 string 값으로 % 사용 가능
      • 최대 몇 개의 Pod를 추가 생성할 수 있는지 결정
    • strategy.rollingUpdate.maxUnavailable
      • update 시 최대 얼마만큼의 Pod가 unavailable 상태여도 되는지 정할 수 있는 설정
      • int 값 또는 string 값으로 % 사용 가능
      • 최소 동작 Pod 수 결정
##### deploy-nginx-rolling.yml #####
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 YAML 파일 apply
    • kubectl apply -f <Deployment YAML 파일 이름>
  • Deployment와 Pod 상태 변화 모니터링
    • watch "kubectl get deployments"
    • watch "kubectl get pods"
  • update 수행 - NginX 버전 변경
    • kubectl set image deployment/deployment-nginx nginx=nginx:1.23.1
update 수행

 

Deployment Rollback

  • 새로운 Application을 배포하였다가 문제가 생겨 이전 버전으로 되돌리는 과정을 Rollback이라 한다.
  • Deployment는 Rollback 기능을 사용할 수 있다.
  • 배포 이력 확인
    • kubectl rollout history deployment/<Deployment 이름>
    • kubectl rollout history deployment/<Deployment 이름> --revision=<revision 번호>
      • Deployment revision에 대한 배포 정보 확인
  • 이전 버전으로 Rollback
    • kubectl rollout undo deployment/<Deployment 이름>
    • kubectl rollout undo deployment/<Deployment 이름> --to-revision=<revision 번호>
      • 특정 revision 번호로 Rollback

TIF

강사님께서 공유해주신 자료로 금방 끝날 줄 알았다면...

실습 환경 새로 만든다고 몇 시간을 날렸는데...

다시 만들어도 계속 ContainerCreating에서 먹통이 되어서 Instance를 지우고 다시 깔고를 수 차례 반복했는데...

 

 

2022. 10. 13 에 작성된 글입니다.

 

반응형
profile

어쩌다 IT

@jwlish

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!