パブリックプレビューの AKS GitOps を試してみた

## 背景と目的

自分の周辺で GitOps と言えば、ArgoCD だったりするのですが、AKS で Flux v2 を使った GitOps がマネージドで使えるようなので、実際に試してみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.1
BuildVersion:   21C52

$ az version
{
  "azure-cli": "2.30.0",
  "azure-cli-core": "2.30.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 検証用 AKS を用意します

```bash:bash
# 環境変数を設定します
region=japaneast
prefix=mnraksops

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# AKS を作成します
az aks create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-aks \
  --node-vm-size Standard_B2s \
  --node-count 1 \
  --generate-ssh-keys

# kubectl 用のクレデンシャルを取得します
az aks get-credentials \
  --resource-group ${prefix}-rg \
  --name ${prefix}-aks

# AKS の動作確認を行います
kubectl get node
kubectl run nginx --image=nginx
kubectl get pod nginx
kubectl delete pod nginx
```

## AKS で GitOps を使えるようにします

```bash:bash
# 拡張機能を登録します
az feature register \
  --namespace Microsoft.ContainerService \
  --name AKS-ExtensionManager

# 拡張機能を伝播します
az provider register \
  --namespace Microsoft.ContainerService

# Registerd になったか確認します（自分の環境だと 30 分くらいかかりました）
az feature list \
  --query "[?contains(name, 'Microsoft.ContainerService/AKS-ExtensionManager')].{Name:name,State:properties.state}" \
  --output table

# 他に必要なリソースプロバイダーが登録されているか念のため確認します
az provider show \
  --namespace Microsoft.Kubernetes \
  --output table
az provider show \
  --namespace Microsoft.ContainerService \
  --output table
az provider show \
  --namespace Microsoft.KubernetesConfiguration \
  --output table

# CLI 拡張機能を有効にします
az extension add \
  --name k8s-configuration
az extension add \
  --name k8s-extension

# CLI 拡張機能を確認します
az version

# AKS に GitOps の設定をインストールします
az k8s-configuration flux create \
  --resource-group ${prefix}-rg \
  --cluster-name ${prefix}-aks \
  --cluster-type managedClusters \
  --name gitops-demo \
  --namespace gitops-demo \
  --scope cluster \
  --url https://github.com/fluxcd/flux2-kustomize-helm-example \
  --branch main \
  --kustomization name=infra path=./infrastructure prune=true \
  --kustomization name=apps path=./apps/staging prune=true dependsOn=["infra"]

# GitOps の設定状態を確認します
az k8s-configuration flux show \
  --resource-group ${prefix}-rg \
  --cluster-name ${prefix}-aks \
  --cluster-type managedClusters \
  --name gitops-demo

# 動作確認を行います
kubectl get namespaces
kubectl get pods -n flux-system
kubectl get pods -n gitops-demo
kubectl get pods -n nginx
kubectl get pods -n podinfo
kubectl get pods -n redis
kubectl get crds
kubectl get fluxconfigs -A
kubectl get gitrepositories -A
kubectl get helmreleases -A
kubectl get kustomizations -A
kubectl get deploy -n nginx
kubectl get deploy -n podinfo
kubectl get all -n redis
```

## 参考

```bash:bash
# Flux構成を削除します
az k8s-configuration flux delete \
  --resource-group ${prefix}-rg \
  --cluster-name ${prefix}-aks \
  --cluster-type managedClusters \
  --name gitops-demo

# Fluxクラスター拡張機能を削除します
az k8s-extension delete \
  --resource-group ${prefix}-rg \
  --cluster-name ${prefix}-aks \
  --cluster-type managedClusters \
  --name flux

# リソースグループを削除します
az group delete \
  --name ${prefix}-rg
```

<https://azure.microsoft.com/ja-jp/updates/public-preview-azure-kubernetes-service-configuration-management-with-gitops/>

<https://docs.microsoft.com/ja-jp/azure/azure-arc/kubernetes/tutorial-use-gitops-flux2>

<https://docs.microsoft.com/en-us/cli/azure/k8s-configuration/flux?view=azure-cli-latest#az_k8s_configuration_flux_create>