본문 바로가기

쿠버네티스 기본 오브젝트 Controller

컨트롤러는 pod들을 관리하기 위한 쿠버네티스 오브젝트 이며, desired state로 Pod들을 관리하게 된다.

desired state란 컨트롤러가 궁극적으로 바라는 상태이며 컨트롤러는 해당 상태로 가기위해 pod들을 관리하게 된다.

 

현재상태는 pod 2개가 동작중이고, desired state는 pod3개 동작이라면, 컨트롤러는 해당 pod를 하나 더 실행시켜 desired state를 만족시키게 될 것 이다.

 

이러한 컨트롤러에는 여러가지가 있으며, 이 포스팅에서는

  • ReplicaSet
  • Deployment
  • StatefulSet
  • DaemonSet
  • Job & CronJob

5가지 컨트롤러에 대해 알아본다.

 

ReplicaSet

 

레플리카셋

레플리카셋의 목적은 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다. 이처럼 레플리카셋은 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다. 레플리카셋의

kubernetes.io

ReplicaSet은 한번에 여러개의 Pod를 생성해주어 서비스의 가용성을 높여주는 쿠버네티스 컨트롤러다.

ReplicaSet은 desired-state를 가지며, 매 loop를 돌면서 현재 상태가 desired-state와 일치하는지 끊임없이 비교하게 된다.

 

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replica
  labels:
    controller: nginx-replica
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2

apiVersion: apps/v1 고정

spec.replicas : 복제할 pod의 개수를 지정한다.

spec.selector : 복제할 pod를 정의한다. 예시에서는 label이 app: nginx인 pod를 복제한다

spec.template : pod들을 정의한다.

 

replicaset 확인

이로써 생성된 Pod들은 {pod이름}-replica-{id}의 형태를 가지게 된다.

replicaset으로 생성된 pod

스케일 확장 및 축소

쿠버네티스의 선언적 명령문을 통해 replicaset의 desired state 를 바꿔줄 수 있다.

kubectl scale rs --replicas <scale 수> <replicaset name>

다음 명령을 통해 바꿔줄 수 있다.

scale을 5로 바꿔준 상태.

 

Deployment

 

디플로이먼트

디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다. 디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의

kubernetes.io

Deployment는 ReplicaSet에 업데이트 기능이 추가된 컨트롤러로써 Pod 업데이트 및 배포에 특화되어있다.

 

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

yml 파일 작성법은 replicaset과 동일하므로 따로 언급하진 않는다.

 

deployment의 상태
deployment를 통해 생성된 pod

 

컨테이너 업데이트

deployment의 장점으로는 Pod의 업데이트가 쉽게 가능하다는 점이다.

kubectl set image deployment <deployment name> <pod.container name>=<container image> --record

다음 명령을 통해 롤링 업데이트(default)가 가능하게 한다.

Pod가 업데이트 되어가는 모습

위 예시는 nginx pod의 nginx 컨테이너 버전을 바꿔 업데이트 시키는 모습인데, 하나의 컨테이너가 생성이 되고, 기존 컨테이너가 종료되는 롤링 업데이트 방식을 취한다는것을 알 수 있다.

 

Rolling update

롤링 업데이트는 기본값이지만, 추가적인 롤링 업데이트 설정을 위해 yml 파일을 다음과 같이 수정해줄 수 있다.

 

spec:
  ...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  ...

spec에 다음 설정들을 추가해줄 수 있다.

maxUnavailable : 최대로 중단될 pod의 비율을 설정한다.

만약 4개의 pod가 있다면, 최대 1개의 pod가 중지될 수 있다는 의미다.

 

maxSurge : 최대로 초과될 수 있는 pod의 비율을 설정한다.

만약 4개의 pod가 있다면 최대 1개 초과, 즉 5개의 pod만 생성될 수 있다.

 

즉 위의 내용대로라면 업데이트시 무조건 1개의 파드가 생성되고, 한개의 파드가 사라지는 식으로 업데이트가 될것이다.

 

업데이트 기록 확인

kubectl rollout history deployment <deployment-name>

 

업데이트 롤백

kubectl rollout undo deployment --to-revision={n}

REVISION 1로 ROLL BACK된 상태

 

StatefulSet

 

스테이트풀셋

스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다. 파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다 . 디플

kubernetes.io

StatefulSet은 pod의 상태가 필요한 경우 사용되게 됩니다. StatefulSet으로 생성하게된 pod는, 순서를 가지며 각 순서마다 고유한 state를 가질 수 있습니다. 

이는 순차적인 서비스가 진행되어야 하는 경우나, 각 Pod가 고유한 역할을 가져야할 경우 사용되게 됩니다.

 

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  serviceName: jhkim
  selector:
    matchLabels:
      app: nginx 
  replicas: 3 
  minReadySeconds: 10 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx:1.14.1
        ports:
        - containerPort: 80

 

 

DaemonSet

 

데몬셋

데몬셋 은 모든(또는 일부) 노드가 파드의 사본을 실행하도록 한다. 노드가 클러스터에 추가되면 파드도 추가된다. 노드가 클러스터에서 제거되면 해당 파드는 가비지(garbage)로 수집된다. 데몬

kubernetes.io

 

 

Job & CronJob

 

잡에서 하나 이상의 파드를 생성하고 지정된 수의 파드가 성공적으로 종료될 때까지 계속해서 파드의 실행을 재시도한다. 파드가 성공적으로 완료되면, 성공적으로 완료된 잡을 추적한다. 지정

kubernetes.io

 

크론잡

FEATURE STATE: Kubernetes v1.21 [stable] 크론잡은 반복 일정에 따라 잡을 만든다. 하나의 크론잡 오브젝트는 크론탭 (크론 테이블) 파일의 한 줄과 같다. 크론잡은 잡을 크론 형식으로 쓰여진 주어진 일정

kubernetes.io