조직들이 클라우드 네이티브 애플리케이션을 위해 Kubernetes를 도입함에 따라 인프라를 효율적으로 관리하는 것이 도전 과제가 됩니다. Terraform, Pulumi와 같은 전통적인 인프라 코드(IaC) 도구들은 선언적 구성을 제공하지만 Kubernetes 네이티브 워크플로우에 원활하게 통합되지 않습니다.
Crossplane은 이러한 상황에서 Kubernetes와 클라우드 인프라 간의 간극을 효과적으로 메워줍니다. 이 블로그에서는 Crossplane이 Kubernetes 및 그 이상의 IaC를 어떻게 가능하게 하는지 살펴보겠습니다.
Crossplane이란?
Crossplane은 Kubernetes 사용자 정의 리소스 정의 (CRD)와 Kubernetes API를 사용하여 클라우드 인프라를 프로비저닝하고 관리할 수 있게 해주는 오픈 소스 Kubernetes 애드온입니다. 외부 실행을 요구하는 전통적인 IaC 도구와는 달리, Crossplane은 인프라 관리를 Kubernetes에 내장합니다. 이는 진정으로 선언적이며 GitOps 친화적입니다.
사용 사례: Terraform vs. Crossplane
Terraform을 언제 사용해야 할까요?
- Kubernetes 외부의 인프라 관리에 최적입니다.
- 전통적인 멀티 클라우드 배포 및 VM에 이상적입니다.
- 광범위한 모듈과 제공업체로 강력한 생태계를 가지고 있습니다.
- 자동화를 위해 Ansible, Packer, Vault와 같은 도구와 잘 작동합니다.
Crossplane을 언제 사용하나요?
- Kubernetes 중심 환경에 가장 적합합니다.
- GitOps 워크플로에 이상적입니다 (ArgoCD, Flux)
- Kubernetes CRD를 통해 셀프 서비스 프로비저닝을 가능하게 합니다.
- 멀티 클라우드 Kubernetes 제어에 적합합니다 (K8s API를 통해 클라우드 서비스 관리)
Crossplane 시작하기
이번 샘플에서는 minikube를 사용할 것입니다. 그러나 동일한 단계는 모든 Kubernetes에 적용될 수 있습니다.
1단계: Kubernetes에 MySQL 배포하기
1. Crossplane을 사용하여 구성하기 위해 서비스와 함께 배포로 MySQL을 배포합니다. 다른 위치에서 배포된 MySQL을 사용할 수도 있습니다.
2. MySQL을 실행하는 데 필요한 비밀, 배포 및 서비스를 생성하는 mysql-deployment.yaml
을 정의합니다.
apiVersion v1
kind Secret
metadata
name mysql-root-password
type Opaque
data
password cGFzc3dvcmQ= # Base64 encoded "password"
---
apiVersion v1
kind Service
metadata
name mysql-service
spec
selector
app mysql
ports
protocol TCP
port3306
targetPort3306
---
apiVersion apps/v1
kind Deployment
metadata
name mysql
spec
selector
matchLabels
app mysql
strategy
type Recreate
template
metadata
labels
app mysql
spec
containers
image mysql8.0
name mysql
env
name MYSQL_ROOT_PASSWORD
valueFrom
secretKeyRef
name mysql-root-password
key password
ports
containerPort3306
name mysql
3. kubectl apply -f mysql-deployment.yaml
명령을 사용하여 YAML을 적용합니다.
4. kubectl get pods
명령을 사용하여 포드가 실행 중인지 확인합니다.
5. 임시 SQL 포드를 시작하여 MySQL 배포를 확인하여 MySQL 연결을 검증합니다. kubectl run mysql-client --image=mysql:8.0 -it --rm -- bash
명령을 사용하여 클라이언트를 생성합니다.
6. mysql -h mysql-service.default.svc.cluster.local -uroot -ppassword
명령을 사용하여 포드 내의 MySQL에 연결합니다.
2단계: Kubernetes에 Crossplane 설치하기
1. Helm을 사용하여 Crossplane을 설치합니다:
kubectl create namespace crossplane-system
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane crossplane-stable/crossplane --namespace crossplane-system
참고: Crossplane이 실행되기까지 몇 분이 걸립니다.
2. kubectl get pods -n crossplane-system
명령어를 사용하여 Crossplane 설치를 확인합니다.
3단계: SQL용 Crossplane Provider 설치하기
1. 아래 YAML 내용을 사용하여 MySQL 프로바이더를 정의합니다.
apiVersion pkg.crossplane.io/v1
kind Provider
metadata
name provider-sql
spec
package xpkg.upbound.io/crossplane-contrib/provider-sql v0.9.0
2. kubectl apply -f provider.yaml
명령어를 사용하여 프로바이더를 생성합니다.
3. 다음 명령어를 사용하여 프로바이더를 확인합니다: kubectl get pods -n crossplane-system
및 kubectl get providers
.
참고: SQL 프로바이더는 실행되기까지 몇 분이 걸립니다.
4단계: Crossplane MySQL Provider 구성하기
프로바이더 구성은 Crossplane이 MySQL에 인증하는 방법을 알려줍니다. 프로바이더 사용을 위해 생성할 비밀을 정의합니다. 아래 YAML에서 stringData
를 적절하게 업데이트합니다. kubectl apply -f mysql-secret.yaml
를 사용하여 YAML을 적용합니다.
apiVersion v1
kind Secret
metadata
name mysql-conn-secret
namespace default
type Opaque
stringData
credentials"root:password@tcp(mysql-service.default.svc.cluster.local:3306)"
username"root"
password"password"
endpoint"mysql-service.default.svc.cluster.local"
port"3306"
위 비밀을 사용하여 Crossplane의 아래 프로바이더 구성을 적용합니다. kubectl apply -f providerconfig.yaml
명령어를 사용하여 적용합니다.
apiVersion mysql.sql.crossplane.io/v1alpha1
kind ProviderConfig
metadata
name mysql-provider
spec
credentials
source MySQLConnectionSecret
connectionSecretRef
name mysql-conn-secret
namespace default
명령어를 사용하여 프로바이더 구성 생성 여부를 확인합니다 — kubectl get providerconfigs.mysql.sql.crossplane.io
및 kubectl get crds | grep providerconfig
.
5단계. Crossplane을 사용하여 MySQL 데이터베이스 생성하기
이제 Crossplane을 사용하여 새 데이터베이스를 프로비저닝합니다. 아래 YAML을 사용하고 kubectl apply -f mysqlinstance.yaml
명령어로 적용하세요.
apiVersion mysql.sql.crossplane.io/v1alpha1
kind Database
metadata
name my-database
spec
providerConfigRef
name mysql-provider
forProvider
binlog true
writeConnectionSecretToRef
name db-conn
namespace default
6단계: 데이터베이스 생성 확인
명령어 kubectl get database.mysql.sql.crossplane.io/my-database
를 사용하여 데이터베이스 생성 여부를 확인하세요.
데이터베이스 생성을 확인하기 위해 1단계에서 언급한 동일한 확인 단계를 사용하여 MySQL에 연결하세요.
위의 단계를 통해 Crossplane을 설치하고 MySQL 공급자를 구성했으며, Crossplane을 사용하여 데이터베이스를 프로비저닝했습니다.
Terraform과 Crossplane이 함께 작업할 수 있을까요?
Terraform과 Crossplane은 다양한 시나리오에서 함께 사용할 수 있습니다.
시나리오 1
완전한 IaC 시나리오에서는 Terraform을 사용하여 Kubernetes 클러스터를 부트스트랩하고, 이후 Crossplane을 사용하여 Kubernetes 내에서 클라우드 리소스를 관리할 수 있습니다. Terraform은 Crossplane 자체를 배포할 수도 있습니다. 이 하이브리드 워크플로우 예시는
- Terraform이 모든 클라우드 공급자에서 Kubernetes 클러스터를 프로비저닝합니다.
- Crossplane은 Kubernetes CRD를 사용하여 클라우드 서비스를 관리합니다(데이터베이스, 스토리지 및 네트워킹).
시나리오 2
Crossplane은 Terraform 공급자를 지원하여 Crossplane의 IaC 모델의 일환으로 Terraform 스크립트를 실행할 수 있습니다. Crossplane을 위한 Terraform 공급자를 실행하는 것은 Crossplane의 기본 공급자가 특정 클라우드 리소스나 기능을 아직 지원하지 않는 여러 시나리오에서 유용할 수 있습니다. Crossplane을 위한 Terraform 공급자를 실행해야 하는 이유는 다음과 같습니다:
- Terraform은 Crossplane이 아직 기본 공급자로 지원하지 않을 수 있는 많은 클라우드 서비스를 지원하는 방대한 공급자 생태계를 가지고 있습니다.
- 조직이 이미 인프라 관리에 Terraform을 사용하고 있다면, 모든 것을 Crossplane CRD로 다시 작성할 필요가 없습니다.
- Crossplane은 멀티 클라우드 관리를 지원하지만, 기본 공급자가 모든 온프레미스 또는 SaaS 통합을 다루지 않을 수 있습니다.
- Terraform에서 Crossplane으로 점진적으로 전환하려는 조직의 경우, Crossplane 내에서 Terraform 공급자를 사용하는 것은 전체 마이그레이션 전에 하이브리드 솔루션으로 작용할 수 있습니다.
- Crossplane 내에서 Terraform을 실행하면 Terraform이 Kubernetes의 선언적 GitOps 모델 하에 놓이게 됩니다.
Crossplane을 사용하여 IBM Cloud Cloudant DB 생성 단계
1단계. Terraform 공급자를 정의합니다.
apiVersion pkg.crossplane.io/v1
kind Provider
metadata
name provider-terraform
spec
package xpkg.upbound.io/upbound/provider-terraform v0.19.0
2단계. 공급자를 구성합니다.
apiVersion tf.upbound.io/v1beta1
kind ProviderConfig
metadata
name terraform-provider-ibm
spec
3단계. Crossplane의 일환으로 Terraform 스크립트를 사용하여 IBM Cloud에서 Cloudant DB를 프로비저닝합니다.
apiVersion tf.upbound.io/v1beta1
kind Workspace
metadata
name ibm-cloudant-db
spec
providerConfigRef
name terraform-provider-ibm
writeConnectionSecretToRef
name ibmcloud-terraform-secret
namespace crossplane-system
forProvider
source Inline
module
terraform {
required_providers {
ibm = {
source = "IBM-Cloud/ibm"
}
}
backend "kubernetes" {
secret_suffix = "ibmcloud-terraform-secret"
namespace = "crossplane-system"
}
}
provider "ibm" {
ibmcloud_api_key = var.ibmcloud_api_key
}
resource "ibm_cloudant" "cloudant_instance" {
name = "crossplanecloudant"
location = "us-south"
plan = "lite"
}
variable "ibmcloud_api_key" {
type = string
}
vars
key ibmcloud_api_key
value"<Your IBM Cloud API Key>"
이것은 IBM Cloud에서 crossplanecloudant라는 이름의 Cloudant DB를 프로비저닝합니다.
Crossplane이 플랫폼 엔지니어링에 적합한 이유
플랫폼 엔지니어링은 인프라 관리 및 애플리케이션 배포를 간소화하는 내부 개발자 플랫폼 (IDP)을 구축하고 유지하는 데 중점을 둡니다. Crossplane은 Kubernetes 네이티브 접근 방식을 가능하게 하여 이 과정에서 중요한 역할을 합니다.
Crossplane은 선언적이고, 자가 서비스 가능하며, 정책 기반의 클라우드 자원 프로비저닝을 보장합니다. Crossplane의 기능은 K8s API를 통한 선언적 인프라, 인프라 및 애플리케이션에 대한 맞춤형 추상화, 보안 및 규정 준수 가이드라인, 버전 관리되고 자동화된 배포, 지속적인 드리프트 수정 등이 있으며, 이는 플랫폼 엔지니어링에 도움을 줍니다.
결론
Crossplane은 IaC를 Kubernetes 생태계로 가져옴으로써 클라우드 인프라 관리 방식을 혁신합니다. Kubernetes API는 클라우드 자원의 프로비저닝 및 관리를 위한 진정한 선언적이고 GitOps 기반의 접근 방식을 가능하게 합니다. 이미 Kubernetes를 사용하고 있으며 IaC 전략을 현대화하려는 경우, Crossplane은 확실히 탐색할 가치가 있습니다.
Source:
https://dzone.com/articles/codify-cloud-kubernetes-crossplane-iac