Among Us - Yellow Crewmate [kubernetes] 쿠버네티스의 구성요소 ! (Controller)

DevOps/Kubernetes

[kubernetes] 쿠버네티스의 구성요소 ! (Controller)

감쟈! 2021. 4. 20. 01:16

쿠버네티스를 구성하는 요소에는 객체컨트롤러가 있다. 지난 게시물에서 객체에 대해서 간단히 알아보았고, 이번에는 컨트롤러에 대해서 알아보도록 하자.

 

 

컨트롤러란? 

Pod를 관리하는 역할을 한다. Pod를 어떻게 관리하느냐에 따라서 쿠버네티스에서 제공하는 컨트롤러를 사용한다.

 

2. 컨트롤로의 종류는?

ReplicaSet, Deployment, DaemonSet, StatefulSets, Job이 있다.

 

3. 각 컨트롤러를 관리 목적에 맞게 분류

 

3-1. 상태를 유지하지 않아도 되는 파드를 관리 (Stateless)

- ReplicaSet, Deployment

3-2. 상태를 유지해야 하는 파드를 관리 (Stateful)

- StatefulSet

3-3. 클러스터 전체에 배포가 필요한 파드를 관리

- DaemonSet

3-4. 배치성 작업을 진행하는 파드를 관리

- Job

 

 

 

4. 각 컨트롤러의 특징

 

4-1. ReplicaSet

 

- 실행할 파드의 개수를 지정할 수 있고 지정한 개수만큼 파드가 유지되도록 관리한다.

- 집합 기반의 셀렉터(Selector)를 지원하며, 셀렉터는 in, notin, exists와 같은 연산을 제공하며 조건에 따라 필요로 하는 레이블을 선택할 수 있다.

- 레플리카셋은 파드 업데이트시 rolling-update를 지원하지 않는다.

 

# ReplicaSet 예제

apiVersion: v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset      
spec:
  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset
         image: nginx
         ports:
          - containerPort: 80
   replicas: 3
   selector:
     matchLabels:
       app: nginx-replicaset

 

 

 

4-2. Deployment

 

상태가 없는 애플리케이션을 배포할 때 사용하는 가장 기본적인 컨트롤러이다. Deployment는 ReplicaSet을 관리하면서 좀 더 애플리케이션 배포에 관련된 자세한 작업이 가능하며, 단순 Pod의 배포뿐만 아니라 배포 방식, 버전 롤백등이 가능하다.

 

# Deployment 예제

apiVersion: v1
kind: Deployment
metadata:
  name: nginx-deployment    
  lables:
  	app: nginx-deployment
spec:
  replicas: 3
  selector:
  	matchLables:
    	app: nginx-deployment
  template:
    metadata:
      name: nginx-deployment
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
         image: nginx
         ports:
          - containerPort: 80

 

 

4-3. DaemonSet

 

DeamonSet은 클러스터 전체 노드에 특정 파드를 실행할 때 사용한다. 주로 로그 수집기나, 노드를 모니터링하는 데몬 등에 사용이 된다.

 

 

# DaemonSet 예제

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: fluent/fluentd-kubernetes-daemonset:elasticsearch
        env:
        - name: testenv
          value: value
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi

 

Spec.updateStrategy.type에는 OnDelete와 RollingUpdate 중 한가지를 선택할 수 있다.

기본값으로는 1.5버전 이하와의 하위 호환성을 위해서 OnDelete이고, OnDelete로 지정하면 DaemonSet의 템플릿을 수정하더라도 바로 적용되지 않는다. 변경된 템플릿을 적용하려면 데몬셋으로 실행한 Pod를 직접 지워야만 새로운 템플릿 버전의 Pod가 실행된다

 

RollingUpdate를 지정하면 템플릿을 수정했을 때, 변경사항이 바로 적용된다 .

 

 

 

 

4-4. StatefulSet

ReplicaSet, Deployment가 상태가 없는 Pod를 관리하는 용도였다면, StatefulSet은 상태가 있는 Pod를 관리하는 컨트롤러이다.

상태가 있다는 의미는, 컨테이너가 종료되어도 컨테이너에서 필요로 하는 데이터가 남게되어 Pod를 재시작 하더라도 데이터를 보존할 수 있다.

 

# StatefulSet 예제

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3 
  template:
    metadata:
      labels:
        app: nginx 
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi


 

- StatefulSet으로 pod를 생성하면 Pod이름에 UUID가 붙지 않고, -0 , -1, -2 처럼 숫자가 순서대로 붙게 된다.

- Pod가 생성될때는 작은 숫자부터 -0 부터 생성되며 삭제될 때는 반대로 큰 숫자 -2 부터 삭제된다.

- 순서대로 생성되어야 하기 때문에 -0 이 생성되지 않으면 -1도 생성되지 않는다.

 

 

 

 

4-5. Job

Job은 배치성 작업을 진행하기 위해 사용하는 컨트롤러이다.

 

Job은 계속 실행되어야 하는 성격이 아니라, 실행되고나서 종료되어야 하는 성격을 지니고 있는 컨트롤러이다.

 

Job의 종류에는 3가지가 있다

- 단일 잡 ( 하나의 Pod를 실행하고 성공적으로 실행되면 종료한다)

- 완료 개수가 있는 병렬 잡 ( 여러개의 파드를 실행시키며, 완료 횟수가 고정되어 있는 병렬 작업 )

- 워크 큐를 가진 병렬 잡 (최소한 하나의 파드가 성공적으로 종료되고 또 다른 파드가 종료될때 완료된 것으로 간주)

 

# Job 예제

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

 

 

 

 

4-6. CronJob

CronJob은 Job을 시간 기준으로 관리한다. 지정한 시간에 한번만 잡을 실행하거나, 지정한 시간동안 주기적으로 잡을 반복하는 작업에서 사용한다.

 

 

기본적으로 CronJob은 Job과의 설정과 크게 다르지 않다. 크게 다른점은 schedule로 주기를 설정하는 부분이다.

# CronJob 예제

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure