본문 바로가기
K8S/주요 개념

Pod, ReplicaSet, Deployment

by HH_g 2024. 1. 18.

출처 :  https://kubernetes.io/docs/concepts/workloads/controllers/

1. Pods

파드는 쿠버네티스에서 가장 기본적인 배포 단위입니다.

  • 보통 한 pod 안에 한 컨테이너가 존재합니다. 여러 개의 컨테이너 가능하지만 보통 스케일 업 다운은 파드의 개수를 의미하는 것입니다.
  • 파드의 컨테이너들은 동일한 네트워크 네임스페이스와 스토리지를 공유합니다.
  • 주로 하나의 애플리케이션을 실행하는데 사용되며, 동일한 노드에서 실행됩니다.
  • 쿠버네티스에서의 파드는 무언가가 구동 중인 상태를 유지하기 위해 동원되는 일회성 자원으로, 언제든 다른 노드로 옮겨지거나 삭제될 수 있습니다.
  • 파드는 생성될 때마다 새로운 내부 IP를 할당 받음.

yaml 파일로 리소스 deploy

  • 쿠버네티스는 yaml을 input으로 다양한 리소스(pods, replicas, deployents,,)를 만듭니다.
  • apiVersion, kind, metadata, spec 네 필드를 가집니다.
    • apiVersion: 버전
    • kind: 리소스 종류
    • metadata: name, label 등 으로 파드 구분 가능.
    • spec: specification zone.
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - name: mycontainer
      image: nginx:latest

2. ReplicaSet

ReplicaSet은 동일한 파드를 여러 개 복제하여 관리하는 오브젝트입니다.

  • 운영 중인 프로그램이 계속 정상 작동하게 하려면 pod에 문제가 생겨도 대체할 수 있는 pod가 필요합니다.
  • ReplicaSet은 원하는 파드의 개수를 지정하고, 현재 실행 중인 파드 수를 모니터링하여 필요에 따라 파드를 생성하거나 삭제합니다.
  • ReplicaSet은 일반적으로 직접 사용되지 않고 대신 Deployment에 의해 관리됩니다.

 

Load Balancing, Scaling

  • 유저가 증가하면 이를 감당하기 위해 스케일 업!
  • 만약 워커노드의 모든 리소스 다 사용하면 다른 워커노드에 deploy합니다. (replication controller가 노드들을 관리)
  • Replication Controller는 예전 방식이고, Replica Set으로 대체 중입니다. 두 개는 다른 용어이지만 같은 역할을 하는 오브젝트입니다.

Replication Controller

  • yaml 파일을 이용해서 deploy합니다.
  • kind : ReplicationController
  • spec: template, replicas

Replica Set

  • apiVersion: apps/v1
  • kind: ReplicaSet
  • spec: replicas, selector(yaml에서 정의한 pod 말고도 다른 pod 를 라벨 이용해서 관리 가능합니다.)
  • selector: matchLabels: type: [type] 반드시 명시 필요(replication Controller에서는 필수가 아닙니다)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myreplicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: mycontainer
          image: nginx:latest

Scale

  • yaml의 replicas 를 늘리거나 줄일 수 있습니다.
  • kube control scale command 사용(yaml의 내용은 바뀌지 않음. 실행중인 리소스에서 바뀌는 것)
kubectl scale --replicas=6 -f [파일이름.yaml]
kubectl scale --replicas=6 -f [type] [Name]
kubectl edit replicaset [replicaset 이름]

 

 

3. Deployment

Deployment는 애플리케이션의 배포와 업데이트를 관리하는 오브젝트입니다.

 

  • 원하는 상태를 지정하고(desired state), 그 상태를 유지하기 위해 ReplicaSet을 사용하여 파드를 생성하고 관리합니다.
  • 롤링 업데이트나 롤백과 같은 배포 전략을 제공하여 애플리케이션을 안전하게 업데이트할 수 있습니다.
  • Deployment yaml을 apply 하면 deployment는 replicaset을 생성하고, replicaset은 pod를 생성합니다.

 

하나의 애플리케이션을 운영할 때 여러 개의 Pod가 필요할 수 있습니다. 이 파드들을 업데이트해야 하는 상황을 가정해봅시다.

  • 모든 pod들을 한 번에 업데이트하지 않고 하나 씩(rolling update) 업데이트.
  • 업데이트 중 오류가 생기면 이전 변화(recent change)를 undo. (roll back)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: mycontainer
          image: nginx:latest

위의 예시는 레이블이 app: myapp 인 nginx 파드를 3개 생성하는 디플로이먼트의 yaml 입니다.

ReplicaSet과 Deployment 차이점

  1. 롤링 업데이트 및 롤백: Deployment는 새로운 버전의 애플리케이션 배포와 이전 버전으로의 롤백을 관리하는 데 사용됩니다. ReplicaSet은 파드 복제만 관리하므로 배포 업데이트와 롤백을 수동으로 처리해야 합니다. Deployment를 사용하면 쉽게 업데이트를 시작하고 롤백할 수 있습니다.
  2. 선언적 구성: Deployment는 선언적인 방식으로 배포 및 업데이트 구성을 정의합니다. 원하는 상태를 명시적으로 선언하고 Kubernetes가 해당 상태를 유지하도록 지시할 수 있습니다. ReplicaSet은 명시적으로 수정되어야 합니다.
  3. 복제본 관리: Deployment는 더 높은 수준의 추상화를 제공하여 배포와 업데이트를 관리하며 이를 통해 애플리케이션 스케일링과 관련된 작업을 단순화합니다.
  4. 롤백 및 이력 관리: Deployment는 이전 배포에 대한 이력을 추적하고 롤백 옵션을 제공합니다. 이전 버전의 배포로 쉽게 롤백할 수 있으며 변경 이력을 확인할 수 있습니다.

 

 

 

 

 

 

참고

Certified Kubernetes Adiminstrtor(CKA) with Practice Tests by Mumshad Mannambeth, KodeKloud Training

'K8S > 주요 개념' 카테고리의 다른 글

Imperatvie vs Declarative  (0) 2024.01.18
Service  (0) 2024.01.18
K8S의 6가지 Core Concept  (0) 2024.01.18