KubernetesクラスターでのGitOpsの利用
- GitLab 13.7 で導入されました。
- GitLab 14.0 で導入され、
resource_inclusions
とresource_exclusions
属性が削除され、reconcile_timeout
,dry_run_strategy
,prune
,prune_timeout
,prune_propagation_policy
,inventory_policy
属性が追加されました。- 15.3でGitLab PremiumからGitLab Freeに移動しました。
- GitLab 15.7 で
id
属性をオプションに変更しました。- GitLab 15.7で導入されたKubernetesマニフェストファイルをフェッチするためにブランチ、タグ、またはコミットリファレンスを指定。
- GitLab 16.1でGitOpsのFluxを優先するように変更。
GitLabはFluxfor GitOpsをインテグレーションしています。Fluxを使い始めるには、Flux for GitOpsチュートリアルをご覧ください。
GitOpsを使えば、コンテナ化されたクラスターやアプリケーションをGitリポジトリから管理することができます:
- システムの単一の真実のソースです。
- システムをオペレーションする 唯一の場所です
GitLab、Kubernetes、GitOpsを組み合わせることで
- GitLabをGitOpsのオペレーションに。
- 自動化と収束システムとしてのKubernetes。
- GitLab CI/CD 継続的インテグレーション。
- 継続的デプロイとクラスター観測のためのエージェントです。
- 自動ドリフト修正機能
- サーバーサイドによるリソース管理は、透過的なマルチアクターフィールド管理に適用されます。
デプロイ順序
この図は、GitOpsのデプロイにおけるリポジトリと主なアクターを示しています:
Fluxとagentk
GitOpsデ agentk
プロイの両方を使うべきです。agentk
Fluxはクラスタの状態をソースと同期させたまま、 agentk
Fluxのセットアップを簡素化し、クラスタからGitLabへのアクセス管理を提供し、GitLab UIでクラスタの状態を可視化します。
ソース管理のためのOCI
Fluxのソースコントローラーとして、GitリポジトリではなくOCIイメージを使うべきです。GitLabコンテナレジストリはOCIイメージをサポートしています。
OCI レジストリ | Gitリポジトリ |
---|---|
コンテナイメージを大規模に提供するように設計されています。 | ソースコードのバージョン管理と保存 |
不変で、セキュリティスキャンをサポートします。 | 不変。 |
デフォルトの Git ブランチは、同期をトリガーせずにクラスターの状態を保存することができます。 | デフォルトの Git ブランチは、クラスターの状態を保存するときに同期をトリガーします。 |
リポジトリ構造
設定を簡素化するため、チームごとに 1 つの配信リポジトリを使用します。アプリケーションごとに、配信リポジトリを複数の OCI イメージにパッケージ化できます。
その他の推奨リポジトリ構造については、Fluxのドキュメントを参照してください。
Git リポジトリの即時照合
- GitLab 16.1 で
notify_kas_on_git_push
というフラグで導入されました。デフォルトでは無効です。- GitLab.comで有効になり、GitLab 16.2で自己管理。
- GitLab 16.3で機能フラグを削除。
通常、Fluxソースコントローラーは設定された間隔でGitリポジトリの照合を行います。このため、git push
、クラスターの状態を照合するまでに遅延が発生し、GitLabから不必要なプルが発生する可能性があります。
Kubernetes 用エージェントは、エージェントが接続しているインスタンスで GitLab プロジェクトを参照する FluxGitRepository
オブジェクトを自動的に検出し、インスタンス用にReceiver
を設定します。Kubernetes 用エージェントがgit push
を検出すると、Receiver
がトリガーされ、Flux はクラスターとリポジトリへの変更を照合します。
Gitリポジトリの即時リコンシリエーションを使用するには、Kubernetesクラスターが稼働している必要があります:
- Kubernetes用のエージェント。
- Flux
source-controller
とnotification-controller
。
Git リポジトリの即時リコンシリエーションは、プッシュからリコンシリエーションまでの時間を短縮できますが、すべてのgit push
イベントを受け取ることを保証するものではありません。それでも、GitRepository.spec.interval
を許容できる時間に設定する必要があります。
カスタム Webhook エンドポイント
Kubernetes 用エージェントがReceiver
Webhook を呼び出すとき、エージェントのデフォルトはhttp://webhook-receiver.flux-system.svc.cluster.local
で、これは Flux ブートストラップのインストールによって設定されるデフォルトの URL でもあります。カスタムエンドポイントを設定するには、flux.webhook_receiver_url
をエージェントが解決できるURLに設定します。例えば
flux:
webhook_receiver_url: http://webhook-receiver.another-flux-namespace.svc.cluster.local
このフォーマットで設定されたサービス・プロキシURLには、特別なハンドリングがあります:/api/v1/namespaces/[^/]+/services/[^/]+/proxy
。例えば
flux:
webhook_receiver_url: /api/v1/namespaces/flux-system/services/http:webhook-receiver:80/proxy
このような場合、Kubernetes用エージェントは利用可能なKubernetes設定とコンテキストを使用してAPIエンドポイントに接続します。エージェントをクラスター内部で実行し、Flux通知コントローラのIngress
を設定していない場合に使用できます。
トークンの管理
Fluxの特定の機能を利用するには、複数のアクセストークンが必要になる場合があります。さらに、同じ結果を得るために複数のトークンタイプを使うこともできます。
このセクションでは、必要となる可能性のあるトークンのガイドラインと、可能な限り推奨されるトークンの種類を示します。
FluxによるGitLabアクセス
コンテナレジストリやGitリポジトリであるGitLabにアクセスするには、Fluxを使います:
- プロジェクトやグループのデプロイトークン。
- プロジェクトまたはグループのデプロイキー。
- プロジェクトまたはグループのアクセストークン。
- 個人アクセストークン。
トークンに書き込みアクセス権は必要ありません。
http
アクセスが可能な場合は、プロジェクトデプロイトークンを使用する必要があります。git+ssh
アクセスが必要な場合は、デプロイキーを使用する必要があります。デプロイキーとデプロイトークンの比較については、デプロイキーを参照してください。
デプロイトークンの作成、ローテーション、レポートの自動化のサポートは、イシュー389393で提案されています。
Flux から GitLab への通知
Gitソースから同期するようにFluxを設定すると、FluxはGitLabパイプラインに外部ジョブのステータスを登録することができます。
Fluxから外部のジョブステータスを取得するには、次のようにします:
- プロジェクトやグループのデプロイトークン。
- プロジェクトまたはグループのアクセストークン。
- 個人アクセストークン。
トークンにはapi
スコープが必要です。漏洩したトークンの攻撃範囲を最小にするために、プロジェクトアクセストークンを使うべきです。
GitLab パイプラインに Flux をジョブとしてインテグレーションすることは、イシュー405007 で提案されています。
関連するトピック
- トレーニングやデモのための GitOps 作業例
- セルフペースのクラスルームワークショップ(AWS EKSを使用しますが、他のKubernetesクラスタにも使用できます。)
- GitOpsワークフローにおけるKubernetesシークレットの管理