在 Kubernetes 環境中佈署應用程式時,基礎設施的準備往往耗時費力。利用 Crossplane Compositions,我們可以將複雜的基礎設施定義轉換為簡潔的 YAML 檔案,實作基礎設施即程式碼,並透過 GitOps 進行版本控制和自動化佈署。這不僅提升了效率,也減少了人為錯誤的風險。

Crossplane Compositions 的核心概念是將基礎設施抽象成可重複使用的模組。透過定義 ClusterClaim、SQLClaim 和 AppClaim 等資源,我們可以宣告所需的 Kubernetes 叢集、資料函式庫和應用程式,並讓 Crossplane 負責協調這些資源的建立和組態。這讓我們可以專注於應用程式開發,而不必糾結於底層基礎設施的細節。舉例來說,一個簡單的 YAML 檔案即可描述一個包含 Kubernetes 叢集、PostgreSQL 資料函式庫和後端應用程式的完整環境。透過引數化的設定,我們可以輕鬆調整叢集規模、資料函式庫版本等設定,而無需修改大量的組態檔案。此外,將這些 YAML 檔案儲存在 Git 儲存函式庫中,可以利用 GitOps 工具,例如 Argo CD,實作自動化的資源組態和版本控制。當 YAML 檔案發生變更時,Argo CD 會自動將變更應用到 Kubernetes 叢集,確保基礎設施與程式碼保持同步。

使用 Crossplane Compositions 快速開發生產級 Kubernetes 環境

在雲原生應用開發中,快速與一致地佈署基礎設施至關重要。傳統方式需要大量手動組態,耗時與容易出錯。身為一個在雲端基礎建設打滾多年的老手,我發現 Crossplane Compositions 提供了一個優雅的解決方案,能讓我們用更簡潔的方式定義和佈署複雜的雲端資源。

告別繁瑣:使用 YAML 宣告所需資源

Crossplane Compositions 的核心概念是使用 YAML 檔案來宣告我們需要的雲端資源。這些 YAML 檔案描述了叢集、資料函式庫、應用程式等資源的所需狀態。Crossplane 會自動協調這些資源的建立和組態,讓我們從繁瑣的手動操作中解放出來。

以下是一個範例,展示如何使用 Crossplane Compositions 佈署一個 Kubernetes 叢集、PostgreSQL 資料函式庫和一個後端應用程式:

# 建立 Kubernetes 叢集
apiVersion: devopstoolkitseries.com/v1alpha1
kind: ClusterClaim
metadata:
  name: cluster-01
spec:
  id: cluster-01
  compositionSelector:
    matchLabels:
      provider: aws-official
      cluster: eks
  parameters:
    nodeSize: small
    minNodeCount: 3
---
# 儲存資料函式庫密碼
apiVersion: v1
kind: Secret
metadata:
  name: silly-demo-db-password
data:
  password: cG9zdGdyZXM=
---
# 建立 PostgreSQL 資料函式庫
apiVersion: devopstoolkitseries.com/v1alpha1
kind: SQLClaim
metadata:
  name: silly-demo-db
spec:
  id: silly-demo-db
  compositionSelector:
    matchLabels:
      provider: aws-official
      db: postgresql
  parameters:
    version: "13"
    size: small
---
# 佈署後端應用程式
apiVersion: devopstoolkitseries.com/v1alpha1
kind: AppClaim
metadata:
  name: silly-demo
spec:
  id: silly-demo
  compositionSelector:
    matchLabels:
      type: backend-db
      location: remote
  parameters:
    namespace: production
    image: c8n.io/vfarcic/silly-demo:1.4.52
    port: 8080
    host: silly-demo.acme.com
    dbSecret:
      name: silly-demo-db
      namespace: a-team
    kubernetesProviderConfigName: cluster-01

內容解密

  • ClusterClaim: 此段 YAML 定義了一個 Kubernetes 叢集,指定了叢集供應商 (AWS)、叢集型別 (EKS)、節點大小 (small) 和最小節點數量 (3)。Crossplane 會根據這些引數自動建立和組態叢集。
  • Secret: 此段 YAML 建立一個 Kubernetes Secret,用於儲存資料函式庫密碼。在實際生產環境中,建議使用更安全的密碼管理方案,例如 HashiCorp Vault。
  • SQLClaim: 此段 YAML 定義了一個 PostgreSQL 資料函式庫,指定了資料函式庫供應商 (AWS)、資料函式庫型別 (PostgreSQL)、版本 (13) 和大小 (small)。Crossplane 會自動建立資料函式庫伺服器,並在其中建立新的使用者和資料函式庫。
  • AppClaim: 此段 YAML 定義了一個後端應用程式,指定了應用程式的佈署位置 (remote)、名稱空間 (production)、映象 (c8n.io/vfarcic/silly-demo:1.4.52)、連線埠 (8080)、主機 (silly-demo.acme.com) 和資料函式庫密碼 Secret。Crossplane 會自動將應用程式佈署到指定的叢集,並將其連線到資料函式庫。

一鍵佈署:透過 GitOps 自動化資源組態

上述 YAML 檔案定義了我們所需的雲端資源。接下來,我們可以將這些檔案提交到 Git 儲存函式庫,並使用 GitOps 工具(例如 Argo CD)來自動化資源組態。

以下是一些範例指令,展示如何將 YAML 檔案提交到 Git 儲存函式庫:

cp examples/$HYPERSCALER-intro.yaml a-team/intro.yaml
git add .
git commit -m "Intro"
git push

Argo CD 會監控 Git 儲存函式庫中的變更,並自動將變更應用到 Kubernetes 叢集。這意味著,當我們更新 YAML 檔案時,Argo CD 會自動更新雲端資源,確保它們與 Git 儲存函式庫中的定義保持一致。

深入觀察:Crossplane 如何協調資源

當 Argo CD 將 YAML 檔案應用到 Kubernetes 叢集時,Crossplane 會開始協調資源的建立和組態。Crossplane 會根據 YAML 檔案中的定義,自動建立 Kubernetes 叢集、PostgreSQL 資料函式庫和後端應用程式。

我們可以透過 kubectl 指令來觀察 Crossplane 的協調過程:

kubectl --namespace a-team get clusterclaims,sqlclaims,appclaims

此指令會顯示 ClusterClaimSQLClaimAppClaim 等資源的狀態。一開始,這些資源的 READY 欄位可能為 False,表示資源尚未完全建立和組態。隨著 Crossplane 的協調,這些資源的 READY 欄位最終會變為 True,表示資源已準備就緒。

玄貓觀點:擁抱雲原生,加速創新

Crossplane Compositions 提供了一個強大的工具,能讓我們以更簡潔、更一致的方式定義和佈署雲端資源。透過將基礎設施即程式碼 (Infrastructure as Code) 和 GitOps 相結合,我們可以實作雲端資源的自動化組態,加速應用程式的開發和佈署。

從玄貓的角度來看,Crossplane Compositions 代表了雲原生技術的發展方向。它讓我們能夠更專注於應用程式的開發,而無需花費大量時間和精力在基礎設施的組態上。這將有助於我們加速創新,並在競爭激烈的市場中保持領先地位。

## Crossplane 資源追蹤:深入解析叢集、資料函式庫與應用程式佈署狀態

在雲原生環境中,Crossplane 提供了一種獨特的方式來管理基礎架構即程式碼。透過 kubectl,我們可以觀察 Crossplane 管理的眾多資源。

kubectl get managed

執行上述指令後,會看到類別似以下的輸出(為了簡潔起見,已截斷):

NAME                                                     READY   SYNCED   EXTERNAL-NAME   AGE
internetgateway.../cluster-01                           False   True     18s
internetgateway.../silly-demo-db                        False   True     18s

NAME                                                     READY   SYNCED   EXTERNAL-NAME   AGE
mainroutetableassociation.../cluster-01                  False   True     18s
mainroutetableassociation.../silly-demo-db               False   True     18s

NAME                                                     READY   SYNCED   EXTERNAL-NAME   AGE
route.../cluster-01                                     False   18s
route.../silly-demo-db                                  False   18s

NAME                                                     READY   SYNCED   EXTERNAL-NAME   AGE
routetableassociation.../cluster-01-1a                   False   18s
routetableassociation.../cluster-01-1b                   False   18s
routetableassociation.../cluster-01-1c                   False   18s
routetableassociation.../silly-demo-db-1a                False   18s
routetableassociation.../silly-demo-db-1b                False   18s
routetableassociation.../silly-demo-db-1c                False   18s

NAME                                                     READY   SYNCED   EXTERNAL-NAME   AGE
routetable.../cluster-01                                False   True     18s
routetable.../silly-demo-db                             False   True     18s
...

這個輸出展示了由 Crossplane 管理的 AWS 資源,像是 Internet Gateways、路由表關聯、主要路由表關聯、路由、安全組規則、安全組、子網路、VPC,以及像是叢集認證、叢集、節點組、角色策略附加、角色、RDS 例項和子網路群組等資源。如果是使用 Google Cloud 或 Azure,看到的資源型別會有所不同。

儘管 YAML 檔案可能只有短短幾十行,但它們實際上定義並管理了大量的雲端資源。

使用 Crossplane CLI 追蹤資源狀態

Crossplane CLI 提供了一個更方便的方式來探索由 Crossplane 管理的資源。trace 指令(目前為 Beta 版本)可以視覺化資源之間的依賴關係和狀態。

crossplane beta trace clusterclaim cluster-01 --namespace a-team

內容解密:

  • crossplane beta trace:使用 Crossplane CLI 的追蹤功能(Beta 版)。
  • clusterclaim cluster-01:指定要追蹤的 ClusterClaim 資源,名稱為 cluster-01。
  • --namespace a-team:指定資源所在的名稱空間。

執行後,會看到類別似以下的樹狀結構輸出:

NAME                                  SYNCED   READY   STATUS
ClusterClaim/cluster-01 (a-team)      True     False   Waiting: ...
└─ CompositeCluster/cluster-01-lkm96   True     False   Creating...
  ├─ InternetGateway/cluster-01        True     True    Available
  ├─ MainRouteTableAssociation/cluster-01 True     True    Available
  ├─ RouteTableAssociation/cluster-01-1a  True     False   Creating
  ├─ RouteTableAssociation/cluster-01-1b  False    -       ReconcileError...
  ├─ RouteTableAssociation/cluster-01-1c  True     False   Creating
  ├─ RouteTable/cluster-01             True     True    Available
  ├─ Route/cluster-01                  False    -       ReconcileError...
  ...

這個輸出顯示了由 ClusterClaim 資源管理的所有資源的樹狀結構。可以看到 ClusterClaim 建立了 CompositeCluster 複合資源,而 CompositeCluster 又建立了一系列的受管資源。

玄貓提醒: 資源的 SYNCEDREADY 狀態非常重要。Crossplane 管理的資源是最終一致的,有些資源可能因為缺少資訊或前置條件未滿足而無法同步或就緒。

追蹤 SQLClaim 和 AppClaim 的狀態

類別似地,我們可以追蹤 SQLClaimAppClaim 資源的狀態。

crossplane beta trace sqlclaim silly-demo-db --namespace a-team

內容解密:

  • crossplane beta trace:使用 Crossplane CLI 的追蹤功能(Beta 版)。
  • sqlclaim silly-demo-db:指定要追蹤的 SQLClaim 資源,名稱為 silly-demo-db。
  • --namespace a-team:指定資源所在的名稱空間。

輸出範例:

NAME                                  SYNCED   READY   STATUS
SQLClaim/silly-demo-db (a-team)         True     False   Waiting:...
└─ SQL/silly-demo-db-lp9xm            True     False   Creating...
  ├─ VPC/silly-demo-db                True     True    Available
  ├─ Subnet/silly-demo-db-a             True     False   Creating
  ├─ Subnet/silly-demo-db-b             True     True    Available
  ├─ Subnet/silly-demo-db-c             True     False   Creating
  ├─ SubnetGroup/silly-demo-db          False    -       ReconcileError...
  ├─ InternetGateway/silly-demo-db      True     True    Available
  ├─ RouteTable/silly-demo-db           True     True    Available
  ├─ Route/silly-demo-db                False    -       ReconcileError...
  ├─ MainRouteTableAssociation/silly-demo-db False    -       ReconcileError...
  ├─ RouteTableAssociation/silly-demo-db-1a  False    -       ReconcileError...
  ├─ RouteTableAssociation/silly-demo-db-1b  False    -       ReconcileError...
  ├─ RouteTableAssociation/silly-demo-db-1c  False    -       ReconcileError...
  ├─ SecurityGroup/silly-demo-db          True     True    Available
  ├─ SecurityGroupRule/silly-demo-db      False    -       ReconcileError...
  ├─ Instance/silly-demo-db             False    -       ReconcileError...
  ├─ ProviderConfig/silly-demo-db         -        -
  ├─ Database/silly-demo-db             False    -       ReconcileError...
  └─ ProviderConfig/silly-demo-db-sql     -        -

同樣地,追蹤 AppClaim

crossplane beta trace appclaim silly-demo --namespace a-team

內容解密:

  • crossplane beta trace:使用 Crossplane CLI 的追蹤功能(Beta 版)。
  • appclaim silly-demo:指定要追蹤的 AppClaim 資源,名稱為 silly-demo。
  • --namespace a-team:指定資源所在的名稱空間。

輸出範例:

NAME                            SYNCED   READY   STATUS
AppClaim/silly-demo (a-team)    True     False   Waiting...
└─ App/silly-demo-9pfkj         True     False   Creating...
  ├─ Object/silly-demo-deployment False    -       ReconcileError...
  ├─ Object/silly-demo-service    False    -       ReconcileError...
  ├─ Object/silly-demo-ingress    False    -       ReconcileError...
  └─ Object/silly-demo-secret     False    -       ReconcileError...

由於應用程式需要在新的叢集上執行,因此在叢集建立完成之前,應用程式尚未執行是正常的。所有資源最終都會達到一致的狀態。

透過 Crossplane CLI 的 trace 指令,我們可以清楚地瞭解資源的佈署狀態和依賴關係,這對於除錯和監控雲原生應用程式非常有幫助。

Crossplane 實戰:追蹤資源、驗證應用程式與環境清理

在上一節中,我們簡要體驗了 Crossplane 的強大功能。現在,讓我們更深入地探索如何追蹤資源、驗證應用程式是否正常運作,並學習如何安全地清理環境。準備好一杯咖啡,讓我們開始吧!

追蹤 SQLClaim 的奧秘

首先,我們再次使用 crossplane beta trace 指令來追蹤 SQLClaim

crossplane beta trace sqlclaim silly-demo-db --namespace a-team

這次的輸出應該顯示所有執行 PostgreSQL 所需的資源都處於 Available 狀態。這表示我們的受管資料函式庫已經成功啟動並執行。

NAME                       SYNCED   READY   STATUS
SQLClaim/silly-demo-db (a-team)   True     True    Available
└─ SQL/silly-demo-db-lp9xm           True     True    Available
  ├─ VPC/silly-demo-db                 True     True    Available
  ├─ Subnet/silly-demo-db-a            True     True    Available
  ├─ Subnet/silly-demo-db-b            True     True    Available
  ├─ Subnet/silly-demo-db-c            True     True    Available
  ├─ SubnetGroup/silly-demo-db         True     True    Available
  ├─ InternetGateway/silly-demo-db     True     True    Available
  ├─ RouteTable/silly-demo-db            True     True    Available
  ├─ Route/silly-demo-db                   True     True    Available
  ├─ MainRouteTableAssociation/silly-demo-db   True     True    Available
  ├─ RouteTableAssociation/silly-demo-db-1a    True     True    Available
  ├─ RouteTableAssociation/silly-demo-db-1b    True     True    Available
  ├─ RouteTableAssociation/silly-demo-db-1c    True     True    Available
  ├─ SecurityGroup/silly-demo-db         True     True    Available
  ├─ SecurityGroupRule/silly-demo-db     True     True    Available
  ├─ Instance/silly-demo-db              True     True    Available
  ├─ ProviderConfig/silly-demo-db          -        -
  ├─ Database/silly-demo-db                True     True    Available
  ├─ ProviderConfig/silly-demo-db-sql      -        -
  └─ Object/silly-demo-db                  True     True    Available

深入 ClusterClaim 的世界

接下來,讓我們看看叢集的情況。使用以下指令追蹤 ClusterClaim

crossplane beta trace clusterclaim cluster-01 --namespace a-team

同樣地,輸出結果應該顯示執行叢集所需的所有資源都已啟動並執行。這意味著 Crossplane 應該能夠順利佈署與後端應用程式相關的資源。由於資料函式庫和叢集都已完全運作,應用程式也應該正常執行。

NAME                           SYNCED   READY   STATUS
ClusterClaim/cluster-01 (a-team)   True     True    Available
└─ CompositeCluster/cluster-01-lkm96   True     True    Available
  ├─ InternetGateway/cluster-01          True     True    Available
  ├─ MainRouteTableAssociation/cluster-01  True     True    Available
  ├─ RouteTableAssociation/cluster-01-1a   True     True    Available
  ├─ RouteTableAssociation/cluster-01-1b   True     True    Available
  ├─ RouteTableAssociation/cluster-01-1c   True     True    Available
  ├─ RouteTable/cluster-01                 True     True    Available
  ├─ Route/cluster-01                        True     True    Available
  ...

驗證 AppClaim 的狀態

為了確認應用程式是否真的在執行,我們可以追蹤 AppClaim

crossplane beta trace appclaim silly-demo --namespace a-team

如果一切順利,您會看到類別似以下的輸出:

NAME                     SYNCED   READY   STATUS
AppClaim/silly-demo (a-team)   True     True    Available
└─ App/silly-demo-9pfkj          True     True    Available
  ├─ Object/silly-demo-deployment  True     True    Available
  ├─ Object/silly-demo-service   True     True    Available
  ├─ Object/silly-demo-ingress   True     True    Available
  └─ Object/silly-demo-secret    True     True    Available

這表示我們最初定義的三個資源已經擴充套件成數十個其他資源,包括雲端供應商的資源和新的 Kubernetes 叢集中的資源。

最後確認:進入叢集一探究竟

為了確保一切都如預期般運作,玄貓建議進入新建立的叢集,確認後端應用程式是否真的在執行。首先,匯出 KUBECONFIG 變數:

export KUBECONFIG=$PWD/kubeconfig.yaml

然後,從您選擇的雲端供應商檢索 Kubeconfig。

  • Google Cloud:

    gcloud container clusters get-credentials cluster-01 \
    --region us-east1 --project $PROJECT_ID
    
  • AWS:

    aws eks update-kubeconfig --region us-east-1 \
    --name cluster-01 --kubeconfig $KUBECONFIG
    
  • Azure:

    az aks get-credentials --resource-group cluster-01 \
    --name cluster-01 --file $KUBECONFIG
    

玄貓提醒: 這些指令會根據您使用的雲端供應商而有所不同。

現在,我們可以檢查叢集是否真的有我們指定的節點數量:

kubectl get nodes

輸出應該類別似這樣:

NAME                       STATUS   ROLES    AGE   VERSION
ip-10-0-0-241.ec2.internal   Ready    <none>   30s   v1.27.7-eks-e71965b
ip-10-0-1-82.ec2.internal    Ready    <none>   26s   v1.27.7-eks-e71965b
ip-10-0-2-216.ec2.internal   Ready    <none>   32s   v1.27.7-eks-e71965b

確認節點存在後,讓我們檢查應用程式是否在 production 名稱空間中執行:

kubectl --namespace production get all,ingresses

如果一切正常,您會看到類別似以下的輸出:

NAME                             READY   STATUS    RESTARTS   AGE
pod/silly-demo-998c464fc-8j9jj   1/1     Running   0          17m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/silly-demo   ClusterIP   172.20.219.47    <none>        8080/TCP   17m

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/silly-demo   1/1     1            1           17m

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/silly-demo-998c464fc   1         1         1       17m

NAME                        CLASS    HOSTS                ADDRESS   PORTS   AGE
ingress.networking.k8s.io/silly-demo   <none>   silly-demo.acme.com             80      17m

這表示應用程式正在執行,並且已連線到 PostgreSQL 資料函式庫。

展望 Crossplane 的無限可能

以上只是 Crossplane 眾多功能的一瞥。它改變了我們管理各種資源的方式,使我們能夠建立控制平面,並實作過去只有少數公司才能做到的事情。

環境清理:永續發展的根本

每個章節都以建立資源的說明開始,並以銷毀資源的說明結束。這樣,您可以獨立探索每個部分,並在不產生額外費用的情況下休息。

為了保持環境整潔,以下是如何銷毀我們建立的所有內容:

unset KUBECONFIG

chmod +x destroy/00-intro.sh

./destroy/00-intro.sh

exit

玄貓總結: 本文展示了 Crossplane 如何追蹤資源、驗證應用程式狀態,以及安全地清理環境。希望這些實戰經驗能激發您對 Crossplane 的興趣,讓我們在下一節中繼續深入探索!