Config Sync を使用した Kubernetes GitOps のベスト プラクティス
このページでは、Config Sync を最大限に活用できるように Kubernetes の CI / CD GitOps パイプラインの計画と設計を行う際の出発点となる情報を提供します。
GitOps 自体は、Kubernetes 構成を大規模に管理する組織とって普遍的なベスト プラクティスです。しかし、そのソリューションの設計には多くの選択肢があります。これらの選択肢の利点とトレードオフを理解することで、将来的なアーキテクチャの再設計を回避できます。
このページで説明するベスト プラクティスをすべて採り入れる必要はありません。どのベスト プラクティスを採用するかは状況によって異なります。このページは、GitOps アーキテクチャを設定する際に十分な情報に基づいて判断できるようにすることを目的としています。
一元化されたプライベート パッケージ リポジトリを使用する
パブリック パッケージまたは内部パッケージ(Helm や kpt
など)に一元化されたリポジトリを使用すると、チームでパッケージを見つけやすくなります。Artifact Registry や Git リポジトリなどのサービスを使用できます。
プラットフォーム チームは、アプリケーション チームが一元化されたリポジトリのパッケージのみを使用できるようにするポリシーを実装できます。また、一元化されたリポジトリを審査済みのパッケージ セットとして使用することもできます。
リポジトリへの書き込み権限を付与する対象は少数のエンジニアに限定できます。組織の他のメンバーには読み取りアクセス権を付与できます。パッケージを一元化されたリポジトリにプロモートし、更新をブロードキャストするプロセスを実装することをおすすめします。
次の表に、一元化されたプライベート パッケージ リポジトリを使用する利点と欠点を示します。
利点 |
欠点 |
|
|
wet リポジトリを作成する
クラスタまたは Namespace の望ましい状態に対応する YAML 出力を使用してリポジトリを作成します。wet リポジトリまたは完全にハイドレートされたリポジトリの変更は、差分を使用して簡単に確認できるようにする必要があります。レビュー プロセスを通じて wet リポジトリのみを変更することをおすすめします(例: GitHub での pull リクエスト)。
次の表に、wet リポジトリを作成する利点と欠点を示します。
利点 |
欠点 |
|
|
構成の検証をシフトレフトする
Config Sync が同期を開始して問題をチェックするまで、不要な Git commit と長いフィードバック ループが発生する可能性があります。kubeval などの kpt
バリデータの機能を使用すると、構成ファイルがクラスタに適用される前に、さまざまな問題が見つかる可能性があります。
次の表に、構成ファイルの適用前に問題をチェックする利点と欠点を示します。
利点 |
欠点 |
|
|
ブランチではなくフォルダを使用する
構成のバリアントには、ブランチではなくフォルダを使用します。フォルダを使用すると、tree
コマンドでバリアントを表示できます。たとえば、ブランチを使用すると、prod ブランチと stage ブランチ間の差分が次の構成変更の対象なのか、stage ブランチと prod ブランチ間に永続的な相違があるのかを判別できません。
次の表に、ブランチではなくフォルダを使用する利点と欠点を示します。
利点 |
欠点 |
|
|
ClusterSelectors
の使用を最小限に抑える
ClusterSelectors
を使用すると、構成の特定部分をクラスタのサブセットに適用できます。RootSync または RepoSync を構成する代わりに、適用されているリソースを変更したり、クラスタにラベルを追加できます。ただし、ClusterSelectors
の数が増えると、クラスタの最終状態の把握が複雑になる可能性があります。
Config Sync を使用すると、複数の RootSyncs
と RepoSyncs
を一度に同期できます。つまり、関連する構成を別のリポジトリに追加して、目的のクラスタに同期できます。
次の表に、ClusterSelectors
を使用しない利点と欠点を示します。
利点 |
欠点 |
|
|
Config Sync を使用した Job の管理を回避する
Config Sync は Job を適用できますが、次の理由から Job は GitOps のデプロイには適していません。
変更不可のフィールド: 多くの Job フィールドは変更不可です。変更不可のフィールドを変更するには、オブジェクトを削除してから再作成する必要があります。ただし、オブジェクトをソースから削除しない限り、Config Sync はオブジェクトを削除しません。
意図しない Job の実行: Job を Config Sync と同期した後、対象の Job がクラスタから削除された場合、Config Sync は選択した状態からのずれを考慮し、Job を再作成します。Job の有効期間(TTL)を指定すると、信頼できる情報源から削除しない限り Job は自動的に削除され、Config Sync によって Job が自動的に再作成および再起動されます。Config Sync によって Job が再実行されるため、多くの場合、これは意図した結果ではありません。
調整に関する問題: 通常、Config Sync は適用後にオブジェクトの調整を待機します。ただし、Job は実行を開始すると調整されたとみなされます。つまり、Config Sync は Job の完了を待たずに、他のオブジェクトの適用を続行します。ただし、後で Job が失敗した場合は、調整に失敗したとみなされます。場合によっては、これにより他のリソースの同期がブロックされ、修正するまでエラーが発生する可能性があります。また、同期に成功し、調整のみが失敗する場合もあります。
こうした理由から、Job を Config Sync と同期することはおすすめしません。
ほとんどの場合、Job やその他の状況タスクは、ライフサイクル管理を処理するサービスによって管理する必要があります。この場合、Job 自体ではなく、Config Sync で対象のサービスを管理できます。
次の表に、Config Sync を使用して Job を管理しない場合の利点と欠点を示します。
利点 |
欠点 |
|
|
非構造化リポジトリを使用する
Config Sync では、リポジトリを編成するための 2 つの構造(非構造化と階層型)がサポートされています。非構造化は、最もニーズに適した方法でリポジトリを整理できるため、推奨されるアプローチです。これに対して、階層型リポジトリは特定の構造を適用します。たとえば、CRD は特定のディレクトリに配置する必要があります。このため、構成ファイルを共有する必要がある場合に問題が生じる可能性があります。たとえば、あるチームが CRD を含むパッケージを公開した場合、そのパッケージを使用する別のチームは CRD を cluster
ディレクトリに移動する必要があるため、プロセスのオーバーヘッドが増加します。
次の表に、非構造化リポジトリを使用する利点と欠点を示します。
利点 |
欠点 |
|
|
階層型リポジトリを変換する方法については、階層型リポジトリを非構造化リポジトリに変換するをご覧ください。
コードと構成のリポジトリを分離する
モノリポジトリをスケールアップする場合は、各フォルダに固有のビルドが必要です。通常、コードの担当者とクラスタ構成の担当者では、権限と懸念事項が異なります。コードとリポジトリを分離することにより、リポジトリごとに独自の権限と構造を設定できます。
次の表に、コードと構成リポジトリを分離する利点と欠点を示します。
利点 |
欠点 |
|
|
別個のリポジトリを使用して変更を分離する
モノリポジトリをスケールアップする場合は、フォルダごとに異なる権限が必要です。このため、リポジトリを分離することで、セキュリティ、プラットフォーム、アプリケーションの構成間にセキュリティ境界を設定できます。また、本番環境と非本番環境でリポジトリを分離することをおすすめします。
次の表に、別個のリポジトリを使用して変更を分離する利点と欠点を示します。
利点 |
欠点 |
|
|
パッケージのバージョンを固定する
Helm と Git のいずれを使用する場合でも、構成パッケージのバージョンは、明示的なロールアウトなしで誤って移動しないように固定する必要があります。
次の表に、パッケージ バージョンを固定する利点と欠点を示します。
利点 |
欠点 |
|
|
Workload Identity を使用する
GKE クラスタで Workload Identity を有効にすると、Kubernetes ワークロードは安全かつ管理しやすい方法で Google サービスにアクセスできます。
次の表に、Workload Identity を使用する利点と欠点を示します。
利点 |
欠点 |
|
|
アーキテクチャの概要
大まかには、少なくとも 4 種類のリポジトリが必要になります。
- 共有構成が保存されているパッケージ リポジトリ。これは、Artifact Registry に保存されている Helm チャートにすることもできます。
- プラットフォーム チームがクラスタと Namespace のフリート全体の構成を保存するプラットフォーム リポジトリ。
- アプリケーション構成リポジトリ。
- アプリケーション コード リポジトリ。
次の図は、これらのリポジトリのレイアウトを示しています。
次の図は、アプリケーション コードからアプリケーション構成リポジトリへの構成フローを示しています。開発チームは、アプリケーションとアプリケーション構成のコードをリポジトリに push します。アプリケーションと構成ファイルの両方のコードが同じ場所に保存され、アプリケーション チームがこれらのリポジトリを管理できます。アプリケーション チームはコードをビルドに push できます。