チュートリアル: 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 Arc 対応 Kubernetes に接続されたクラスター。
Kubernetes クラスターを Azure Arc に接続する方法を確認します。送信プロキシ経由で接続する必要がある場合は、プロキシ設定を使用して Arc エージェントをインストールするようにします。
Microsoft.Kubernetes/connectedClusters
リソースの種類に対する読み取りおよび書き込みアクセス許可。
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 は、
infra
とapps
という名前で指定されます。 それぞれがリポジトリ内のパスに関連付けられています。 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 構成オブジェクトを保持します。nginx
、podinfo
、redis
: Git リポジトリのマニフェストで説明されているワークロードの名前空間。
名前空間を確認するには、次のコマンドを実行します。
kubectl get namespaces
flux-system
名前空間には Flux 拡張オブジェクトが含まれています。
- Azure Flux コントローラー:
fluxconfig-agent
、fluxconfig-controller
- OSS Flux コントローラー:
source-controller
、kustomize-controller
、helm-controller
、notification-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 コントローラーを変更したい場合もあるでしょう。
source
、helm
、kustomize
、notification
の 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.enabled
をfalse
に設定します。
このコマンド例では、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
を使用します。