devops/ETC

Cross Plane 이란

gepp 2024. 6. 15. 13:45

 

Overview


 

Crossplane 이란 “클라우드 네이티브 제어 영역 프레임워크” 이며,

코드를 작성할 필요 없이 어플리케이션과 인프라를 오케스트레이션 할 수 있는 프레임워크입니다.

쉽게 말해서 Kubernetes 클러스터에서 인프라 자원을 관리하기 위한 오픈 소스 툴입니다.

 

클라우드 업체에서 컨트롤 플레인을 사용해 플랫폼을 구축하듯이,

조직이 플랫폼을 구축할 수 있게 하는 kubernetes 기반 오픈 소스 CNCF 프로젝트입니다.

 

오케스트레이션을 위한 확장성있는 백엔드와 선언적인 API를 정의할 수 있는 프런트엔드를 갖추고 있습니다.

Kubernetes 기반으로 구축되어 RBAC 등 컨테이너 뿐 아니라 모든 것을 조율할 수 있으며 클라우드 기본 도구와 통합 가능 합니다.

 

Upbound 라는 마켓플레이스를 통해 Crossplane Provider 과 구성을 쉽게 찾을 수 있습니다.

또한 Apache 2.0 라이센스를 따라 출시된 오픈 소스이며 커뮤니티 중심 프레임워크 입니다.

 


 

 

 

How to use


 

Helm 이 설치되어있다면, 헬름을 통해 Crossplane을 설치할 수 있습니다.

 

helm repo add crossplane-stable https://charts.crossplane.io/stable
helm repo update
helm install crossplane --namespace crossplane-system crossplane-stable/crossplane

 

 

또는 Crossplan Github Repository 에서 직접 yaml 파일로 다운받아 설치할 수 있습니다.

 

kubectl apply -f https://raw.githubusercontent.com/crossplane/crossplane/main/deploy/release/crossplane/provider-latest.yaml

 

 

본인은 AWS에 익숙하므로, 사용을 위해 AWS Provider 기반으로 기술하겠습니다.

 

IAM credential 이 필요하므로, 해당 경우에는 IAM Role을 사용하는 기반으로 기술합니다.

 

먼저 사용할 IAM Role 의 Trust Relationship 을 정합니다.

 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root" // 또는 Crossplane을 실행하는 IAM User의 ARN
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/<OIDC_PROVIDER_URL>" // Kubernetes OIDC Provider의 ARN
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.amazonaws.com/id/<CLUSTER_OIDC_ISSUER>": "system:serviceaccount:<KUBE_NAMESPACE>:<SERVICE_ACCOUNT_NAME>"
        }
      }
    }
  ]
}

 

 

AWS IAM Authenticator 를 설치합니다.

 

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-iam-authenticator/master/dist/aws-iam-authenticator.yaml

 

 

Crossplane 이 사용할 Service Account 를 쿠버네티스에 생성하고 역할 바인딩을 합니다.

 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: crossplane-serviceaccount
  namespace: crossplane-system

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: crossplane-rolebinding
  namespace: crossplane-system
subjects:
- kind: ServiceAccount
  name: crossplane-serviceaccount
  namespace: crossplane-system
roleRef:
  kind: ClusterRole
  name: system:node-proxier // 또는 사용 권한이 필요한 ClusterRole
  apiGroup: rbac.authorization.k8s.io

 

 

이제 Crossplane 이 IAM 역할을 사용할 수 있도록 AWS ProviderConfig 를 설정합니다.

 

apiVersion: aws.crossplane.io/v1alpha3
kind: ProviderConfig
metadata:
  name: aws-providerconfig
spec:
  credentials:
    source: ProviderSecret
    providerSecretRef:
      namespace: crossplane-system
      name: aws-provider-secret

 

 

사용 예)

Crossplane을 사용하여 AWS RDS 인스턴스를 생성할 때, Crossplane은 해당 IAM Role을 통해 AWS 자원에 접근하게 됩니다. 

 

apiVersion: database.aws.crossplane.io/v1alpha1
kind: RDSInstance
metadata:
  name: example-db
spec:
  engine: mysql
  engineVersion: "5.7"
  instanceClass: db.t2.micro
  storageGB: 20
  multiAZ: false
  ... (기타 필요한 설정)

 

 

사용 명령어 예시

 

# get crossplane resources
kubectl get <crossplane-resource-type>
kubectl get rdsinstances.aws.crossplane.io
kubectl get rdsinstances.aws.crossplane.io -l app=example-app
kubectl get rdsinstances.aws.crossplane.io --field-selector=status.phase=Failed

# describe
kubectl describe <crossplane-resource-type> <resource-name>
kubectl describe rdsinstances.aws.crossplane.io example-db

# create resources
kubectl apply -f <yaml-file>

# delete resources
kubectl delete <crossplane-resource-type> <resource-name>
kubectl delete rdsinstances.aws.crossplane.io example-db

 

 

Official document to start Crossplane: https://docs.crossplane.io/latest/software/install/