Azure では、Azure Kubernetes Service (AKS) および Azure Arc 対応 Kubernetes クラスターと連携する GitOps を使用した自動アプリケーション デプロイ機能を提供しています。 アプリケーションを Kubernetes クラスターにデプロイするために GitOps を採用することで得られる主な利点は次のとおりです。
- クラスターで実行されているアプリケーションの状態に対する継続的な可視性。
- アプリケーション開発チームとインフラストラクチャ チーム間の懸念事項の分離。 アプリケーション チームには、Kubernetes デプロイの経験が必要ありません。 プラットフォーム エンジニアリング チームは通常、アプリケーション チーム向けのセルフサービス モデルを作成し、より高い信頼性でデプロイを実行できるようにします。
- クラッシュした場合やスケールアウトした場合に、必要な同じ状態でクラスターを再作成する機能。
- Azure Policy を使用して 大規模にアプリケーションをデプロイ する機能。
GitOps では、Git リポジトリ内のファイルで、Kubernetes クラスターの必要な状態を宣言します。 Git リポジトリには、次のファイルが含まれている場合があります。
- Kubernetes リソース (名前空間、シークレット、デプロイなど) を記述する YAML 形式のマニフェスト
- アプリケーションをデプロイするための Helm チャート
- 環境固有の変更を記述する Kustomize ファイル
これらのファイルは Git リポジトリに格納されるため、バージョン管理されるとともに、バージョン間の変更を簡単に追跡できます。 Kubernetes コントローラーはクラスターで実行され、Git リポジトリで宣言されている必要な状態でクラスターの状態を継続的に調整します。 これらのオペレーターは、Git リポジトリからファイルを取得し、必要な状態をクラスターに適用します。 また、オペレーターは、クラスターが必要な状態を維持していることを継続的に保証します。
Azure Arc 対応 Kubernetes または Azure Kubernetes Service の GitOps では、一般的なオープンソース ツール セットである Flux が使用されます。 Flux は、一般的なファイル ソース (Git リポジトリや Helm リポジトリ、バケット、Azure Blob Storage)、テンプレートの種類 (YAML、Helm、Kustomize) をサポートしています。 Flux では、 マルチテナント とデプロイの依存関係の管理もサポートされています。その他の機能もあります。
Flux はクラスターに直接デプロイされ、各クラスターのコントロール プレーンは論理的に分離されます。 これにより、数百、数千のクラスターに適切にスケーリングできます。 Flux を使用すると、純粋なプルベースの GitOps アプリケーションのデプロイが可能になります。 ソース リポジトリまたはその他のクラスターによるクラスターへのアクセスは必要ありません。
Flux クラスターの拡張機能
GitOps は、Azure Arc 対応 Kubernetes または AKS クラスターで、 Microsoft.KubernetesConfiguration/extensions/microsoft.flux
クラスター拡張機能 リソースとして有効になります。 1 つ以上の microsoft.flux
を作成するには、事前に fluxConfigurations
拡張機能をクラスターにインストールしておく必要があります。 クラスターで最初の Microsoft.KubernetesConfiguration/fluxConfigurations
を作成すると、拡張機能が自動的にインストールされます。または、ポータル、Azure CLI (az k8s-extension create --extensionType=microsoft.flux
)、ARM テンプレート、または REST API を使用すると、拡張機能を手動でインストールできます。
コントローラー
既定では、 microsoft.flux
拡張機能によって Flux コントローラー (ソース、Kustomize、Helm、Notification) と FluxConfig カスタム リソース定義 (CRD)、 fluxconfig-agent
、および fluxconfig-controller
がインストールされます。 また、必要に応じて、Docker イメージの更新と取得の機能を提供する、Flux image-automation
コントローラーと image-reflector
コントローラーをインストールすることもできます。
Flux ソース コントローラー:
source.toolkit.fluxcd.io
カスタム リソースを監視します。 Git リポジトリ、Helm リポジトリ、バケットおよび Azure Blob Storage 間の同期を処理します。 プライベート Git、Helm リポジトリ、Azure Blob Storage アカウントのソースを使用した認可を処理します。 Tar アーカイブ ファイルを通じて、ソースに対する最新の変更を示します。Flux Kustomize コントローラー:
kustomization.toolkit.fluxcd.io
カスタム リソースを監視します。 ソースからクラスターに Kustomize ファイルまたは未加工の YAML ファイルを適用します。Flux Helm コントローラー:
helm.toolkit.fluxcd.io
カスタム リソースを監視します。 Source コントローラーによって示される Helm リポジトリ ソースから、関連するグラフを取得します。HelmChart
カスタム リソースを作成し、特定のバージョン、名前、顧客定義の値を使用して、HelmRelease
をクラスターに適用します。Flux 通知コントローラー:
notification.toolkit.fluxcd.io
カスタム リソースを監視します。 すべての Flux コントローラーから通知を受信します。 ユーザー定義の Webhook エンドポイントに通知をプッシュします。Flux カスタム リソース定義は次のとおりです。
kustomizations.kustomize.toolkit.fluxcd.io
imagepolicies.image.toolkit.fluxcd.io
imagerepositories.image.toolkit.fluxcd.io
imageupdateautomations.image.toolkit.fluxcd.io
alerts.notification.toolkit.fluxcd.io
providers.notification.toolkit.fluxcd.io
receivers.notification.toolkit.fluxcd.io
buckets.source.toolkit.fluxcd.io
gitrepositories.source.toolkit.fluxcd.io
helmcharts.source.toolkit.fluxcd.io
helmrepositories.source.toolkit.fluxcd.io
helmreleases.helm.toolkit.fluxcd.io
fluxconfigs.clusterconfig.azure.com
FluxConfig CRD:
fluxconfigs.clusterconfig.azure.com
Kubernetes オブジェクトを定義するFluxConfig
カスタム リソースのカスタム リソース定義。fluxconfig-agent
: Azure で新規または更新されたfluxConfigurations
リソースがないかどうかを監視する役割と、クラスター内にある関連する Flux 構成を開始する役割を担います。 また、各fluxConfigurations
リソースについて、クラスター内の Flux の状態の変更を Azure にプッシュして戻す役割も担います。fluxconfig-controller
:fluxconfigs.clusterconfig.azure.com
カスタム リソースを監視し、クラスター内の GitOps 構造の新規または更新された構成を使用して変更に対応します。
注
microsoft.flux
拡張機能は、flux-system
名前空間にインストールされ、クラスター全体のスコープを持ちます。 名前空間スコープでこの拡張機能をインストールすることはできません。
Flux 構成
アーキテクチャ図を高解像度でダウンロードするには、 Jumpstart Gem にアクセスしてください。
Git リポジトリ、バケット ソースまたは Azure Blob Storage からクラスターの GitOps 管理を有効にするには、Flux 構成リソース (Microsoft.KubernetesConfiguration/fluxConfigurations
) を作成します。
fluxConfigurations
リソースを作成すると、ターゲット Git リポジトリなどのパラメーターに指定した値を使用して、そのクラスターで GitOps プロセスを有効にする Kubernetes オブジェクトを作成および構成します。 データのセキュリティを確保するため、fluxConfigurations
リソース データは、クラスター構成サービスによって、保存時に暗号化された状態で Azure Cosmos DB データベースに格納されます。
fluxconfig-agent
拡張機能と共にインストールされる fluxconfig-controller
エージェントと microsoft.flux
エージェントを使用すると、GitOps 構成プロセスを管理できます。
fluxconfig-agent
は、次のタスクを担当します。
- 新規または更新された
fluxConfigurations
リソースについて、Kubernetes 構成データ プレーン サービスをポーリングします。 - 構成情報を使用して、クラスター内の
FluxConfig
カスタム リソースを作成または更新します。 -
FluxConfig
カスタム リソースを監視し、関連する Azure fluxConfiguration リソースに状態の変更をプッシュして戻します。
fluxconfig-controller
は、次のタスクを担当します。
- 管理対象の
fluxConfigurations
で作成された Flux カスタム リソースへのステータス更新を監視します。 -
fluxConfigurations
の有効期間にわたって存在する秘密キーと公開キーのペアを作成します。 このキーは、URL が SSH ベースの場合、および構成の作成時にユーザーが独自の秘密キーを指定していない場合に、認証に使用されます。 - ユーザー指定の秘密キー/http 基本認証/既知のホスト/認証なしのデータに基づいて、カスタム認証シークレットを作成します。
- ロールベースのアクセス制御 (プロビジョニングされたサービス アカウント、作成済みまたは割り当て済みのロール バインド、作成済みまたは割り当て済みのロール) を設定します。
-
GitRepository
カスタム リース内の情報から、Bucket
カスタム リースまたはKustomization
カスタム リソース、およびFluxConfig
カスタム リソースを作成します。
Azure の各 fluxConfigurations
リソースは、Kubernetes クラスターで、1 つの Flux GitRepository
カスタム リソースまたは Bucket
カスタム リソース、および 1 つ以上の Kustomization
カスタム リソースに関連付けられます。
fluxConfigurations
リソースを作成するときに、ソース (Git リポジトリ、バケットまたは Azure Blob Storage) の URL と、各 Kustomization
のソースの同期ターゲットを指定します。
Kustomization
カスタム リソース間の依存関係を構成して、デプロイ シーケンスを制御できます。 また、さまざまなアプリケーション チームやアプリ チームのために、名前空間で範囲指定された複数の fluxConfigurations
リソースを同じクラスターに作成することもできます。
注
fluxconfig-agent
は、Azure の新規または更新された fluxConfiguration
リソースを監視します。 エージェントには、fluxConfiguration
の必要な状態をクラスターに適用するために、Azure への接続が必要です。 エージェントが Azure に接続できない場合、クラスター内の変更はエージェントが接続できるようになるまで待機します。 クラスターが 48 時間以上 Azure から切断された場合、クラスターへの要求はタイムアウトになり、変更を Azure に再適用する必要があります。
秘密キー、トークンやパスワードなど、顧客による機密性の高い入力の内容が、48 時間以上 Kubernetes 構成サービスに保存されることはありません。 Azure でこれらの値のいずれかを更新する場合は、クラスターが 48 時間以内に Azure に接続していることを確認してください。
Azure portal で Flux の構成状態とコンプライアンスを監視することも、ダッシュボードを使用して状態、コンプライアンス、リソース使用量、調整アクティビティを監視することもできます。 詳細については、「 GitOps (Flux v2) の状態とアクティビティの監視」を参照してください。
バージョンのサポート
Flux v2 拡張機能 (microsoft.flux
) の最新バージョンと、前の 2 つのバージョン (N-2) がサポートされています。 通常、拡張機能の 最新バージョン を使用することをお勧めします。
microsoft.flux
バージョン 1.7.0 以降では、ARM64 ベースのクラスターがサポートされています。
プライベート リンクを使用する GitOps
Azure Arc 対応 Kubernetes クラスターへのプライベート リンクのサポートを追加した場合、microsoft.flux
拡張機能は、Azure への通信ですぐに使用できます。 Git リポジトリ、Helm リポジトリ、または Kubernetes マニフェストをデプロイするために必要なその他のエンドポイントへの接続については、このエンドポイントをファイアウォールの内側にプロビジョニングするかファイアウォールにリストして、Flux Source コントローラーが正常にアクセスできるようにする必要があります。
データの保存場所
Azure GitOps サービス (Azure Kubernetes Configuration Management) は、顧客データを格納/処理します。 既定では、顧客データはペアのリージョンにレプリケートされます。 シンガポール、東アジア、ブラジル南部リージョンでは、すべての顧客データがリージョン内に格納されて処理されます。
Flux 構成を大規模に適用する
Azure Resource Manager によって構成が管理されるので、サブスクリプションまたはリソース グループの範囲内で、Azure Kubernetes Service と Azure Arc 対応 Kubernetes のリソース全体で Azure Policy を使用して同じ構成の作成を自動化できます。 このように大規模に適用することで、クラスター グループ全体に特定の構成が一貫して適用されます。
詳細については、「 Flux v2 構成と Azure Policy を使用してアプリケーションを一貫して大規模にデプロイする」を参照してください。
パラメーター
Azure の Flux v2 でサポートされているすべてのパラメーターについては、 az k8s-configuration
のドキュメントを参照してください。 現在、Azure の実装では、Flux がサポートしているすべてのパラメーターをサポートしているわけではありません。
使用可能なパラメーターとその使用方法については、 GitOps (Flux v2) でサポートされているパラメーターを参照してください。
マルチテナント
Flux v2 では、バージョン 0.26 以降のマルチテナントがサポートされています。 この機能は、Azure の Flux v2 に統合されています。
注
マルチテナント機能の場合、マニフェストに HelmRelease、Kustomization、ImagePolicy、またはその他のオブジェクトのクロス名前空間 sourceRef が含まれているかどうか、または 1.20.6 未満の Kubernetes バージョンを使用しているかどうかを確認する必要があります。 準備するには、次を実行します。
- Kubernetes バージョン 1.20.6 以上にアップグレードします。
- Kubernetes のマニフェストで、すべての
sourceRef
が GitOps 構成と同じ名前空間内のオブジェクトを示していることを確認します。- マニフェストを更新する時間が必要な場合は、 マルチテナントからオプトアウトできます。 ただし、Kubernetes のバージョンはアップグレードする必要があります。
マルチテナント用にマニフェストを更新する
クラスターのスコープを指定して、fluxConfiguration
名前空間の Kubernetes クラスターの 1 つに cluster-config
をデプロイするとします。
https://github.com/fluxcd/flux2-kustomize-helm-example
リポジトリを同期するようにソースを構成します。 これは、 Flux v2 を使用した GitOps を使用したアプリケーションのデプロイチュートリアルで使用されるのと同じサンプル Git リポジトリです。
Flux では、リポジトリを同期した後、マニフェスト (YAML ファイル) で説明されているリソースをデプロイします。 そのうち 2 つのマニフェストで、HelmRelease
オブジェクトと HelmRepository
オブジェクトを記述しています。
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: nginx
namespace: nginx
spec:
releaseName: nginx-ingress-controller
chart:
spec:
chart: nginx-ingress-controller
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
version: "5.6.14"
interval: 1h0m0s
install:
remediation:
retries: 3
# Default values
# https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
values:
service:
type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 30m
url: https://charts.bitnami.com/bitnami
既定では、Flux 拡張機能は、fluxConfigurations
名前空間にのみデプロイされている flux-applier
サービス アカウントを借用することにより、cluster-config
をデプロイします。 上記のマニフェストを使用すると、マルチテナントが有効になっている場合に、HelmRelease
はブロックされます。 これは、 HelmRelease
は nginx
名前空間内にあるものの、flux-system
名前空間内の HelmRepository を参照しているためです。 また、Flux helm-controller
では、HelmRelease
名前空間に flux-applier
サービス アカウントがないため、nginx
を適用できません。
マルチテナントを使用するには、すべての Flux オブジェクトを fluxConfigurations
と同じ名前空間にデプロイするのが正しい方法です。 この方法を使用すると、名前空間全体で参照の問題を回避でき、オブジェクトを適用するための権限を Flux コントローラーが取得できるようになります。 そのため、cluster-config
名前空間で作成された GitOps 構成の場合、上記のマニフェストのサンプルは次のように変更されます。
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
name: nginx
namespace: cluster-config
spec:
releaseName: nginx-ingress-controller
targetNamespace: nginx
chart:
spec:
chart: nginx-ingress-controller
sourceRef:
kind: HelmRepository
name: bitnami
namespace: cluster-config
version: "5.6.14"
interval: 1h0m0s
install:
remediation:
retries: 3
# Default values
# https://github.com/bitnami/charts/blob/master/bitnami/nginx-ingress-controller/values.yaml
values:
service:
type: NodePort
apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: HelmRepository
metadata:
name: bitnami
namespace: cluster-config
spec:
interval: 30m
url: https://charts.bitnami.com/bitnami
マルチテナントのオプトアウト
microsoft.flux
拡張機能をインストールすると、マルチテナントが既定で有効になります。 マルチテナントを無効にする必要がある場合は、次のコマンド例に示すように、microsoft.flux
を指定してクラスター内の --configuration-settings multiTenancy.enforce=false
拡張機能を作成または更新することでオプトアウトできます。
az k8s-extension create --extension-type microsoft.flux --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
az k8s-extension update --configuration-settings multiTenancy.enforce=false -c CLUSTER_NAME -g RESOURCE_GROUP -n flux -t <managedClusters or connectedClusters>
次のステップ
- このチュートリアルでは、 AKS または Azure Arc 対応 Kubernetes クラスターで GitOps を有効にする方法について説明します。
- GitOps を使用した CI/CD ワークフローについて説明します。