

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# kro 개념
<a name="kro-concepts"></a>

kro를 사용하면 플랫폼 팀이 여러 리소스를 상위 수준 추상화로 구성하는 사용자 지정 Kubernetes API를 생성할 수 있습니다. 이 주제에서는 실제 예제를 살펴본 다음 kro의 EKS 기능을 사용할 때 알아야 하는 핵심 개념을 설명합니다.

## kro 시작하기
<a name="_getting_started_with_kro"></a>

kro 기능을 생성한 후([kro 기능 생성](create-kro-capability.md) 참조) 클러스터에서 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`를 사용합니다.

## 핵심 개념
<a name="_core_concepts"></a>

**중요**  
kro는 런타임이 아닌 생성 시 ResourceGraphDefinitions를 검증합니다. RGD를 생성할 때 kro는 CEL 구문을 검증하고 실제 Kubernetes 스키마를 기준으로 표현식의 유형을 확인하며 필드 존재를 확인하고 순환 종속성을 감지합니다. 즉, 인스턴스를 배포하기 전에 RGD를 생성할 때 오류가 즉시 발견됩니다.

### ResourceGraphDefinition
<a name="_resourcegraphdefinition"></a>

ResourceGraphDefinition(RGD)은 다음을 지정하여 사용자 지정 Kubernetes API를 정의합니다.
+  **스키마** - SimpleSchema 형식(필드 이름, 유형, 기본값, 검증)을 사용하는 API 구조
+  **리소스** - 생성할 기본 Kubernetes 또는 AWS 리소스의 템플릿
+  **종속성** - 리소스가 서로 연관되는 방식(필드 참조에서 자동으로 감지됨)

RGD를 적용하면 kro가 클러스터에서 새 사용자 지정 리소스 정의(CRD)를 등록합니다. 그런 다음 애플리케이션 팀은 사용자 지정 API의 인스턴스를 생성할 수 있으며, kro는 모든 기본 리소스의 생성 및 관리를 처리합니다.

자세한 내용은 kro 설명서의 [ResourceGraphDefinition Overview](https://kro.run/docs/concepts/rgd/overview/)를 참조하세요.

### SimpleSchema 형식
<a name="_simpleschema_format"></a>

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](https://kro.run/docs/concepts/rgd/schema/)를 참조하세요.

### CEL 표현식
<a name="_cel_expressions"></a>

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](https://kro.run/docs/concepts/rgd/cel-expressions/)를 참조하세요.

### 리소스 종속성
<a name="_resource_dependencies"></a>

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](https://kro.run/docs/concepts/rgd/dependencies-ordering/)를 참조하세요.

## ACK를 사용하여 구성
<a name="_composing_with_ack"></a>

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 고려 사항](kro-considerations.md) 섹션을 참조하세요.

## 다음 단계
<a name="_next_steps"></a>
+  [EKS에 대한 kro 고려 사항](kro-considerations.md) - EKS 특정 패턴, RBAC, ACK 및 Argo CD와의 통합에 대해 알아보기
+  [kro 설명서](https://kro.run/docs/overview) - 고급 CEL 표현식, 검증 패턴 및 문제 해결을 포함한 포괄적인 kro 설명서