關於機群套件

本頁面說明車隊套件、FleetPackage API,以及這些項目與 Config Sync 的關係。

FleetPackage 是一種宣告式 API,可讓您管理整個機群的套件。艦隊套件是一組 Kubernetes YAML 資訊清單,用於定義叢集設定。使用機群套件時,您可以透過一次性或漸進式推出作業,將套件部署至已向機群註冊的叢集。

您只需定義每個 FleetPackage 物件一次,之後就能使用新修訂版本更新該套件。套用新修訂版本後,機群套件服務會擷取這些變更,並將其部署至叢集。

優點

使用機群套件,在已註冊至機群的叢集中部署 Kubernetes 資源。建立並套用機群套件後,機群套件會自動將 Git 存放區中的 Kubernetes 設定檔部署到新叢集。機群套件以 Config Sync 的優點為基礎 (例如自動修正漂移),並提供下列獨特優勢:

  • 自動推出資源:設定機群套件後,機群套件服務會自動在所有叢集上,部署機群套件指向的 Kubernetes 資源。

  • 自動設定新叢集:如果您設定機群套件,然後將新叢集新增至機群,系統會自動將機群套件定義的所有資源部署至新叢集。

  • 大規模管理 Kubernetes 設定:不必逐一管理叢集,而是使用機群套件,將資源部署至整個叢集機群。

  • 盡量減少錯誤變更造成的影響:一次部署資源的叢集數量上限。您可以密切監控每個叢集的變更,確保錯誤的變更不會影響整個機群。

  • 簡化 Config Sync 設定:機群套件會使用 Cloud Build 向 Git 進行驗證,也就是說,您只需為每個專案驗證一次,不必為每個 RootSyncRepoSync 物件驗證一次。

如果符合下列一或多個情境,您可能會偏好使用 Config Sync 和 RootSyncRepoSync 物件,而非機群套件:

  • 您管理少數叢集。

  • 您需要進一步控管資源部署至叢集的方式,而不只是透過 Fleet 套件 API 提供的標籤和變體。

需求條件和限制

  • 設定車隊套件時,只有 Git 存放區支援做為單一可靠資料來源

  • 儲存在 Git 中的 Kubernetes 資源必須代表資源的最終狀態。系統不支援用來轉換 Git 中所儲存資源的其他疊加層。如要進一步瞭解這些資源的差異,請參閱「最佳做法:建立 WET 存放區」。

  • FleetPackage API 僅適用於 us-central1 區域。您仍可部署至不同區域的叢集,但必須在 us-central1 中設定 Cloud Build 並設定 gcloud CLI。

  • 每個專案在每個區域最多可有 300 個車隊套件。

架構

您可以使用 FleetPackage API,將 Kubernetes 資訊清單部署至叢集機群。FleetPackage API 會使用 Cloud Build,從 Git 存放區同步及擷取 Kubernetes 資源。機群套件服務隨後會將這些資源部署至叢集。

圖表:顯示 Git 同步處理中 Kubernetes 資源的流程,可同步處理至叢集機群

變化版本生成方式

機群套件會使用變體系統,從同一個 Git 存放區,將不同的 Kubernetes 資源設定部署至機群中的不同叢集或叢集群組。

FleetPackage 規格中有兩個欄位可控制變體的行為:

  1. resourceBundleSelector.cloudBuildRepository.variantsPattern:用於在 Git 存放區中尋找檔案和目錄的 glob 模式 (位於指定 path 下方,如果省略 path,則位於存放區根目錄)。這個模式會決定哪些檔案或目錄會成為變體,以及變體包含的內容。
  2. variantSelector.variantNameTemplate:運算式,可將車隊中的每個叢集對應至 variantsPattern 產生的其中一個變體名稱。這項選取作業是根據叢集的機群成員資格中繼資料進行。

variantsPattern 比對

variantsPattern 欄位為必填,用於指定如何從存放區中儲存的設定產生變體。系統會使用下列邏輯進行比對:

  • 檔案相符:如果模式與 YAML 檔案相符,系統就會建立變體。

    • 變化版本名稱:不含副檔名的檔案名稱 (例如,prod-config.yaml 會變成變化版本 prod-config)。
    • 變體內容:這個單一檔案的內容。
  • 目錄相符:如果模式與目錄相符,系統就會建立變體。

    • 變數名稱:目錄名稱 (例如,目錄 dev 會變成變數 dev)。
    • 變體內容:這個目錄及其所有子目錄中找到的所有 YAML 檔案組合 (遞迴)。

檔案比對模式有下列限制:

  • 不支援遞迴 (雙) 萬用字元。系統不支援 ** 模式。
  • 如果模式包含點 (.) 字元,後面必須接英數字元。
  • 模式不得包含單引號 (')。
  • 變化版本名稱不得重複。如果模式與多個同名檔案相符 (例如 app1/deploy.yamlapp2/deploy.yaml),兩者都會嘗試建立名為 deploy 的變體,導致名稱衝突。

舉例來說,假設存放區的結構如下:

repo-root/
└── FleetPackages/
    └── clusters/
        ├── common-ingress.yaml
        ├── us-central1-a/
        │   ├── gke-1/
        │   │   ├── deployment.yaml
        │   │   └── service.yaml
        │   └── gke-2/
        │       ├── deployment.yaml
        │       └── service.yaml
        └── us-central1-b/
            ├── gke-1.yaml
            └── blue-green.yaml

視您在機群套件規格中定義的檔案或目錄比對類型而定,您可以比對不同檔案,並因此同步至叢集,例如:

  • variantsPattern: "*":符合 common-ingress.yamlus-central1-aus-central1-b。生成變化版本:

    • common-ingress (來自檔案)
    • us-central1-a (合併該資料夾中的所有 YAML 檔案)
    • us-central1-b (合併該資料夾中的所有 YAML)
  • variantsPattern: "*.yaml":相符項目 common-ingress.yaml。生成變體:

    • common-ingress
  • variantsPattern: "us-*":比對 us-central1-aus-central1-b。 生成變化版本:

    • us-central1-a
    • us-central1-b
  • variantsPattern: "us-central1-b/*.yaml":比對 us-central1-b/gke-1.yamlus-central1-b/blue-green.yaml。生成變體:

    • gke-1
    • blue-green

variantNameTemplate 比對

定義變化版本後,variantSelector 部分的 variantNameTemplate 欄位會決定要將哪個變化版本套用至每個叢集。範本可以使用變數存取下列車隊成員中繼資料:

  • ${membership.name}:叢集的 Fleet 成員名稱。
  • ${membership.location}:車隊會員位置。
  • ${membership.project}:車隊成員專案。
  • ${membership.labels['KEY']}:車隊成員的標籤 KEY 值。

舉例來說,請參考下列情境,瞭解如何使用標籤比對變體:

  • variantNameTemplate: "${membership.labels['env']}":標籤為 env: prod 的叢集會同步至名為 prod 的變體。
  • variantNameTemplate: "${membership.location}":叢集會同步至與其位置相符的變體 (例如 us-central1-a)。
  • variantNameTemplate: "default":叢集會同步至名為 default 的變體。如果省略 variantSelector,系統會預設採用這項行為。如果存放區不含名為 default.yaml 的檔案或名為 default 的目錄,系統就不會同步任何內容。

合併 variantsPatternvariantNameTemplate

如要順利部署,請務必確保 variantsPattern 產生的變體名稱是叢集可透過比對 variantNameTemplate 同步處理的名稱。

舉例來說,如要根據環境標籤部署至叢集,您可以透過 devstagingprod 等目錄建構 Git 存放區。然後使用下列機群套件規格:

resourceBundleSelector:
  cloudBuildRepository:
    # ... other fields
    path: "manifests"
    variantsPattern: "*" # Matches dev, staging, prod directories
variantSelector:
  variantNameTemplate: "${membership.labels['env']}"

設定完成後,標示為 env: staging 的叢集就會收到 manifests/staging/ 目錄的內容。

部署策略

您可以使用機群套件,將 Git 存放區中的資源部署至整個叢集機群。您也可以設定機群套件,控管部署資源的方式、位置和類型。

以下章節將列出不同 FleetPackage 設定的範例。如要進一步瞭解如何套用車隊套件,請參閱「部署車隊套件」。

部署至機群中的所有叢集

下列 FleetPackage 使用輪流策略,一次將 Kubernetes 資源部署至三個叢集,並以機群中的所有叢集為目標:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    variantsPattern: "*.yaml"
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
rolloutStrategy:
  rolling:
    maxConcurrent: 3
variantSelector:
  variantNameTemplate: deployment # matches a file named deployment.yaml

部署至叢集子集

下列 FleetPackage 使用標籤選取器,只將 Kubernetes 資源部署至成員標籤 country 與機群中 "us" 相符的叢集:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    variantsPattern: "*.yaml"
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
    selector:
      matchLabels:
        country: "us"
rolloutStrategy:
  rolling:
    maxConcurrent: 3

後續步驟

部署機群套件