チュートリアル: GitOps with Flux v2 を使ってアプリケーションをデプロイする

GitOps with Flux v2 は、Azure Arc 対応 Kubernetes クラスターまたは Azure Kubernetes Service (AKS) クラスターでクラスター拡張機能として有効にすることができます。 microsoft.flux クラスター拡張機能をインストールしたら、Git リポジトリ ソースをクラスターに同期する 1 つ以上の fluxConfigurations リソースを作成し、クラスターを目的の状態に調整できます。 GitOps を使用すると、クラスター構成とアプリケーションのデプロイの正しいソースとして Git リポジトリを使用できます。

注意

最終的に Azure は GitOps with Flux v1 のサポートを停止する予定なので、できるだけ早く Flux v2 に移行することをお勧めします。

このチュートリアルでは、Kubernetes クラスターで GitOps を使用する方法について説明します。 始める前に、少し時間を取って Flux を使用した GitOps の概念的な動作について学習します

このチュートリアルでは、2 つの kustomization を持つ GitOps 構成の例を使用して、ある kustomization が別の kustomization にどう依存するかがわかるようにします。 必要であればさらに kustomization と依存関係を、シナリオに応じて追加できます。

重要

この microsoft.flux 拡張機能はメジャー バージョン 1.0.0 をリリースしました。 これには、マルチテナント機能が含まれます。 以前のバージョンの microsoft.flux 拡張機能を使っている既存の GitOps Flux v2 構成がある場合は、Azure CLI (az k8s-extension create -g <RESOURCE_GROUP> -c <CLUSTER_NAME> -n flux --extension-type microsoft.flux -t <CLUSTER_TYPE>) を使って手動で最新の拡張機能にアップグレードすることができます (Arc クラスターの場合は -t connectedClusters を、AKS クラスターの場合は -t managedClusters を使います)。

ヒント

Azure からプロビジョニングされた AKS ハイブリッド クラスターでこの拡張機能を使用する場合は、provisionedClusters を使用するように --cluster-type を設定し、また、--cluster-resource-provider microsoft.hybridcontainerservice をコマンドに追加する必要があります。 Azure からプロビジョニングされた AKS ハイブリッド クラスターへの Azure Arc 拡張機能のインストールは、現在プレビュー中です。

前提条件

Flux v2 で GitOps を使用してアプリケーションをデプロイするには、次のものが必要です。

Azure Arc 対応 Kubernetes クラスターの場合

Azure Kubernetes Service クラスターの場合

  • 稼働している MSI ベースの AKS クラスター。

    重要

    microsoft.flux 拡張機能は SPN ベースの AKS クラスターでは機能しないので、AKS クラスターが (SPN ではなく) MSI で作成されるようにしてください。 az aks create で作成された新しい AKS クラスターの場合、クラスターは既定で MSI ベースになります。 MSI に変換する必要がある既に作成された SPN ベースのクラスターの場合は、az aks update -g $RESOURCE_GROUP -n $CLUSTER_NAME --enable-managed-identity を実行します。 詳細については、AKS でのマネージド ID の使用に関するページを参照してください。

  • Microsoft.ContainerService/managedClusters リソースの種類に対する読み取りおよび書き込みアクセス許可。 Azure からプロビジョニングされた AKS ハイブリッド クラスター (プレビュー) を使用している場合は、Microsoft.ContainerService/provisionedClusters リソースの種類に対する読み取りと書き込みのアクセス許可。

両方のクラスターの種類に共通

  • 次のリソースの種類に対する読み取りと書き込みのアクセス許可。

    • Microsoft.KubernetesConfiguration/extensions
    • Microsoft.KubernetesConfiguration/fluxConfigurations
  • Azure CLI バージョン 2.15 以降。 Azure CLI をインストールするか、次のコマンドを使用して最新バージョンに更新します。

    az version
    az upgrade
    
  • Kubernetes のコマンド ライン クライアントである kubectl。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。

    az aks install-cli コマンドを使用して、kubectl をローカルにインストールします。

    az aks install-cli
    
  • 次の Azure リソース プロバイダーの登録。

    az provider register --namespace Microsoft.Kubernetes
    az provider register --namespace Microsoft.ContainerService
    az provider register --namespace Microsoft.KubernetesConfiguration
    

    登録は非同期プロセスであり、10 分以内に終了するはずです。 登録プロセスを監視するには、次のコマンドを使用します。

    az provider show -n Microsoft.KubernetesConfiguration -o table
    
    Namespace                          RegistrationPolicy    RegistrationState
    ---------------------------------  --------------------  -------------------
    Microsoft.KubernetesConfiguration  RegistrationRequired  Registered
    

バージョンとリージョンのサポート

GitOps は現在、Azure Arc 対応 Kubernetes でサポートされるすべてのリージョンでサポートされています。 GitOps は現在、AKS でサポートされるリージョンのサブセットでサポートされています。 GitOps サービスでは、サポートされる新しいリージョンが定期的に追加されています。

Flux v2 拡張機能の最新バージョンと、前の 2 つのバージョン (N-2) がサポートされています。 一般的に、拡張機能の最新バージョンを使用することをお勧めします。

ネットワークの要件

GitOps エージェントが機能するには、ポート 22 (SSH) またはポート 443 (HTTPS) のリポジトリ ソースへの送信 (エグレス) TCP が必要です。 エージェントには、次の送信 URL へのアクセス権も必要です。

エンドポイント (DNS) 説明
https://management.azure.com エージェントで Kubernetes 構成サービスと通信するために必要です。
https://<region>.dp.kubernetesconfiguration.azure.com エージェントが状態をプッシュして構成情報をフェッチするためのデータ プレーン エンドポイント。 <region> (前述のサポートされているリージョン) に依存します。
https://login.microsoftonline.com Azure Resource Manager トークンをフェッチし、更新するために必要です。
https://mcr.microsoft.com Flux コントローラー用のコンテナー イメージをプルするために必要です。

CLI 拡張機能を有効にする

最新の CLI 拡張機能パッケージ k8s-configuration および k8s-extension をインストールします。

az extension add -n k8s-configuration
az extension add -n k8s-extension

これらのパッケージを最新バージョンに更新するには:

az extension update -n k8s-configuration
az extension update -n k8s-extension

インストールされているすべての Azure CLI 拡張機能とそのバージョンの一覧を表示するには、次のコマンドを使います。

az extension list -o table

Experimental   ExtensionType   Name                   Path                                                       Preview   Version
-------------  --------------  -----------------      -----------------------------------------------------      --------  --------
False          whl             connectedk8s           C:\Users\somename\.azure\cliextensions\connectedk8s         False     1.2.7
False          whl             k8s-configuration      C:\Users\somename\.azure\cliextensions\k8s-configuration    False     1.5.0
False          whl             k8s-extension          C:\Users\somename\.azure\cliextensions\k8s-extension        False     1.1.0

ヒント

エラーの解決方法については、「Azure Arc 対応 Kubernetes および GitOps のトラブルシューティング」の Flux v2 の提案を参照してください。

Flux の構成を適用

AKS または Arc 対応 Kubernetes クラスターで GitOps を有効にするには、k8s-configuration Azure CLI 拡張機能 (または Azure portal) を使用します。 デモの場合は、パブリック gitops-flux2-kustomize-helm-mt リポジトリを使用します。

重要

デモンストレーション リポジトリは、このチュートリアルの使用を単純化し、いくつかの重要な原則を例示する目的で設計されています。 最新の状態を維持するために、リポジトリには、バージョンのアップグレードによる破壊的変更が生じる場合があります。 それらの変更がこのチュートリアルの新しいアプリケーションに影響することはありませんが、まだ削除されていない以前のチュートリアル アプリケーションはその影響を受けます。 それらの変更への対応方法については、破壊的変更の免責事項を参照してください。

次の例では、以下の値と設定を使用して、Flux 構成をクラスターに適用しています。

  • クラスターが含まれているリソース グループは flux-demo-rg です。
  • Azure Arc クラスターの名前は flux-demo-arc です。
  • クラスターの種類は Azure Arc (-t connectedClusters) ですが、この例は AKS (-t managedClusters) と、Azure (-t provisionedClusters) からプロビジョニングされた AKS ハイブリッド クラスターでも機能します。
  • Flux 構成の名前は cluster-config です。
  • 構成インストールの名前空間は cluster-config です。
  • パブリック Git リポジトリの URL は https://github.com/Azure/gitops-flux2-kustomize-helm-mt です。
  • Git リポジトリ ブランチは main です。
  • 構成のスコープは cluster です。 これにより、クラスター全体で変更を行うアクセス許可がオペレーターに付与されます。 このチュートリアルで namespace スコープを使用するには、必要な変更を参照してください。
  • 2 つの kustomization は、infraapps という名前で指定されます。 それぞれがリポジトリ内のパスに関連付けられています。
  • apps kustomization は infra kustomization に依存します。 (infra kustomization は apps kustomization の実行前に終了する必要があります。)
  • 両方の kustomization で prune=true を設定します。 この設定により、Flux によってクラスターにデプロイされたオブジェクトがリポジトリから削除されたり Flux の構成や kustomization が削除されたりした場合に、そのオブジェクトは確実にクリーンアップされます。
az k8s-configuration flux create -g flux-demo-rg \
-c flux-demo-arc \
-n cluster-config \
--namespace cluster-config \
-t connectedClusters \
--scope cluster \
-u https://github.com/Azure/gitops-flux2-kustomize-helm-mt \
--branch main  \
--kustomization name=infra path=./infrastructure prune=true \
--kustomization name=apps path=./apps/staging prune=true dependsOn=\["infra"\]

microsoft.flux 拡張機能はクラスターにインストールされます (以前の GitOps デプロイのためにまだインストールされていない場合)。

flux 構成が事前にインストールされている場合、調整がまだ進行中であるため、初期コンプライアンス状態は Pending または Non-compliant である可能性があります。 約 1 分後に、構成に対して再度クエリを実行し、最終的なコンプライアンスの状態を確認します。

az k8s-configuration flux show -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters

デプロイが成功したことを確認するには、次のコマンドを実行します。

az k8s-configuration flux show -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters

デプロイに成功すると、以下の名前空間が作成されます。

  • flux-system: Flux 拡張機能コントローラーを保持します。
  • cluster-config: Flux 構成オブジェクトを保持します。
  • nginxpodinforedis: Git リポジトリのマニフェストで説明されているワークロードの名前空間。

名前空間を確認するには、次のコマンドを実行します。

kubectl get namespaces

flux-system 名前空間には Flux 拡張オブジェクトが含まれています。

  • Azure Flux コントローラー: fluxconfig-agentfluxconfig-controller
  • OSS Flux コントローラー: source-controllerkustomize-controllerhelm-controllernotification-controller

Flux エージェントおよびコントローラー ポッドは実行中状態である必要があります。 次のコマンドを使ってこれを確認します。

kubectl get pods -n flux-system

NAME                                      READY   STATUS    RESTARTS   AGE
fluxconfig-agent-9554ffb65-jqm8g          2/2     Running   0          21m
fluxconfig-controller-9d99c54c8-nztg8     2/2     Running   0          21m
helm-controller-59cc74dbc5-77772          1/1     Running   0          21m
kustomize-controller-5fb7d7b9d5-cjdhx     1/1     Running   0          21m
notification-controller-7d45678bc-fvlvr   1/1     Running   0          21m
source-controller-df7dc97cd-4drh2         1/1     Running   0          21m

名前空間 cluster-config には Flux 構成オブジェクトがあります。

kubectl get crds

NAME                                                   CREATED AT
alerts.notification.toolkit.fluxcd.io                  2022-04-06T17:15:48Z
arccertificates.clusterconfig.azure.com                2022-03-28T21:45:19Z
azureclusteridentityrequests.clusterconfig.azure.com   2022-03-28T21:45:19Z
azureextensionidentities.clusterconfig.azure.com       2022-03-28T21:45:19Z
buckets.source.toolkit.fluxcd.io                       2022-04-06T17:15:48Z
connectedclusters.arc.azure.com                        2022-03-28T21:45:19Z
customlocationsettings.clusterconfig.azure.com         2022-03-28T21:45:19Z
extensionconfigs.clusterconfig.azure.com               2022-03-28T21:45:19Z
fluxconfigs.clusterconfig.azure.com                    2022-04-06T17:15:48Z
gitconfigs.clusterconfig.azure.com                     2022-03-28T21:45:19Z
gitrepositories.source.toolkit.fluxcd.io               2022-04-06T17:15:48Z
helmcharts.source.toolkit.fluxcd.io                    2022-04-06T17:15:48Z
helmreleases.helm.toolkit.fluxcd.io                    2022-04-06T17:15:48Z
helmrepositories.source.toolkit.fluxcd.io              2022-04-06T17:15:48Z
imagepolicies.image.toolkit.fluxcd.io                  2022-04-06T17:15:48Z
imagerepositories.image.toolkit.fluxcd.io              2022-04-06T17:15:48Z
imageupdateautomations.image.toolkit.fluxcd.io         2022-04-06T17:15:48Z
kustomizations.kustomize.toolkit.fluxcd.io             2022-04-06T17:15:48Z
providers.notification.toolkit.fluxcd.io               2022-04-06T17:15:48Z
receivers.notification.toolkit.fluxcd.io               2022-04-06T17:15:48Z
volumesnapshotclasses.snapshot.storage.k8s.io          2022-03-28T21:06:12Z
volumesnapshotcontents.snapshot.storage.k8s.io         2022-03-28T21:06:12Z
volumesnapshots.snapshot.storage.k8s.io                2022-03-28T21:06:12Z
websites.extensions.example.com                        2022-03-30T23:42:32Z

他の構成の詳細は、次のコマンドを使って確認します。

kubectl get fluxconfigs -A

NAMESPACE        NAME             SCOPE     URL                                                       PROVISION   AGE
cluster-config   cluster-config   cluster   https://github.com/Azure/gitops-flux2-kustomize-helm-mt   Succeeded   44m
kubectl get gitrepositories -A

NAMESPACE        NAME             URL                                                       READY   STATUS                                                            AGE
cluster-config   cluster-config   https://github.com/Azure/gitops-flux2-kustomize-helm-mt   True    Fetched revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf   45m
kubectl get helmreleases -A

NAMESPACE        NAME      READY   STATUS                             AGE
cluster-config   nginx     True    Release reconciliation succeeded   66m
cluster-config   podinfo   True    Release reconciliation succeeded   66m
cluster-config   redis     True    Release reconciliation succeeded   66m
kubectl get kustomizations -A


NAMESPACE        NAME                   READY   STATUS                                                            AGE
cluster-config   cluster-config-apps    True    Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf   65m
cluster-config   cluster-config-infra   True    Applied revision: main/4f1bdad4d0a54b939a5e3d52c51464f67e474fcf   65m

ワークロードは、Git リポジトリのマニフェストからデプロイされます。

kubectl get deploy -n nginx

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
nginx-ingress-controller                   1/1     1            1           67m
nginx-ingress-controller-default-backend   1/1     1            1           67m

kubectl get deploy -n podinfo

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
podinfo   1/1     1            1           68m

kubectl get all -n redis

NAME                 READY   STATUS    RESTARTS   AGE
pod/redis-master-0   1/1     Running   0          68m

NAME                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/redis-headless   ClusterIP   None          <none>        6379/TCP   68m
service/redis-master     ClusterIP   10.0.13.182   <none>        6379/TCP   68m

NAME                            READY   AGE
statefulset.apps/redis-master   1/1     68m

Flux クラスター拡張機能を使用してデプロイするコントローラーを制御する

シナリオによっては、Flux クラスター拡張機能と一緒にインストールされる Flux コントローラーを変更したい場合もあるでしょう。

sourcehelmkustomizenotification の Flux コントローラーが既定でインストールされます。 新しいコンテナー イメージが使用可能になったときに Git リポジトリを更新するために使用される image-automation および image-reflector コントローラー は、明示的に有効にする必要があります。

k8s-extension コマンドを使用して、既定のオプションを変更できます。

  • --config source-controller.enabled=<true/false> (既定値: true)
  • --config helm-controller.enabled=<true/false> (既定値: true)
  • --config kustomize-controller.enabled=<true/false> (既定値: true)
  • --config notification-controller.enabled=<true/false> (既定値: true)
  • --config image-automation-controller.enabled=<true/false> (既定値: false)
  • --config image-reflector-controller.enabled=<true/false> (既定値: false)

たとえば、通知を無効にするには、notification-controller.enabledfalse に設定します。

このコマンド例では、image-reflector コントローラーと image-automation コントローラーをインストールします。 Flux 構成を最初に作成したときに Flux 拡張機能が自動的に作成された場合、拡張機能名は flux になります。

az k8s-extension create -g <cluster_resource_group> -c <cluster_name> -t <connectedClusters or managedClusters or provisionedClusters> --name flux --extension-type microsoft.flux --config image-automation-controller.enabled=true image-reflector-controller.enabled=true

AKS クラスターの認証方法として Kubelet ID を使用する

AKS クラスターを使用する場合、使用する認証オプションの 1 つは kubelet ID です。 既定では、AKS はマネージド リソース グループに独自の kubelet ID を作成します。 必要に応じて、事前に作成された kubelet マネージド ID を使用できます。 そのためには、Flux 拡張機能のインストール時にパラメーター --config useKubeletIdentity=true を追加してください。

az k8s-extension create --resource-group <resource-group> --cluster-name <cluster-name> --cluster-type managedClusters --name flux --extension-type microsoft.flux --config useKubeletIdentity=true

Red Hat OpenShift のオンボード ガイダンス

Flux コントローラーでは、クラスターでポッドを適切にプロビジョニングするには 非ルートセキュリティ コンテキスト制約 が必要です。 これらの制約は、microsoft.flux拡張機能をオンボードする前にクラスターに追加する必要があります。

NS="flux-system"
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:kustomize-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:helm-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:source-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:notification-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:image-automation-controller
oc adm policy add-scc-to-user nonroot system:serviceaccount:$NS:image-reflector-controller

Flux のオンボードに関する OpenShift ガイダンスの詳細については、Flux のドキュメントを参照してください。

パラメーターを操作する

Flux は、さまざまなシナリオを実現する多くのパラメーターをサポートしています。 Flux でサポートされるすべてのパラメーターの説明については、Flux 公式ドキュメントを参照してください。 Azure の Flux では、まだすべてのパラメーターをサポートしているわけではありません。 必要なパラメーターが Azure の実装にない場合はお知らせください。

使用できるパラメーターとその使用方法の詳細については、「AKS および Azure Arc 対応 Kubernetes を使用した GitOps Flux v2 構成」を参照してください。

Flux Kustomize コントローラーを使用してクラスター構成を管理する

Flux Kustomize コントローラーは、microsoft.flux クラスター拡張機能の一部としてインストールされます。 これにより、Git リポジトリから同期される Kubernetes マニフェストを使用して、クラスター構成とアプリケーションのデプロイの宣言型管理を行うことができます。 これらの Kubernetes マニフェストには、必要に応じて kustomize.yaml ファイルを含めることができます。

使用法の詳細については、以降をご覧ください。

Flux Helm コントローラーを使用して、Helm チャートのリリースを管理する

Flux Helm コントローラーは、microsoft.flux クラスター拡張機能の一部としてインストールされます。 これにより、Git リポジトリで保持する Kubernetes マニフェストを使用して、Helm チャートのリリースを宣言によって管理できます。

使用法の詳細については、以降をご覧ください。

ヒント

Helm のインデックス ファイル処理の仕様上、Helm チャートの処理は負荷の大きい操作であり、メモリ占有領域が非常に大きくなる場合があります。 その結果、一度に多数の Helm chart を調整すると、メモリ スパイクと OOMKilled エラーが発生する可能性があります。 既定では、コントローラーによってそのメモリの上限は 1Gi に、またメモリ要求は 64Mi に設定されます。 調整する Helm チャートが大量にあるために、上限および要求を引き上げるには、microsoft.flux 拡張機能のインストール後に次のコマンドを実行してください。

az k8s-extension update -g <resource-group> -c <cluster-name> -n flux -t connectedClusters --config source-controller.resources.limits.memory=2Gi source-controller.resources.requests.memory=300Mi

Helm チャートに GitRepository ソースを使用する

fluxConfigurations リソースの一部として構成した GitRepository ソースに、Helm チャートが格納されている場合は、次の例のように HelmRelease の .yaml ファイルに clusterconfig.azure.com/use-managed-source: "true" を追加することで、Helm チャートのソースとして構成されたソースを使用する必要があることを指示できます。

---
apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: somename
  namespace: somenamespace
  annotations:
    clusterconfig.azure.com/use-managed-source: "true"
spec:
  ...

この注釈を使用すると、構成されたソースへの参照を使用して、デプロイされた HelmRelease にパッチが適用されます。 現時点では、GitRepository ソースのみがサポートされています。

Flux の構成と拡張機能を削除する

次のコマンドを使って、Flux の構成と、必要に応じて Flux 拡張機能自体を削除します。

Flux 構成を削除する

次のコマンドを実行すると、Azure 内の fluxConfigurations リソースとクラスター内の Flux 構成オブジェクトの両方が削除されます。 Flux 構成はもともと kustomization の prune=true パラメーターを使用して作成されたため、Flux 構成が削除されると、Git リポジトリのマニフェストに基づいてクラスター内に作成されたオブジェクトはすべて削除されます。 ただし、このコマンドを実行しても Flux 拡張機能自体は削除されません。

az k8s-configuration flux delete -g flux-demo-rg -c flux-demo-arc -n cluster-config -t connectedClusters --yes

Flux クラスター拡張機能を削除する

Flux 拡張機能を削除すると、Azure 内の microsoft.flux 拡張機能リソースとクラスター内の Flux 拡張機能オブジェクトの両方が削除されます。

Flux 構成を最初に作成したときに Flux 拡張機能が自動的に作成された場合、拡張機能名は flux になります。

az k8s-extension delete -g flux-demo-rg -c flux-demo-arc -n flux -t connectedClusters --yes

ヒント

これらのコマンドで使用する -t connectedClusters は、Azure Arc 対応 Kubernetes クラスターに適しています。 AKS クラスターの場合は、-t managedClusters を代わりに使用します。 Azure からプロビジョニングされた AKS ハイブリッド クラスターの場合は、-t provisionedClusters を使用します。