Crossplane이란?
Crossplane이란? (What's Crossplane?)
Crossplane은 플랫폼 엔지니어링(platform engineering)을 위한 컨트롤 플레인 프레임워크예요. Crossplane으로 컨트롤 플레인을 만들어 클라우드 네이티브 소프트웨어를 관리하고, 사용자가 그 컨트롤 플레인과 상호작용할 API와 추상화를 설계할 수 있어요.
출처: 문서
본문
컨트롤 플레인(control plane)은 다른 소프트웨어를 제어하는 소프트웨어예요. 컨트롤 플레인은 클라우드 네이티브의 핵심 패턴이며, 주요 클라우드 제공자들은 모두 컨트롤 플레인 위에 구축되어 있어요.
컨트롤 플레인은 API를 노출해요. 그 API를 통해 컨트롤 플레인에 어떤 소프트웨어를 어떻게 구성할지 알려주는데, 이게 바로 **원하는 상태(desired state)**예요. 컨트롤 플레인은 앱 배포, 로드 밸런서 생성, GitHub 리포지토리 생성 등 어떤 클라우드 네이티브 소프트웨어든 구성할 수 있어요.
컨트롤 플레인은 소프트웨어를 구성한 뒤 그 생애주기 내내 모니터링해요. 소프트웨어가 원하는 상태에서 벗어나면(드리프트) 컨트롤 플레인이 자동으로 그 드리프트를 바로잡아요.
Crossplane은 컨트롤 플레인을 더 빠르고 쉽게 만들 수 있는 풍부한 확장 생태계를 갖추고 있어요. Kubernetes 위에 구축되어 있으므로 이미 쓰고 있는 Kubernetes 도구와 모두 호환되죠.
Crossplane의 핵심 가치는, Kubernetes 커스텀 리소스를 직접 만들면서도 그에 대한 컨트롤러를 직접 작성하지 않아도 된다는 이점을 얻을 수 있다는 점이에요.
Kubernetes 커스텀 리소스와 컨트롤러에 익숙하지 않다면, DevOps Toolkit의 영상이 좋은 설명을 제공해요. 참고로 Kubebuilder는 Kubernetes 컨트롤러를 만드는 유명한 프로젝트인데, Kubebuilder 문서를 보면 컨트롤러 작성에 무엇이 필요한지 알 수 있어요.
Crossplane 컴포넌트
Crossplane에는 네 가지 주요 컴포넌트가 있어요.
- Composition — 클라우드 네이티브 소프트웨어를 제어하는 커스텀 API를 만들어요.
- Managed resources — 준비된 Kubernetes 커스텀 리소스예요.
- Operations — 함수 파이프라인으로 운영 작업을 실행해요.
- Package manager — 새 관리 리소스와 컴포지션 함수를 설치해요.
네 컴포넌트를 모두 써서 컨트롤 플레인을 만들 수도 있고, 필요한 것만 골라 쓸 수도 있어요.
Composition
Composition은 클라우드 네이티브 소프트웨어를 제어하는 커스텀 API를 만들게 해줘요.
Crossplane은 Kubernetes를 확장해요. Crossplane을 써서 Kubernetes에 새 커스텀 리소스를 추가하는 방식으로 커스텀 API를 만드는 거죠. Crossplane 없이 Kubernetes를 확장하려면 Kubernetes 컨트롤러가 필요해요. 컨트롤러는 사용자가 커스텀 리소스 API를 호출했을 때 반응하는 소프트웨어예요.
예를 들어 컨트롤 플레인이 App 커스텀 리소스 API를 제공한다고 해볼게요. 누군가 App을 만들면 컨트롤 플레인이 Kubernetes Deployment와 Service를 만들어야 해요.
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
controller[Your App Controller]
deployment(Deployment API)
service(Service API)
end
user -- create --> api
controller watch@ api
controller -- create --> deployment
controller -- create --> service
원하는 일을 하고 원하는 API를 노출하는 컨트롤러가 이미 없다면 컨트롤러를 직접 작성해야 해요. 하지만 Crossplane을 쓰면 컨트롤러를 작성할 필요가 없어요. 대신 함수(functions) 파이프라인을 구성해요. 함수는 Crossplane이 적용해야 할 선언적 구성을 반환해요.
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
subgraph crossplane [Composition Engine]
fn(Python Function)
end
deployment(Deployment API)
service(Service API)
end
user -- create --> api
crossplane watch@ api
crossplane -- create --> deployment
crossplane -- create --> service
Composition을 쓰면 작성하고 유지하기 어려운 복잡한 컨트롤러 코드를 피할 수 있어요. 대신 비즈니스 로직을 표현하는 데 집중하고, 선호하는 언어로 작업할 수 있죠. 컴포지션 함수는 YAML, KCL, Python, Go 등 여러 언어로 구성을 작성할 수 있게 해주는 설정 언어 플러그인 같은 존재예요.
컴포지션은 관리 리소스와 함께 사용해 관리 리소스로 구동되는 새 커스텀 리소스 API를 만들 수도 있어요. 컴포지션이 어떻게 동작하는지는 Get Started with Composition에서 확인할 수 있어요.
Managed resources
관리 리소스(MR)는 준비된 Kubernetes 커스텀 리소스예요. 각 MR은 Kubernetes를 확장해 새로운 시스템을 관리할 수 있게 해줘요. 예를 들어 RDS 인스턴스 MR은 Kubernetes를 확장해 AWS RDS 인스턴스를 관리하게 해줘요.
Crossplane에는 거의 모든 클라우드 제공자나 클라우드 네이티브 소프트웨어를 관리할 수 있는 방대한 관리 리소스 라이브러리가 있어요. 클러스터 밖의 무언가를 커스텀 리소스로 관리하고 싶을 때 컨트롤러를 쓸 필요 없이, 이미 그에 맞는 Crossplane 관리 리소스가 존재하는 거죠.
flowchart TD
user(User)
subgraph control [Control Plane]
instance(RDS Instance API)
controller(Managed Resource Controller)
end
subgraph aws [Amazon Web Services]
rds(RDS Instance)
end
user -- create --> instance
controller watch-rds@ instance
controller -- create --> rds
관리 리소스는 컴포지션과 함께 사용해 MR로 구동되는 새 커스텀 리소스 API를 만들 수 있어요.
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
subgraph crossplane [Composition Engine]
fn(Python Function)
end
deployment(Deployment API)
service(Service API)
instance(RDS Instance API)
controller(Managed Resource Controller)
end
subgraph aws [Amazon Web Services]
rds(RDS Instance)
end
user -- create --> api
crossplane watch-apps@ api
crossplane -- create --> deployment
crossplane -- create --> service
crossplane -- create --> instance
controller watch-rds@ instance
controller -- create --> rds
관리 리소스가 어떻게 동작하는지는 Get Started with Managed Resources에서 확인할 수 있어요.
Operations
Operations는 함수 파이프라인으로 운영 작업을 실행하게 해줘요. 컴포지션과 관리 리소스가 인프라를 만들고 관리하는 데 집중한다면, operations는 인증서 모니터링, 롤링 업그레이드, 예약된 유지보수처럼 전형적인 리소스 생성 패턴에 맞지 않는 작업을 처리해요.
Operations는 Kubernetes Job처럼 함수 파이프라인을 끝까지 실행해요. 리소스를 계속 관리하는 대신 특정 작업을 수행하고 결과를 보고하는 거예요.
예를 들어 컨트롤 플레인이 Kubernetes Ingress 리소스의 SSL 인증서를 감시한다고 해볼게요. 누군가 Operation을 만들면 컨트롤 플레인이 인증서를 확인하고 Ingress에 만료 정보를 어노테이션으로 남겨요.
flowchart TD
user(User)
subgraph control [Control Plane]
operation(SSL Monitor Operation)
subgraph crossplane [Operation Engine]
fn(Python Function)
end
ingress(Ingress API)
end
subgraph ext [External System]
cert(SSL Certificate)
end
user -- create --> operation
crossplane watch@ operation
crossplane -- read --> ingress
crossplane -- check --> cert
crossplane -- annotate --> ingress
Operations는 세 가지 모드를 지원해요.
- Operation — 한 번 실행 후 완료
- CronOperation — 예약된 주기에 따라 실행
- WatchOperation — 리소스가 변경될 때 실행
Operations는 컴포지션·관리 리소스와 함께 사용해 컨트롤 플레인의 완전한 운영 워크플로를 만들 수 있어요. Get Started with Operations에서 동작 방식을 확인할 수 있어요. 참고로 Operations는 Crossplane v2에서 제공되는 알파 기능이에요.
Package manager
Crossplane 패키지 매니저는 새 관리 리소스와 컴포지션 함수를 설치해줘요. 컨트롤 플레인 구성의 어떤 부분이든 패키지로 묶어 패키지 매니저로 설치할 수 있어요. 이를 통해 동일한 기능을 가진 컨트롤 플레인을 여러 개 배포할 수 있죠 — 예를 들어 리전별, 서비스별로 하나씩 말이에요.
패키지 매니저에 대해 더 알아보려면 Crossplane packages 문서를 읽어보세요.