본문 바로가기
Cloud/Kubernates

ReplicaSet, Deployment

by 민휘 2023. 10. 29.

레플리카 셋

레플리카 셋은 일정 개수의 파드를 유지하는 컨트롤러이다.

파드 개수에 대한 가용성을 보증하여 안정적인 실행을 유지하는 역할을 한다.

 

레플리카셋의 사용 이유

 

🌱 레플리카셋 없이 yaml으로 파드만 사용하는 방법의 한계

  • 파드 개수가 많아지는 경우, yaml에 파드를 일일이 정의하는 것은 매우 비효율적이다.
  • 파드가 생성된 노드에 장애가 발생하는 경우, 파드는 복구되지 않고 종료된 상태로 남는다.

 

🌱 레플리카셋의 역할

  • 정해진 수의 동일한 파드가 실행되도록 유지한다.
  • 노드 장애 등의 이유로 파드를 사용할 수 없다면 다른 노드에서 파드를 다시 생성한다.

 

레플리카셋 사용하기

 

🌱 레플리카셋 생성

  • 레플리카셋을 정의하는 yaml 파일 작성 : vim replicaset-nginx.yaml
    • spec.replicas : 동일한 파드를 몇개 유지시킬 것인지 설정한다.
    • spec.template 아래의 내용 : 파드를 생성할 때 사용할 템플릿을 정의한다. 파드 스텍 또는 파드 템플릿이라고 한다.
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:latest
        ports:
        - containerPort: 80
  • yaml 파일로 레플리카셋 생성 : kubectl apply -f replicaset-nginx.yaml
  • 레플리카셋과 파드 목록 확인 : kubectl get po --show-labels

 

 

🌱 레플리카셋 수정

  • vim으로 yaml 파일 수정 : replicas를 4로 수정
  • yaml 파일로 변경 내용 적용 : kubectl apply -f replicaset-nginx.yaml
  • 레플리카셋과 파드 목록 확인 : kubectl get po --show-labels

 

레플리카셋의 동작 원리

레플리카셋과 파드는 라벨의 의한 느슨한 연결을 유지한다. 레플리카셋은 자신이 관리할 파드를 라벨 셀렉터를 이용해 인식한다. ****레플리카셋은 자신이 관리할 파드의 라벨과 동일한 라벨을 가지고 있는 파드를 관리 대상으로 인식**하며, 레플리카 수를 만족하도록 관리한다.

spec:
  replicas: 3
  selector:
    **matchLabels:** # 레플리카셋이 관리할 파드의 라벨
      **app: my-nginx-pods-label** # key: value
  template:
    metadata:
      name: my-nginx-pod
      **labels:** # 파드의 메타데이터인 라벨
        **app: my-nginx-pods-label**

🌱 다양한 시나리오에서 app: my-nginx-pods-label 라벨을 갖는 레플리카셋의 동작 확인하기

  • 라벨을 가진 파드가 존재하지 않음 → 레플리카수만큼 생성
  • 라벨을 가진 파드 1개 생성 후 레플리카셋 생성 → (레플리카수-1)만큼 생성
  • 라벨을 가진 파드 1개 수동 삭제 → 1개 추가 생성
  • 파드 1개의 라벨 삭제 → 1개 추가 생성
  • 결론 : 의존성이 끊어지는 경우, 레플리카수를 유지하도록 파드를 생성한다. 의존성이 많아지는 경우, 레플리카수를 유지하도록 파드를 삭제한다.
  • 명령어 참고! 특정 파드의 설정 확인하고 수정 : kubectl edit pods <파드이름>

🌱 라벨 표현식 정의 형태

spec:
  replicas: 3
  selector:
    **matchLabels:** 
      - key: app # key가 app이고
      values: # value 중 다음 값들을 포함하는 라벨
        - **my-nginx-pods-label**
        - your**-nginx-pods-label
      operator: In**

 

디플로이먼트는 무엇이고 왜 사용할까?

 

🌱 레플리카셋 말고 디플로이먼트

실제 쿠버네티스 운영 환경에서 레플리카셋을 yaml 파일로 생성하는 경우는 거의 없다. 대부분 레플리카셋과 파드의 정보를 정의하는 디플로이먼트라는 이름의 오브젝트를 yaml 파일에 정의해 사용한다.

 

🌱 디플로이먼트를 사용하는 쿠버네티스 구조

디플로이먼트는 여러 개의 레플리카셋을 관리하는 상위 오브젝트이다. 디플로이먼트를 생성하면 레플리카셋이 생성되고, 레플리카셋이 파드를 생성한다. 디플로이먼트를 삭제하면 레플리카셋과 파드 또한 함께 삭제된다. 일반적으로 디플로이먼트를 통해 파드를 생성하고 삭제한다.

🌱 디플로이먼트의 역할

디플로이먼트는 컨테이너 애플리케이션을 배포하고 관리하는 역할을 한다.

  • 리비전 보존 : 애플리케이션을 업데이트할 때 변경 사항을 저장하는 리비전을 남겨 롤백을 가능하게 한다.
  • 파드 롤링 업데이트 전략 : 무중단 서비스를 위해 업데이트 전략을 지정한다.

 

디플로이먼트 사용하기

🌱 디플로이먼트를 통해 레플리카셋과 파드 생성

  • 디플로이먼트 yaml 작성
    • kind: Deployment
    • 나머지는 레플리카셋 정의와 동일!
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      name: my-nginx-pod
      labels: 
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
  • 디플로이먼트 생성 : kubectl apply -f deployment-nginx.yaml
  • 생성된 리소스 확인 : kubectl get deploy, kubectl get replicasets, kubectl get pods

 

minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get deploy
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx-deployment   3/3     3            3           19s

minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get replicasets
NAME                             DESIRED   CURRENT   READY   AGE
my-nginx-deployment-**6964bcb8c4**   3         3         3       26s

minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-**6964bcb8c4**-7sx56   1/1     Running   0          32s
my-nginx-deployment-**6964bcb8c4**-hdkjk   1/1     Running   0          32s
my-nginx-deployment-**6964bcb8c4**-xwmsw   1/1     Running   0          32s

같은 디플로이먼트로부터 만들어진 레플리카셋과 파드는 동일한 해시값을 가진다.

 

 

🌱 애플리케이션 버전 업데이트과 롤백

  • 리버전 보존 옵션을 갖도록 디플로이먼트 수정 : kubectl apply -f deployment-nginx.yaml --record
  • 애플리케이션 이미지 업데이트 : kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record
  • 리소스 확인 : kubectl get deploy, kubectl get replicasets, kubectl get pods
minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get deploy
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx-deployment   3/3     3            3           75s

minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get replicasets
NAME                             DESIRED   CURRENT   READY   AGE
my-nginx-deployment-***5bdb99bd8d***   3         3         3       7s

minhwi@minhwiui-MacBookPro  ~/kubernetes/chap6  kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-***5bdb99bd8d***-2v2cd   1/1     Running   0          6s
my-nginx-deployment-***5bdb99bd8d***-qbtm9   1/1     Running   0          8s
my-nginx-deployment-***5bdb99bd8d***-ql7gd   1/1     Running   0          10s

디플로이먼트로 한개의 레플리카셋이 만들어졌고, 한개의 레플리카셋은 세개의 파드를 생성한 것을 알 수 있다.

 

  • 리비전 정보 확인 : kubectl rollout history deployment my-nginx-deployment
deployment.apps/my-nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=deployment-nginx.yaml --record=true
2         kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record=true

 

--reset=true 옵션을 붙여서 실행한 kubectl 명령어가 리비전에 기록되었다. 롤백 명령어를 사용할 때 REVISION 번호를 사용해 롤백할 수 있다.

  • 롤백 : kubectl rollout undo deplomyent my-nginx-deployment --to-revision=1 (my-nginx-deployment 디플로이먼트에 기록된 1번 이후의 모든 작업은 취소)
  • 레플리카셋 확인 : kubectl get replicasets
NAME                             DESIRED   CURRENT   READY   AGE
my-nginx-deployment-5bdb99bd8d   0         0         0       4m52s
my-nginx-deployment-6964bcb8c4   3         3         3       6m3s

1번 명령어로 생성된 레플리카 6964bcb8c4가 활성화되어 다시 파드를 관리하게 되었다. 롤백 완료 ~

'Cloud > Kubernates' 카테고리의 다른 글

NameSpace 관리  (1) 2023.10.29
Service  (0) 2023.10.29
Pod, NameSpace  (1) 2023.10.29
쿠버네티스 시작하기 : 내부 구조  (0) 2023.10.29
GKE 설치  (0) 2023.10.29