kubernets

 

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
    - name: redis
      image: redis

 

저번 시간의 redis 를 생성하는 매니페스트 파일이다.

쿠버네티스로 매니페스트에 있는 필드 중 Kind 필드에 들어가는 값 중에 ReplicaSet 이라고 하는 것이 있다.

 

Kind 필드에는 Pod 와 비롯하여 Deployment, Service 등의 워크로드 리소스를 사용하는데, 오늘은 그 레플리카셋(ReplicaSet) 에 대한 내용을 정리해보도록 하겠다.

(공식 문서도 같이 참고하였다.)

 

레플리카셋 (ReplicaSet)

  • 일정 수의 파드를 기동하기 위해 사용한다고 한다.
  • 설정된 기본 파드 숫자에 대한 보장을 한다. 예를 들어, 기본 파드가 2개인 경우 파드 중 하나가 기동에 실패하면, 실패된 나머지 하나가 다시 재기동을 한다.
  • 클러스터 안에 있는 다른 노드의 파드 개수도 조정한다.

 

레플리케이션 컨트롤러 vs 레플리카셋

  • 레플리케이션 컨트롤러와 레플리카셋은 비슷하지만 서로 다르다.
  • 아래는 레플리케이션 컨트롤러의 yml 파일이다.

 

rc-definition.yml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-rc
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
      	app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
  replicas: 3

 

이후 생성

# 생성
$ kubectl create -f rc-definition.yml

# 생성된 레플리케이션컨트롤러 보기
$ kubectl get replicationcontroller

# 생성된 파드 보기
$ kubectl get pods

 

  • 반면 레플리카셋은 레이블 기반으로 파드를 확인해야하므로 레이블 셀렉터 가 필요하다.

 

replicaset-definition.yml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
      	app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
  replicas: 3
  # 레플리케이션 컨트롤러랑 다른 것 중 하나로, 관리할 Pod의 Label을 적는다.
  selector:
    matchLabels:
    type: front-end

 

# 생성
$ kubectl create -f replicaset-definition.yml

# 생성된 레플리케이션컨트롤러 보기
$ kubectl get replicaset

# 생성된 파드 보기
$ kubectl get pods

 

레플리카셋 스케일링 방법

replicas 개수를 3 -> 6 으로 한다고 가정해보자.

  • replicas: 3 을 replicas: 6 으로 바꾸고, 아래 명령어를 실행한다.
$ kubectl replace -f replicaset-definition.yml

 

  • 혹은 아래의 명령어를 실행한다.
$ kubectl scale --replicas=6 -f replicaset-definition.yml

$ kubectl scale --replicas=6 replicaset myapp-replicaset

 

레플리카셋 명령어 정리

위의 명령어들을 정리해보자

 

# 생성
$ kubectl create -f replicaset-definition.yml

# 조회 
$ kubectl get replicaset
$ kubectl get rs

# 삭제
$ kubectl delete replicaset myapp-replicaset

# 업데이트
$ kubectl replace -f replicaset-definition.yml
$ kubectl scale --replicas=6 -f replicaset-definition.yml

 

이후 문제를 풀었지만, 위의 명령어를 활용하면 충분히 할 수 있는 그런 문제들 이었다.. 그래서 패스


 

디플로이먼트 (Deployment)

  • 롤링 업데이트나, 배포 후 장애로 롤백을 할때 사용한다.
  • 예기치 못한 일로 배포를 잠시 중단(Pause)해야 될 때도 사용한다.
  • 디플로이먼트가 레플리카셋(혹은 레플리케이션컨트롤러) 보다 상위에 있으며, 더 많은 기능을 제공한다.
  • 레플리카셋의 매니페스트 파일과 비교 했을 때, kind 부분만 다르다.

별거 없어보이지만, 최근 쿠버네티스 관련 면접 질문으로도 나왔던 질문이다.. 반드시 기억해두자.

(레플리카셋 vs 디플로이먼트)

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  labels:
    app: myapp
    type: front-end
spec:
  template:
    metadata:
      name: myapp-pod
      labels:
      	app: myapp
        type: front-end
    spec:
      containers:
      - name: nginx-container
        image: nginx
  replicas: 3
  selector:
    matchLabels:
    type: front-end

 

명령어도 레플리카셋과 별반 다르지 않다.

 

# 생성
$ kubectl create -f deployment-definition.yml

# 조회 
$ kubectl get deployments

# 삭제
$ kubectl delete deployments myapp-deployment

 

추가로, 파드 & 레플리카셋 & 디플로이먼트를 한번에 조회하는 명령어다.

 

# 파드, 레플리카셋, 디플로이먼트 한번에 조회하는 명령어
$ kubectl get all

 

 

정리

레플리카셋을 정리하고 나서, 디플로이먼트를 나중에 정리할까 하다가 하루 지나서 같이 정리했는데

생각보다 디플로이먼트 설명 내용은 별로 없었다.. (롤링업데이트 하는 부분 있을텐데 나중에 나오지 않을까 싶다.)

문제 풀이도 파드 때랑 크게 다르지 않았다. 그때 한번 풀고나니 정리할 필요도 없을 정도로 쉬웠다 🙄

 

오늘 정리는 여기까지. 🤣