このページでは、フリート パッケージ、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 を使用することをおすすめします。
管理するクラスタが少ない。
フリート パッケージ API がラベルとバリアントを使用して提供する以上の方法で、リソースをクラスタにデプロイする方法を制御する必要がある。
要件と制限事項
フリート パッケージを構成する場合、信頼できる情報源としてサポートされるのは Git リポジトリのみです。
Git に保存されている Kubernetes リソースは、リソースの最終状態を表す必要があります。Git に保存されているリソースを変換する追加のオーバーレイはサポートされていません。これらのリソースの違いの詳細については、ベスト プラクティス: WET リポジトリを作成するをご覧ください。
FleetPackage
API はus-central1
リージョンでのみ使用できます。異なるリージョンのクラスタにデプロイすることはできますが、Cloud Build を設定し、us-central1
で 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 つの異なるデプロイ仕様が含まれています。
レプリカ: 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
バリアントを使用すると、「small」または「large」のデプロイを異なるクラスタにデプロイできます。各クラスタには 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']}