本頁面說明車隊套件、FleetPackage API,以及這些項目與 Config Sync 的關係。
FleetPackage 是一種宣告式 API,可讓您管理整個機群的套件。艦隊套件是一組 Kubernetes YAML 資訊清單,用於定義叢集設定。使用機群套件時,您可以透過一次性或漸進式推出作業,將套件部署至已向機群註冊的叢集。
您只需定義每個 FleetPackage 物件一次,之後就能使用新修訂版本更新該套件。套用新修訂版本後,機群套件服務會擷取這些變更,並將其部署至叢集。
優點
使用機群套件,在已註冊至機群的叢集中部署 Kubernetes 資源。建立並套用機群套件後,機群套件會自動將 Git 存放區中的 Kubernetes 設定檔部署到新叢集。機群套件以 Config Sync 的優點為基礎 (例如自動修正漂移),並提供下列獨特優勢:
自動推出資源:設定機群套件後,機群套件服務會自動在所有叢集上,部署機群套件指向的 Kubernetes 資源。
自動設定新叢集:如果您設定機群套件,然後將新叢集新增至機群,系統會自動將機群套件定義的所有資源部署至新叢集。
大規模管理 Kubernetes 設定:不必逐一管理叢集,而是使用機群套件,將資源部署至整個叢集機群。
盡量減少錯誤變更造成的影響:一次部署資源的叢集數量上限。您可以密切監控每個叢集的變更,確保錯誤的變更不會影響整個機群。
簡化 Config Sync 設定:機群套件會使用 Cloud Build 向 Git 進行驗證,也就是說,您只需為每個專案驗證一次,不必為每個
RootSync或RepoSync物件驗證一次。
如果符合下列一或多個情境,您可能會偏好使用 Config Sync 和 RootSync 或 RepoSync 物件,而非機群套件:
您管理少數叢集。
您需要進一步控管資源部署至叢集的方式,而不只是透過 Fleet 套件 API 提供的標籤和變體。
需求條件和限制
設定車隊套件時,只有 Git 存放區支援做為單一可靠資料來源。
儲存在 Git 中的 Kubernetes 資源必須代表資源的最終狀態。系統不支援用來轉換 Git 中所儲存資源的其他疊加層。如要進一步瞭解這些資源的差異,請參閱「最佳做法:建立 WET 存放區」。
FleetPackageAPI 僅適用於us-central1區域。您仍可部署至不同區域的叢集,但必須在us-central1中設定 Cloud Build 並設定 gcloud CLI。每個專案在每個區域最多可有 300 個車隊套件。
架構
您可以使用 FleetPackage API,將 Kubernetes 資訊清單部署至叢集機群。FleetPackage API 會使用 Cloud Build,從 Git 存放區同步及擷取 Kubernetes 資源。機群套件服務隨後會將這些資源部署至叢集。
變化版本生成方式
機群套件會使用變體系統,從同一個 Git 存放區,將不同的 Kubernetes 資源設定部署至機群中的不同叢集或叢集群組。
FleetPackage 規格中有兩個欄位可控制變體的行為:
resourceBundleSelector.cloudBuildRepository.variantsPattern:用於在 Git 存放區中尋找檔案和目錄的 glob 模式 (位於指定path下方,如果省略path,則位於存放區根目錄)。這個模式會決定哪些檔案或目錄會成為變體,以及變體包含的內容。variantSelector.variantNameTemplate:運算式,可將車隊中的每個叢集對應至variantsPattern產生的其中一個變體名稱。這項選取作業是根據叢集的機群成員資格中繼資料進行。
variantsPattern 比對
variantsPattern 欄位為必填,用於指定如何從存放區中儲存的設定產生變體。系統會使用下列邏輯進行比對:
檔案相符:如果模式與 YAML 檔案相符,系統就會建立變體。
- 變化版本名稱:不含副檔名的檔案名稱 (例如,
prod-config.yaml會變成變化版本prod-config)。 - 變體內容:這個單一檔案的內容。
- 變化版本名稱:不含副檔名的檔案名稱 (例如,
目錄相符:如果模式與目錄相符,系統就會建立變體。
- 變數名稱:目錄名稱 (例如,目錄
dev會變成變數dev)。 - 變體內容:這個目錄及其所有子目錄中找到的所有 YAML 檔案組合 (遞迴)。
- 變數名稱:目錄名稱 (例如,目錄
檔案比對模式有下列限制:
- 不支援遞迴 (雙) 萬用字元。系統不支援
**模式。 - 如果模式包含點 (
.) 字元,後面必須接英數字元。 - 模式不得包含單引號 (
')。 - 變化版本名稱不得重複。如果模式與多個同名檔案相符 (例如
app1/deploy.yaml和app2/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.yaml、us-central1-a和us-central1-b。生成變化版本:common-ingress(來自檔案)us-central1-a(合併該資料夾中的所有 YAML 檔案)us-central1-b(合併該資料夾中的所有 YAML)
variantsPattern: "*.yaml":相符項目common-ingress.yaml。生成變體:common-ingress
variantsPattern: "us-*":比對us-central1-a和us-central1-b。 生成變化版本:us-central1-aus-central1-b
variantsPattern: "us-central1-b/*.yaml":比對us-central1-b/gke-1.yaml和us-central1-b/blue-green.yaml。生成變體:gke-1blue-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 的目錄,系統就不會同步任何內容。
合併 variantsPattern 和 variantNameTemplate
如要順利部署,請務必確保 variantsPattern 產生的變體名稱是叢集可透過比對 variantNameTemplate 同步處理的名稱。
舉例來說,如要根據環境標籤部署至叢集,您可以透過 dev、staging 和 prod 等目錄建構 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