kro 概念 - Amazon EKS

協助改進此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

kro 概念

kro 可讓平台團隊建立自訂 Kubernetes APIs,將多個資源組成更高階的抽象概念。本主題會逐步解說實際範例,然後說明使用 kro 的 EKS 功能時需要了解的核心概念。

kro 入門

建立 kro 功能後 (請參閱 建立 kro 功能),您可以在叢集中使用 ResourceGraphDefinitions 開始建立自訂 APIs。

以下是建立簡單 Web 應用程式抽象化的完整範例:

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 建立 Web 應用程式:

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 概觀

SimpleSchema 格式

SimpleSchema 提供簡單的方式來定義 API 結構描述,而不需要 OpenAPI 知識:

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 integer支援 stringboolean、 和 number類型,具有 required、、defaultminimum/maximumenum和 等限制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 表達式

資源相依性

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 文件中的圖形推論

使用 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 資源、擷取其詳細資訊 (ARNs、URLs、端點),並將它們插入您的應用程式組態,全都以單一單位管理。

如需更多合成模式和進階範例,請參閱 EKS 的 kro 考量

後續步驟

  • EKS 的 kro 考量 - 了解 EKS 特定的模式、RBAC 以及與 ACK 和 Argo CD 的整合

  • kro 文件 - 完整的 kro 文件,包括進階 CEL 表達式、驗證模式和故障診斷