AKS の command invoke をやってみた

## 背景と目的

[Public preview of Azure Kubernetes Service (AKS) run-command feature](https://azure.microsoft.com/pl-pl/updates/public-preview-of-azure-kubernetes-service-aks-runcommand-feature/) によると、az コマンドで kubectl が実行できるとあり、プライベート AKS で試してみました。

## 前提条件

AzureCLI のバージョンを確認します。この時点では aks-preview エクステンションは有効になっていません。

```zsh:zsh
az version

{
  "azure-cli": "2.21.0",
  "azure-cli-core": "2.21.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}
```

## 実施内容

```zsh:zsh
# 環境変数をセットします。
azRegion=japaneast
azRG=aksdevrg
azAksName=devtestaks

# リソースグループを作成します。
az group create \
  --location $azRegion \
  --name $azRG

# --node-resource-group を使用するため、aks-preview エクステンションを有効にします。
az extension add \
  --name aks-preview

# プライベート AKS を作成します。
az aks create \
  --name $azAksName \
  --resource-group $azRG \
  --node-resource-group ${azRG}-node \
  --node-vm-size Standard_B2s \
  --node-count 1 \
  --generate-ssh-keys \
  --enable-private-cluster

# kubectl を使うための認証情報を取得します。
az aks get-credentials \
  --name $azAksName \
  --resource-group $azRG

# エラーになるとわかっていますが、試しに AKS クラスターの認証情報を取得します。
kubectl config get-contexts

CURRENT   NAME             CLUSTER          AUTHINFO                          NAMESPACE
*         devtestaks       devtestaks       clusterUser_aksdevrg_devtestaks   
          docker-desktop   docker-desktop   docker-desktop                    

# AKS のノード情報を取得します。プライベート AKS なので VNET の外からは接続エラーとなります。
kubectl get nodes

Unable to connect to the server: dial tcp: lookup devtestaks-aksdevrg-bf5458-2c72445c.4948a687-7a9d-41a0-81e7-fb34109db694.privatelink.japaneast.azmk8s.io on 192.168.0.1:53: no such host

# AKS の認証情報は不要なので削除しておきます。
kubectl config delete-context devtestaks

# aks command invoke を使うための登録を行います。
az feature register \
  --namespace "Microsoft.ContainerService" \
  --name "RunCommandPreview"

# RunCommandPreview が登録されたことを確認します。
az feature list \
  --query "[?contains(name, 'Microsoft.ContainerService/RunCommandPreview')].{Name:name,State:properties.state}" \
  --output table

Name                                          State
--------------------------------------------  ----------
Microsoft.ContainerService/RunCommandPreview  Registered
```

## 実施結果

```zsh:zsh
# AKS のノード情報を取得します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl get nodes"

{
  "exitCode": 0,
  "finishedAt": "2021-04-10T11:37:02+00:00",
  "id": "dd7185ed1cb541e58871d282babd74ad",
  "logs": "NAME                                STATUS   ROLES   AGE     VERSION\naks-nodepool1-73361849-vmss000000   Ready    agent   7m28s   v1.18.14\n",
  "provisioningState": "Succeeded",
  "reason": null,
  "startedAt": "2021-04-10T11:37:01+00:00"
}

# kubectl を実行したかのように、AKS のノード情報を取得します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl get nodes" \
  --query logs \
  --output tsv

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-73361849-vmss000000   Ready    agent   8m50s   v1.18.14

# nginx のマニフェストを作成します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl run nginx --image=nginx --dry-run=client --output yaml" \
  --query logs \
  --output tsv > deployment.yaml

# nginx の Pod を作成します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl apply -f deployment.yaml" \
  --file deployment.yaml \
  --query logs \
  --output tsv

pod/nginx created

# nginx の Pod の情報を取得します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl get pod nginx" \
  --file deployment.yaml \
  --query logs \
  --output tsv

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          99s

# nginx の Pod に入ってみますが、流石に無理なようです。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl exec -it nginx -- bash" \
  --query logs \
  --output tsv

Unable to use a TTY - input is not a terminal or the right kind of file

# nginx の Pod のホスト名を取得します。
az aks command invoke \
  --name $azAksName \
  --resource-group $azRG \
  --command "kubectl exec nginx -- hostname" \
  --query logs \
  --output tsv

nginx
```

## 参考

[az aks command](https://docs.microsoft.com/ja-jp/cli/azure/aks/command?view=azure-cli-latest)

検証が終わったら後片付けをしましょう。

```zsh:zsh
az group delete \
  --name $azRG
```