본문 바로가기

IT

[k8s] Kubernetes Controller (쿠버네티스 컨트롤러) - 01

많은 회사들이 이젠 k8s 로 서버를 관리하고 있을 것이라 생각한다.

나도 이제 1년정도 개발 후, k8s 환경에 서버를 배포하고있는데 모르는게 정말 많다. 

배포를 관리하는 개발자 (혹은 운영자) 라면 k8s 에 배포한 파드(pod)를 Lens 프로그램으로 이것저것 살펴보게 된다.

이때 나눠진 메뉴들은 내 직감(?) 은 알고있는데 난 그게 참 설명하기가 어렵다(이걸 모른다고 하는건가??;;)

하나하나 차근차근 정리하다보면 내 것이 될 것이라 생각한다.

오늘은 쿠버네티스 컨트롤러에 대해 정리하려고 한다.

 

컨트롤러란?

k8s 클러스터 내부에서 파드를 설정하고 배포하는 방법을 정의함

컨트롤러는 런타임 요구사항에 따라서 파드를 그룹화하고 파드의 복제, 파드의 시작순서를 정의할 수 있음

한 마디로 파드 배포 설정 관리자

 

Replicaset

복사되어야하는 파드의 세트를 정의함

그룹에서 각 파드에 대한 정확한 구성가능

권한이 있어야하는 리소스를 정의할 수 있음

애플리케이션의 스케줄링, 쉬운 확장처리(scaling), 롤링업데이트 또는 멀티트랙업데이트를 수행할 수 있음

 

Deployment

파드와 Replicaset 을 관리할 수 있음

새로운 버전의 ReplicaSet을 만들고 파드를 이전 버전에서 새로운 버전으로 마이그레이션 함

사용하지 않은 오래된 ReplicaSet 을 관리함

 

StatefulSet

시작순서와 StatefulSet 의 생명주기동안 유일한 식별자를 보장하는 파드를 생성할 수 있음 --> 스토리지, 네트워킹과 같은 지속적인 구성요소들이 보장되므로 k8s 에서 안정적인 어플리케이션 실행이 가능함

항상 동일한 순서로 파드를 생성할 수 있으므로 안정적인 애플리케이션 실행이 가능

 

라고 말하지만... 실제로 보거나 사용하지 않으면 이해하기 힘들다.

그래서 실제로 간단한 버전을 만들어보고 감을 익혀보자.

 

Deployment 생성하기

Deployment 를 생성을 제목으로 잡은 이유는 ReplicaSet manifest 를 지정하지 않아도 Deployment 를 통해 ReplicaSet 을 생성하고 관리할 수 있다.

 

아래의 예제로 Deployment, ReplicaSet, Pod 를 생성하고 조회해보자 

File name: nginx-deployment.yaml

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

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

 

필요한 부분만 간단하게 살펴보자.

 

  • spec.replicas 레플리카 파드(ReplicaSet 의 파드) 개수를 지정함
  • spec.template.spec.containers Pod 에 실행될 컨테이너를 지정함. 여기에서는 nginx 라는 1개의 컨테이너가 실행됨 (여러개도 가능)

 

다음 명령어로 Deployment 를 생성한다.

kubectl apply -f nginx-deployment.yaml

 

 

생성이 제대로 되었으면 내가 만든 Pod, ReplicaSet, Deployment 를 조회해보자.

 

Deployment 조회

다음 명령어로 Deployment 리스트를 조회한다.

kubectl get deploy

 

 

Deployment 가 생성되면 아래와 비슷한 결과를 확인할 수 있다.

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           18s

 

  • NAME Deployment 의 metadata.name 입력 값

 

ReplicaSet 조회

다음 명령어로 ReplicaSet 리스트를 조회한다

kubectl get rs

모두가 눈치챘겠지만 rs 는 ReplicaSet 의 줄임말이다.

 

Deployment 로 생성된 ReplicaSet 은 아래와 비슷하게 출력된다.

NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-75675f5897   3         3         3       18s

 

  • NAME {DeploymentName}-{RandomString} RandomString 은 pod-template-hash 의 seed 값이다.
  • CURRENT 현재 실행 중인 레플리카 수
  • READY 사용자가 사용할 수 있는 레플리카 수 

 

Pod 조회

다음 명령어로 Pod 리스트를 조회한다

Kubectl get pods

 

Deployment 로 생성된 Pod 가 아래와 비슷하게 출력된다.

NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-75675f5897-7ci7o   1/1       Running   0          18s       
nginx-deployment-75675f5897-kzszj   1/1       Running   0          18s       
nginx-deployment-75675f5897-qqcnn   1/1       Running   0          18s

 

 

StatefulSet 은 설명하기 전에

k8s volume 설명이 더 필요해보여 다음편에...

 

 

참고자료

https://docs.oracle.com/en/operating-systems/olcne/orchestration/about.html#controllers

https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/