關於機群套件

本頁面說明車隊套件、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。

架構

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

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

應用實例

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

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

部署至機群中的所有叢集

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

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

部署至叢集子集

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

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    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

將變體資源部署至叢集

以這個範例來說,您的 Git 存放區有名為「deployments」的資料夾,其中包含兩個不同的部署規格:

副本:3

    # small.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

副本:10

    # large.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

您可以透過變體,將「小型」或「大型」部署作業部署至不同叢集。每個叢集都有 nginx-size=smallnginx-size=large 標籤。

本例中的 FleetPackage 會類似於下列內容:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
    path: deployments
    variantsPattern: "*.yaml"
rolloutStrategy:
  rolling:
    maxConcurrent: 2
target:
  fleet:
    project: projects/my-project
variantSelector:
  variantNameTemplate: ${membership.labels['nginx-size']}

後續步驟

部署機群套件