このページでは、フリート パッケージ、FleetPackage
API、およびそれらが Config Sync とどのように関連しているかについて説明します。
FleetPackage
は、フリート全体でパッケージを管理できる宣言型 API です。フリート パッケージは、クラスタ構成を定義する Kubernetes YAML マニフェストのセットです。フリート パッケージを使用すると、フリートに登録されているクラスタに、一括ロールアウトまたは段階的なロールアウトでパッケージをデプロイできます。
各 FleetPackage
オブジェクトを 1 回定義したら、そのパッケージを新しいリビジョンで更新できます。新しいリビジョンを適用すると、フリート パッケージ サービスがそれらの変更を取得してクラスタにデプロイします。
利点
フリート パッケージを使用すると、フリートに登録されているすべてのクラスタに Kubernetes リソースをデプロイできます。フリート パッケージを作成して適用すると、Git リポジトリ内の Kubernetes 構成ファイルが自動的に新しいクラスタにデプロイされます。フリート パッケージは、ドリフトの自動修正などの Config Sync のメリットを基盤として、次のような独自の利点を提供します。
リソースのロールアウトを自動化する: フリート パッケージを設定すると、そのフリート パッケージが参照する Kubernetes リソースがフリート パッケージ サービスによって自動的にすべてのクラスタにデプロイされます。
新しいクラスタを自動的に構成する: フリート パッケージを構成した後にフリートに新しいクラスタを追加すると、フリート パッケージで定義したリソースが新しいクラスタに自動的にデプロイされます。
Kubernetes 構成を大規模に管理する: クラスタを 1 つずつ管理するのではなく、フリート パッケージを使用してクラスタのフリート全体にリソースをデプロイできます。
誤った変更の影響を最小限に抑える: リソースを一度にデプロイするクラスタの最大数を選択できます。誤った変更がフリート全体に影響しないように、各クラスタの変更を綿密にモニタリングできます。
Config Sync の構成を簡素化する: フリート パッケージは Cloud Build を使用して Git の認証を行うため、認証が
RootSync
オブジェクトまたはRepoSync
オブジェクトごとに 1 回ではなくプロジェクトごとに 1 回になります。
次のいずれかのシナリオに該当する場合は、フリート パッケージではなく、RootSync
オブジェクトまたは RepoSync
オブジェクトで Config Sync を使用することをおすすめします。
管理するクラスタが少ない。
リソースをクラスタにデプロイする方法をより細かく制御する必要がある(FleetPackage 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 リポジトリからクラスタのフリート全体にリソースをデプロイできます。フリート パッケージを構成して、デプロイするリソースの種類、方法、場所を制御することもできます。
次のセクションでは、さまざまな FleetPackage
構成の例を示します。フリート パッケージの適用の詳細については、フリート パッケージをデプロイするをご覧ください。
フリート内のすべてのクラスタへのデプロイ
次の FleetPackage
は、ローリング戦略を使用して Kubernetes リソースを一度に 3 つのクラスタにデプロイし、フリート内のすべてのクラスタをターゲットにします。
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
は、ラベルセレクタを使用して、フリート内のクラスタのうち、"us"
と一致するメンバーシップ ラベル country
を持つクラスタにのみ 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
selector:
matchLabels:
country: "us"
rolloutStrategy:
rolling:
maxConcurrent: 3
クラスタへのバリアント リソースのデプロイ
この例では、Git リポジトリに「deployments」という名前のフォルダがあり、そこに 2 つの異なる Deployment 仕様が含まれています。
Replicas: 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
Replicas: 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
バリアントを使用すると、「small」または「large」の Deployment を異なるクラスタにデプロイできます。各クラスタには nginx-size=small
または nginx-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']}