Cloud/CNCF

EKS with CrossPlane

ISFJ 개발자의 이야기 2025. 10. 1. 09:48

이번 블로그에서는 CNCF 프로젝트 중 하나이며 쿠버네티스 클러스터에서 인프라, 서비스 및 애플리케이션을 직접 관리할 수 있도록 쿠버네티스를 확장하는 오픈소스 쿠버네티스 애드온인 Cross Plane을 EKS 상에서 구축하는 글을 작성해보려 합니다.

아키텍처는 아래와 같이 구성됩니다.

 

 

EKS 상에서 Cross Plane을 구성하기 위해서는 아래의 순서를 따라야 합니다.

 

1. EKS Cluster 구성

2. Helm을 이용해 Cross Plane 설치 및 구성

3. EKS IRSA 구성

4. Cross Plane을 이용해 DynamoDB Resource 구성

 

EKS Cluster가 생성되어있다는 전제로 진행합니다.

 

Helm을 이용해 Cross Plane 설치 및 구성

우선 Helm을 이용해서 Cross Plane을 설치해줘야합니다.

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

 

다음으로 Cross Plane CLI를 아래의 명령어를 이용해서 설치해줍니다.

curl -sL "https://raw.githubusercontent.com/crossplane/crossplane/main/install.sh" | sh

 

EKS IRSA 구성

우선 IRSA를 구성하기 위해서 아래의 환경변수를 설정해줍니다.

CLUSTER_NAME=<CLUSTER_NAME> # Change Your Cluster Name
ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)

 

다음으로 OIDC를 가져와 Trust Policy를 작성 후 Role을 생성해주겠습니다.

OIDC=$(aws eks describe-cluster --name $CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

 

cat << EOF > trust-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/$OIDC"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.ap-northeast-2.amazonaws.com/id/$OIDC:aud": "sts.amazonaws.com",
                    "oidc.eks.ap-northeast-2.amazonaws.com/id/$OIDC:sub": "system:serviceaccount:crossplane-system:provider-aws"
                }
            }
        }
    ]
}
EOF

 

aws iam create-role --role-name crossplane-provider-aws-role --assume-role-policy-document file://trust-policy.json

 

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess --role-name crossplane-provider-aws-role

 

다음으로 위에서 생성한 Role의 ARN을 아래의 코드의 입력 후 apply를 해주면 됩니다.

apiVersion: pkg.crossplane.io/v1beta1
kind: DeploymentRuntimeConfig
metadata:
  name: aws-config
spec:
  serviceAccountTemplate:
    metadata:
      name: provider-aws
      annotations:
        eks.amazonaws.com/role-arn: <CrossPlane_Role_ARN> # Change Here
  deploymentTemplate:
    spec:
      selector:
        matchLabels:
          app: provider-aws
      template:
        metadata:
          labels:
            app: provider-aws
        spec:
          securityContext:
            fsGroup: 2000
          containers:
            - name: package-runtime
              args:
                - --debug
                - --enable-management-policies

 

다음으로 아래의 Provider 코드를 apply 해줍니다.

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws
spec:
  package: xpkg.upbound.io/crossplane-contrib/provider-aws:v0.54.2
  runtimeConfigRef:
    name: aws-config

 

마지막으로 아래의 Provider Config 코드를 apply 해줍니다.

apiVersion: aws.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: aws-provider
spec:
  credentials:
    source: InjectedIdentity

 

Cross Plane을 이용해 DynamoDB Resource 구성

이제 Cross Plane을 이용해서 DynamoDB를 생성해보겠습니다.

  • 온디맨드 타입 
apiVersion: dynamodb.aws.crossplane.io/v1alpha1
kind: Table
metadata:
  name: demo-table
spec:
  forProvider:
    region: ap-northeast-2
    attributeDefinitions:
      - attributeName: id
        attributeType: S
      # - attributeName: timestamp
      #   attributeType: S
    keySchema:
      - attributeName: id
        keyType: HASH
      # - attributeName: timestamp
      #   keyType: RANGE
    # Note that due to a quirk of the DynamoDB API if you change billing mode
    # from PROVISIONED to PAY_PER_REQUEST you must also set readCapacityUnits
    # and writeCapacityUnits to 0.
    billingMode: PAY_PER_REQUEST
    # streamSpecification:
    #   streamEnabled: true
    #   streamViewType: NEW_AND_OLD_IMAGES
  providerConfigRef:
    name: aws-provider

 

  • 프로비저닝 타입
apiVersion: dynamodb.aws.crossplane.io/v1alpha1
kind: Table
metadata:
  name: demo-table
spec:
  forProvider:
    region: ap-northeast-2
    attributeDefinitions:
      - attributeName: id
        attributeType: S
      # - attributeName: timestamp
      #   attributeType: S
    keySchema:
      - attributeName: id
        keyType: HASH
      # - attributeName: timestamp
      #   keyType: RANGE
    # Note that due to a quirk of the DynamoDB API if you change billing mode
    # from PROVISIONED to PAY_PER_REQUEST you must also set readCapacityUnits
    # and writeCapacityUnits to 0.
    billingMode: PROVISIONED
    provisionedThroughput:
      readCapacityUnits: 1
      writeCapacityUnits: 1
    # streamSpecification:
    #   streamEnabled: true
    #   streamViewType: NEW_AND_OLD_IMAGES
  providerConfigRef:
    name: aws-provider

 

위에 코드를 apply 후 아래의 get table 명령어를 이용해 조회가 가능하며 AWS DynamoDB 콘솔에 가보면 테이블이 생성 된 모습을 확인 할 수 있습니다.

kubectl get table

 

이것으로 Cross Plane을 이용해 DynamoDB(리소스)를 구성하는 글을 마치겠습니다. 감사합니다!

 

참고

https://doc.crds.dev/github.com/crossplane/provider-aws@v0.54.2

 

crossplane/provider-aws@v0.54.2

Doc Toggle Dark Mode github.com/crossplane/provider-aws/tree/v0.54.2 v0.54.2 v0.54.1 v0.52.8 v0.52.7 v0.52.6 v0.52.5 v0.52.4 v0.52.3 v0.52.1 v0.52.0 v0.51.5 v0.51.4 v0.51.3 v0.51.1 v0.51.0 v0.50.5 v0.50.4 v0.50.3 v0.50.2 v0.50.0 v0.49.2 v0.49.1 v0.49.0 v0.

doc.crds.dev

https://github.com/crossplane-contrib/provider-aws/tree/master/examples

 

provider-aws/examples at master · crossplane-contrib/provider-aws

Crossplane AWS Provider. Contribute to crossplane-contrib/provider-aws development by creating an account on GitHub.

github.com