ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Custom Resource 알아보기
    Kubernetes 2023. 12. 11. 17:25
    728x90
    반응형

    - 목차

     

    소개.

    쿠버네티스의 Custom Resource 에 대해서 알아보려고 합니다. 
    쿠버네티스는 자체적인 Resource 들을 가집니다. 
    Pod, ReplicaSet, Deployment, Service, PersistentVolume 등이 있죠. 
    이러한 리소스들을 조합하여 하나의 큰 서비스가 구현됩니다. 

    예를 들어, Nginx 어플리케이션을 쿠버네티스 리소스들을 통해서 구현해보겠습니다. 
    먼저 Nginx 이미지가 필요하며, Nginx 이미지를 통해서 Pod 들을 생성합니다. 
    그리고 이러한 Pod 들을 묶는 ReplicaSet 또는 Deployment 가 필요합니다. 
    외부 네트워크 트래픽을 수용할 Service 와 Ingress 또한 필요하겠죠. 
    따라서 하나의 Deployment, Ingress, Service 이 모이면 Nginx Application 을 구축할 수 있습니다. 

    추가적으로 MySQL 로 예를 들어보겠습니다.
    데이터베이스 특성상 볼륨이 필요하며, 어플리케이션이 재시작되더라도 그 상태가 유지되어야합니다. 
    그래서 Volume 과 StatefulSet 를 사용해야합니다. 
    MySQL 어플리케이션은 PersistentVolume 과 StatefulSet 으로 구성할 수 있습니다. 

    이런 식으로 쿠버네티스에서 구동시킬 어플리케이션들은 쿠버네티스 리소스로써 표현이 가능합니다. 
    Custom Resource 는 쿠버네티스 리소스들로 구성된 새로운 리소스입니다. 
    그래서 Custom Resource 하나만을 관리하면 관련된 여타 리소스들 또한 한번에 관리됩니다. 
    만약 a 라는 Custom Resource 가 하나의 Deployment 와 Service 를 가진다면, 
    a Custom Resource 를 생성함으로써 Deployment 와 Service 가 동시에 배포됩니다. 
    그리고 이러한 관리를 위해서 Custom Resource Controller 또한 필요한데요. 
    이러지는 글에서 자세히 알아보도록 하겠습니다. 
     
     

    Controller Pattern ?

    쿠버네티스는 Controller 라는 구성요소가 존재합니다. 
    이는 쿠버네티스의 핵심적인 존재인데요. 
    개별적인 리소스마다 Controller 가 있습니다. 
    ReplicaSet Controller, Deployment Controller, Job Controller , CronJob Controller 
    등이 있습니다. 
     
    Controller 는 Reconcile Loop 라고 하여 쿠버네티스 리소스의 현재 상태를 지속적으로 체크합니다. 
    ReplicaSet Controller 를 예로 들어보겠습니다. 
    생성된 ReplicaSet A 가 있다고 가정하겠습니다. 
    A ReplicaSet 의 replicas 는 10 으로 설정되어 있습니다. 
    만약 하나의 Pod 가 종료되어 현재 Pod 의 갯수가 9가 된다면, 
    Reconcile Loop 에서 current state 인 9 과 desired state 인 10 이 서로 다른 상태임을 판단하고, 
    1개의 Pod 를 추가적으로 생성합니다. 

    CronJob Controller 를 추가적으로 예를 들어보면, 
    매 분마다 현재 시각과 매칭되는 Cron Expression 을 가진 CronJob 을 조회합니다. 
    그래서 조회된 CronJob 이 실행되는 구조이죠.
     
    이러한 방식으로 Controller 는 Resource 가 올바른 상태로 유지되도록 Control 합니다.
     

    Custom Resource Definition 이란 ?

    위에서 언급했듯이 Custom Resource 는 여러가지 쿠버네티스 리소스들로 구성됩니다. 
    그리고 이러한 Custom Resource 를 정의하는 설정이 CRD 라고하는 Custom Resource Definition 입니다. 
    CRD 의 예시는 아래와 같습니다. 

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: myapps.example.com
    spec:
      group: example.com
      versions:
        - name: v1alpha1
          served: true
          storage: true
      scope: Namespaced
      names:
        plural: myapps
        singular: myapp
        kind: MyApp
        shortNames:
          - ma



    위 yaml 은 myapp 이라는 Custom Resource 를 생성하는 CRD 이구요. 
    위 yaml 을 생성함으로써 쿠버네티스 상에 myapp 이라는 새로운 리소스 타입이 생성됩니다. 

    그리고 Custom Resource 의 Reconcile Loop 을 위해서 별도의 Custom Resource Controller 가 필요합니다. 
    보통 Custom Resource Controller 는 Deployment 형태로 생성되며, 별도의 로직 구현을 통해서 만들어집니다. 
    대략적인 코드는 아래와 같습니다. 

    for (true) {
        currentState := getCurrentState()
        desiredState := getDesiredState()
        if (isDifference(currentState, desiredState)) {
            updateResource(desiredState)
        }
    }



    그리고 해당 Reconcile Loop 을 수행하는 CR Controller 의 Image 를 기반으로 Deployment 리소스를 생성합니다. 
    (반드시 Deployment 리소스여야하는 것은 아닙니다!)

    반응형

    'Kubernetes' 카테고리의 다른 글

    Kubernetes Nginx Ingress 알아보기  (0) 2023.12.16
    Helm 알아보기  (2) 2023.12.11
    Kubernetes Certificate 알아보기  (0) 2023.12.11
    Kubernetes ReplicaSet 알아보기  (2) 2023.11.28
    KinD 알아보기.  (0) 2023.11.27
Designed by Tistory.