관리 메뉴

개발노트

쿠버네티스(k8s) 내장 오브젝트 동작 방법 본문

클라우드/Kubernetes

쿠버네티스(k8s) 내장 오브젝트 동작 방법

YoonGwon 2021. 1. 11. 18:10

[쿠버네티스 자체 내장 오브젝트 동작 예시]

쿠버네티스에 자체적으로 내장된 오브젝트를 예시로 들어 설명해보자. Deployment 오브젝트의 목적은 'ReplicaSet을 만드는 것' 이고, ReplicaSet 오브젝트의 목적은 'Matchlabel에 대응하는 Pod를 생성하는 것' 이다. 이처럼 커스텀 리소스가 어떻게, 무엇을 위해서 동작할 것인지를 정의해야 하는데, 이는 여러분이 직접 구현해야 한다. 이러한 작업은 'alice'와 'bob' 이라는 이름의 Pod를 만드는 것일수도 있고, 10개의 웹서버 Pod와 1개의 Service를 생성하는 것일수도 있다. 

 

그리고 그러한 작업을 선언적으로 (Declarative) 수행하도록 구현한 것을 컨트롤러 (Controller) 라고 부르며, 컨트롤러는 커스텀 리소스가 가져야 하는 최종적인 상태를 유지하는 역할을 담당한다. 예를 들어 Alice 커스텀 리소스의 목적이 alice, bob 두 개의 Pod가 Running 상태에 있는 것이고, 그것이 바람직한 상태라고 가정해보자. 그렇다면 Alice의 컨트롤러는 두 개의 Pod를 계속해서 생성하려고 시도할 것이고, 최종적으로는 alice, bob 두 개의 Pod가 실행되고 있는 바람직한 상태를 계속 유지할 것이다.

 

지금까지 설명한 내용을 토대로 커스텀 리소스를 사용하는 방법을 정리해보면 아래와 같다.

 

 

 

1. 쿠버네티스의 기능 중 하나인 CRD를 통해 커스텀 리소스에 대한 정의를 생성한다.

2. CRD에 정의된 포맷대로 커스텀 리소스를 생성한다.

3. 컨트롤러는 쿠버네티스의 Watch API를 통해 커스텀 리소스가 생성된 것을 알아챈다.

4. 컨트롤러는 커스텀 리소스의 설정에 알맞는 동작을 수행한다. (Pod 또는 Service 생성 등등..)

 

 

Tip : Cloud Native Infrastructure에서 자주 언급되는 단어들 중, 선언적 (Declarative) 및 명령적 (Imperative) 동작이라는 것이 있다. 쿠버네티스는 선언적 및 명령적 동작을 모두 지원하지만, 가능하면 선언적인 동작을 사용하는 것이 권장되고 있다. 선언적 동작은 Desired-state 를 미리 정의한 뒤 Current-state가 Desired-state가 되도록 하는 것을 의미하며, 쿠버네티스의 컨트롤러는 대표적인 선언적 동작의 예시라고 볼 수 있다.

 

kubectl apply -f 은 선언적이고, kubectl create 는 명령적이라는 것을 생각해보면 쉽게 이해할 수 있다.

 

위 과정 중에서 (1) CRD를 정의하고, (2) 이로부터 커스텀 리소스를 생성하는 단계는 이미 위에서 다뤄 보았다. 그렇다면 다음 단계는 커스텀 리소스를 위한 컨트롤러를 구현하는 작업이 될 터인데, 이것이 마냥 쉽지 않다는게 문제다. 컨트롤러를 직접 구현하려면 쿠버네티스의 저수준 API를 알아야 하는데, 초보자에게는 이것마저도 벅찬 일이다. 게다가 바람직한 상태를 유지하기 위한 컨트롤러 로직을 어떻게 구현해야 하는지에 대한 가이드도 아직 많은 편은 아니다.

 

다행히도 CoreOS에서 제공하고 있는 Operator SDK 라는 도구를 사용하면 이러한 일련의 과정을 쉽게 진행할 수 있다. Operator SDK는 커스텀 리소스와 컨트롤러를 구현하기 위한 일종의 틀을 제공하고 있으며, 그에 대한 예제 코드 또한 함께 공개하고 있다. 따라서 쿠버네티스에 익숙하지 않은, 나와 같은 초보자들도 쉽게 Operator를 구현할 수 있다는 장점이 있다.

728x90

'클라우드 > Kubernetes' 카테고리의 다른 글

EKS란?  (0) 2022.03.16
k8s 배포 가이드  (0) 2022.03.15
쿠버네티스(k8s) 개념 정리  (0) 2021.01.11
Kubernetes - 사용자 계정 인증 및 권한 인가  (0) 2020.12.15