이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.
kro 개념
kro를 사용하면 플랫폼 팀이 여러 리소스를 상위 수준 추상화로 구성하는 사용자 지정 Kubernetes API를 생성할 수 있습니다. 이 주제에서는 실제 예제를 살펴본 다음 kro의 EKS 기능을 사용할 때 알아야 하는 핵심 개념을 설명합니다.
kro 시작하기
kro 기능을 생성한 후(kro 기능 생성 참조) 클러스터에서 ResourceGraphDefinitions를 사용하여 사용자 지정 API 생성을 시작할 수 있습니다.
다음은 간단한 웹 애플리케이션 추상화를 생성하는 전체 예제입니다.
apiVersion: kro.run/v1alpha1 kind: ResourceGraphDefinition metadata: name: webapplication spec: schema: apiVersion: v1alpha1 kind: WebApplication group: kro.run spec: name: string | required=true image: string | default="nginx:latest" replicas: integer | default=3 resources: - id: deployment template: apiVersion: apps/v1 kind: Deployment metadata: name: ${schema.spec.name} spec: replicas: ${schema.spec.replicas} selector: matchLabels: app: ${schema.spec.name} template: metadata: labels: app: ${schema.spec.name} spec: containers: - name: app image: ${schema.spec.image} ports: - containerPort: 80 - id: service template: apiVersion: v1 kind: Service metadata: name: ${schema.spec.name} spec: selector: app: ${schema.spec.name} ports: - protocol: TCP port: 80 targetPort: 80
이 ResourceGraphDefinition을 적용한 후 애플리케이션 팀은 단순화된 API를 사용하여 웹 애플리케이션을 생성할 수 있습니다.
apiVersion: kro.run/v1alpha1 kind: WebApplication metadata: name: my-app spec: name: my-app replicas: 5
kro는 적절한 구성으로 배포 및 서비스를 자동으로 생성합니다. image는 지정되지 않았으므로 스키마의 기본값 nginx:latest를 사용합니다.
핵심 개념
중요
kro는 런타임이 아닌 생성 시 ResourceGraphDefinitions를 검증합니다. RGD를 생성할 때 kro는 CEL 구문을 검증하고 실제 Kubernetes 스키마를 기준으로 표현식의 유형을 확인하며 필드 존재를 확인하고 순환 종속성을 감지합니다. 즉, 인스턴스를 배포하기 전에 RGD를 생성할 때 오류가 즉시 발견됩니다.
ResourceGraphDefinition
ResourceGraphDefinition(RGD)은 다음을 지정하여 사용자 지정 Kubernetes API를 정의합니다.
-
스키마 - SimpleSchema 형식(필드 이름, 유형, 기본값, 검증)을 사용하는 API 구조
-
리소스 - 생성할 기본 Kubernetes 또는 AWS 리소스의 템플릿
-
종속성 - 리소스가 서로 연관되는 방식(필드 참조에서 자동으로 감지됨)
RGD를 적용하면 kro가 클러스터에서 새 사용자 지정 리소스 정의(CRD)를 등록합니다. 그런 다음 애플리케이션 팀은 사용자 지정 API의 인스턴스를 생성할 수 있으며, kro는 모든 기본 리소스의 생성 및 관리를 처리합니다.
자세한 내용은 kro 설명서의 ResourceGraphDefinition Overview
SimpleSchema 형식
SimpleSchema는 OpenAPI 지식 없이도 API 스키마를 정의하는 단순화된 방법을 제공합니다.
schema: apiVersion: v1alpha1 kind: Database spec: name: string | required=true description="Database name" size: string | default="small" enum=small,medium,large replicas: integer | default=1 minimum=1 maximum=5
SimpleSchema는 string, integer, boolean, number 유형(required, default, minimum/maximum, enum, pattern과 같은 제약 조건이 적용됨)을 지원합니다.
자세한 내용은 kro 설명서의 SimpleSchema
CEL 표현식
kro는 공통 표현식 언어(CEL)를 사용하여 값을 동적으로 참조하고 조건부 로직을 추가합니다. CEL 표현식은 ${ 및 }로 래핑되며, 다음과 같은 두 가지 방법으로 사용할 수 있습니다.
독립 실행형 표현식 - 전체 필드 값은 단일 표현식입니다.
spec: replicas: ${schema.spec.replicaCount} # Expression returns integer labels: ${schema.spec.labelMap} # Expression returns object
표현식 결과는 전체 필드 값을 대체하며 필드의 예상 유형과 일치해야 합니다.
문자열 템플릿 - 문자열에 포함된 하나 이상의 표현식입니다.
metadata: name: "${schema.spec.prefix}-${schema.spec.name}" # Multiple expressions annotation: "Created by ${schema.spec.owner}" # Single expression in string
문자열 템플릿의 모든 표현식은 문자열을 반환해야 합니다. string()을 사용하여 다른 유형("replicas-${string(schema.spec.count)}")으로 변환합니다.
필드 참조 - schema.spec을 사용하여 인스턴스 사양 값에 액세스합니다.
template: metadata: name: ${schema.spec.name}-deployment namespace: ${schema.metadata.namespace} # Can also reference metadata spec: replicas: ${schema.spec.replicas}
선택적 필드 액세스 - 존재하지 않을 수 있는 필드에 ?를 사용합니다.
# For ConfigMaps or Secrets with unknown structure value: ${configmap.data.?DATABASE_URL} # For optional status fields ready: ${deployment.status.?readyReplicas > 0}
필드가 없는 경우 표현식은 실패 대신 null을 반환합니다.
조건부 리소스 - 조건이 충족되는 경우에만 리소스를 포함합니다.
resources: - id: ingress includeWhen: - ${schema.spec.enableIngress == true} template: # ... ingress configuration
includeWhen 필드는 부울 표현식 목록을 허용합니다. 리소스를 생성하려면 모든 조건이 true여야 합니다. 현재 includeWhen에서는 schema.spec 필드만 참조할 수 있습니다.
변환 - 삼항 연산자 및 함수를 사용하여 값을 변환합니다.
template: spec: resources: requests: memory: ${schema.spec.size == "small" ? "512Mi" : "2Gi"} # String concatenation image: ${schema.spec.registry + "/" + schema.spec.imageName} # Type conversion port: ${string(schema.spec.portNumber)}
교차 리소스 참조 - 다른 리소스의 값을 참조합니다.
resources: - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-data - id: configmap template: apiVersion: v1 kind: ConfigMap data: BUCKET_NAME: ${bucket.spec.name} BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}
CEL 표현식에서 다른 리소스를 참조하면 종속성이 자동으로 생성됩니다. kro는 참조된 리소스가 먼저 생성되도록 보장합니다.
자세한 내용은 kro 설명서의 CEL Expressions
리소스 종속성
kro는 CEL 표현식에서 종속성을 자동으로 유추하므로, 사용자는 순서를 지정하지 않고 관계를 설명하면 됩니다. 한 리소스가 CEL 표현식을 사용하여 다른 리소스를 참조하면 kro는 종속성을 생성하고 올바른 생성 순서를 결정합니다.
resources: - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-data - id: notification template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: BucketNotification spec: bucket: ${bucket.spec.name} # Creates dependency: notification depends on bucket
${bucket.spec.name} 표현식은 종속성을 생성합니다. kro는 모든 리소스와 해당 종속성에 대한 방향성 비순환 그래프(DAG)를 빌드한 다음, 생성 시 토폴로지 순서를 계산합니다.
생성 순서: 리소스는 토폴로지 순서(종속성 먼저)로 생성됩니다.
병렬 생성: 종속성이 없는 리소스는 동시에 생성됩니다.
삭제 순서: 리소스는 토폴로지의 반대 순서(종속 항목 먼저)로 삭제됩니다.
순환 종속성: 허용되지 않습니다. kro는 검증 중에 순환 종속성이 있는 ResourceGraphDefinitions를 거부합니다.
계산된 생성 순서를 볼 수 있습니다.
kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'
자세한 내용은 kro 설명서의 Graph inference
ACK를 사용하여 구성
kro는 ACK의 EKS 기능과 원활하게 작업하여 Kubernetes 리소스로 AWS 리소스를 구성합니다.
resources: # Create {aws} S3 bucket with ACK - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-files # Inject bucket details into Kubernetes ConfigMap - id: config template: apiVersion: v1 kind: ConfigMap data: BUCKET_NAME: ${bucket.spec.name} BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn} # Use ConfigMap in application deployment - id: deployment template: apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: app envFrom: - configMapRef: name: ${config.metadata.name}
이 패턴을 사용하면 AWS 리소스를 생성하고 세부 정보(ARN, URL, 엔드포인트)를 추출한 후 애플리케이션 구성에 주입할 수 있습니다. 이때 모두 단일 단위로 관리됩니다.
자세한 구성 패턴 및 고급 예제는 EKS에 대한 kro 고려 사항 섹션을 참조하세요.
다음 단계
-
EKS에 대한 kro 고려 사항 - EKS 특정 패턴, RBAC, ACK 및 Argo CD와의 통합에 대해 알아보기
-
kro 설명서
- 고급 CEL 표현식, 검증 패턴 및 문제 해결을 포함한 포괄적인 kro 설명서