Flux でマルチクラスターを構成する
共有インフラとクラスターごとの違いを持たせて、1 つのリポジトリから複数のクラスターを管理します。
Flux は、各クラスターで 1 組のコントローラーを実行し、すべてが同じ Git リポジトリの異なるパスを追跡することで、多くのクラスターにスケールします。クラスターを登録する中央のハブはありません。このガイドでは、staging と本番のために単一のリポジトリを構成し、各クラスターを bootstrap し、インフラをアプリケーションより前に配置し、代わりにリモートクラスターの構成をいつ使うかを説明します。
1 つのリポジトリ、クラスターごとに 1 つのパス
Flux は単純なルールに従います。すべてのクラスターは、clusters/ 配下の自分専用のフォルダーに対して bootstrap されます。2 つのクラスターに対応するリポジトリは次のようになります。
fleet-infra/
├── clusters/
│ ├── staging/
│ │ ├── flux-system/ # bootstrap によって作成
│ │ ├── infrastructure.yaml
│ │ └── apps.yaml
│ └── production/
│ ├── flux-system/
│ ├── infrastructure.yaml
│ └── apps.yaml
├── infrastructure/
│ ├── base/ # 共有:ingress、cert-manager、モニタリング
│ ├── staging/
│ └── production/
└── apps/
├── base/
├── staging/
└── production/
共有の定義は base/ フォルダーに置かれ、各環境のフォルダーには、異なる部分の Kustomize オーバーレイが入ります(オーバーレイのガイドを参照)。
各クラスターを bootstrap する
kubectl のコンテキストを各クラスターに順に切り替え、異なるパスで同じリポジトリに対して bootstrap します。
kubectl config use-context staging
flux bootstrap github --owner=<user> --repository=fleet-infra \
--branch=main --path=clusters/staging --personal
kubectl config use-context production
flux bootstrap github --owner=<user> --repository=fleet-infra \
--branch=main --path=clusters/production --personal
各クラスターに、独自の Flux のインストールと、Git 内の独自の flux-system フォルダーができました。後で 3 つ目のクラスターを追加するには、新しいパスで bootstrap コマンドをもう 1 つ実行するだけです。
各クラスターを独自のオーバーレイに向ける
clusters/production/apps.yaml は、本番のオーバーレイを適用します。
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
namespace: flux-system
spec:
interval: 10m
dependsOn:
- name: infrastructure
sourceRef:
kind: GitRepository
name: flux-system
path: ./apps/production
prune: true
wait: true
clusters/staging/apps.yaml は、path: ./apps/staging を除いて同一です。infrastructure の Kustomization も、同じ方法で ./infrastructure/<env> を指し、アプリケーションが、ingress コントローラー、証明書マネージャー、同様のコンポーネントが準備完了になってから起動するように、wait: true を持っています。その順序を強制するのが dependsOn フィールドです。
クラスターをまたいで確認する
Flux には中央のダッシュボードがないため、各クラスターを自分のコンテキストから確認します。
flux get kustomizations --context staging
flux get kustomizations --context production
どちらも Ready と表示されるはずです。flux tree と flux get all -A を使って、Git がデプロイ済みとしているものと、各クラスターが報告するものを比較します。フリート全体の可視性のために、チームはしばしば Flux の Prometheus メトリクスを Grafana に収集します。
staging から本番にプロモートする
両方のクラスターが同じリポジトリを読むため、プロモーションは commit です。一般的な流れは次のとおりです。
apps/stagingを変更し、Flux に staging クラスターへ適用させます。- テストして確認します。
- レビュー済みのプルリクエストで、
apps/productionに同じ変更を加えるか、本番のGitRepositoryが追跡するリリースにタグを付けます(オーバーレイのガイドを参照)。
代替案:1 つの制御クラスター、多くのリモートクラスター
すべてのクラスターで Flux を実行する代わりに、1 か所で実行して、その Kustomization と HelmRelease を他のクラスターに適用させることもできます。リソースの spec.kubeConfig に、リモートクラスターの kubeconfig を保持する Secret を設定します。
spec:
kubeConfig:
secretRef:
name: production-kubeconfig
これにより制御は一元化されますが、すべてのクラスターの認証情報が、制御クラスターに置かれることにもなります。これは、認証情報が各クラスターの外に出ず、侵害されたクラスターが他のクラスターに到達できない、通常の Flux のモデルとは異なります。軽量なエッジクラスターなど、一元化する明確な理由がない限り、クラスターごとに 1 つの Flux のインストールを優先してください。この方法をとる場合は、プラットフォームがサポートしているなら、長期間有効な kubeconfig の代わりに、クラウドの workload identity を使い、大規模なフリートの管理には、Flux Operator を検討してください。
良い習慣
- 各クラスターの
flux-systemフォルダーを、共有のオーバーレイに入れないでください。bootstrap がそれを所有します。 dependsOnを使って、インフラ、CRD、コントローラーが、それを必要とするアプリより前にインストールされるようにします。- staging が本番のシークレットを復号できないように、各クラスターに独自の SOPS キーを与えます(シークレットのガイドを参照)。
- Flux のアップグレードは、本番以外のクラスターから始めて、1 度に 1 クラスターずつ、より新しい CLI で
flux bootstrapを再実行して行います。
人気のガイド
-
Push と Pull:Flux が Kubernetes にデリバリーする仕組み Git 主導の pull 型デリバリーが、デプロイ、セキュリティ、復旧の方法をどう変えるか。 -
GitRepository と Kustomization で最初のアプリケーションをデプロイする Kustomization リソースを使って Flux を Git のマニフェストに向け、同期の様子を確認します。 -
同期動作を制御する:間隔、prune、ドリフトの修正、ロールバック Flux がいつ変更を適用するか、何を削除するか、どう一時停止するか、失敗したデプロイをどう元に戻すかを決めます。 -
Flux Image Automation でイメージの更新を自動化する 新しいコンテナイメージのタグを Flux に検出させ、Git に commit させます。 -
Flux CD と Argo CD:GitOps ツールの選び方 アーキテクチャ、UI、Helm、シークレット、テナンシー、イメージの自動化を比較して、適切なツールを選びます。