背景と目的
Public preview of Azure Kubernetes Service (AKS) run-command feature によると、az コマンドで kubectl が実行できるとあり、プライベート AKS で試してみました。
前提条件
AzureCLI のバージョンを確認します。この時点では aks-preview エクステンションは有効になっていません。
zsh
az version
{
"azure-cli": "2.21.0",
"azure-cli-core": "2.21.0",
"azure-cli-telemetry": "1.0.6",
"extensions": {}
}
実施内容
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
# 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
参考
検証が終わったら後片付けをしましょう。
zsh
az group delete \
--name $azRG