-
Kubernetes Custom Resource 알아보기Kubernetes 2023. 12. 11. 17:25728x90반응형
- 목차
소개.
쿠버네티스의 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