このページでは、フリート パッケージ、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']}