AKS の運用をしていると、メンテナンス、トラブルシューティング目的でサーバーへ SSH したくなることがあります。今回の記事では、AKS Cluster Node へ SSH する方法を見ていきたいと思います。
SSH アクセス用の仮想マシンスケールセットを構成する
SSH アクセス用の仮想マシンスケールセットを構成するには、クラスターの仮想マシンスケールセットの名前を見つけ、そのスケールセットに SSH 公開キーを追加する必要があります。
まずは、az aks show
コマンドで AKS クラスターのリソースグループ名を取得したあと、az vmss list
コマンドでスケールセットの名前を取得します。
※どちらも Azure Portal から確認できるので、すでに把握できいる場合はその値をそのまま挿入します。
CLUSTER_RESOURCE_GROUP=$(az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv)
SCALE_SET_NAME=$(az vmss list --resource-group $CLUSTER_RESOURCE_GROUP --query [0].name -o tsv)
次に、SSH キーを仮想マシンスケールセット内のノードに追加します。以下二つのコマンドで完了します。尚、AKS ノードの規定のユーザー名は azureuser です。
az vmss extension set \
--resource-group $CLUSTER_RESOURCE_GROUP \
--vmss-name $SCALE_SET_NAME \
--name VMAccessForLinux \
--publisher Microsoft.OSTCExtensions \
--version 1.4 \
--protected-settings "{\"username\":\"azureuser\", \"ssh_key\":\"$(cat ~/.ssh/id_rsa.pub)\"}"
az vmss update-instances --instance-ids '*' \
--resource-group $CLUSTER_RESOURCE_GROUP \
--name $SCALE_SET_NAME
スケールセットを追加したあとに、Node の一覧を取得します。Cluster 上で起動している Node 一覧が取得できるので、トラブル対応したい Node の IP アドレスをメモしておきます。
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
aks-nodepool1-38358128-vmss000000 Ready agent 43m v1.13.12 10.240.0.4 <none> Ubuntu 16.04.6 LTS 4.15.0-1061-azure docker://3.0.7
aks-nodepool1-38358128-vmss000001 Ready agent 43m v1.13.12 10.240.0.5 <none> Ubuntu 16.04.6 LTS 4.15.0-1061-azure docker://3.0.7
aks-nodepool1-38358128-vmss000002 Ready agent 43m v1.13.12 10.240.0.6 <none> Ubuntu 16.04.6 LTS 4.15.0-1061-azure docker://3.0.7
SSH 接続を作成する
AKS ノードへの SSH 接続を作成するには、AKS クラスターでヘルパー Pod を実行します。ヘルパー Pod を実行することで、クラスターへの SSH アクセスが提供され、SSH ノードアクセスが提供されます。
kubectl run -it --rm aks-ssh --image=debian
ターミナルセッションがコンテナーに接続されるので、apt-get で SSH クライアントをインストールします。
apt-get update && apt-get install openssh-client -y
このコマンドが環境したら、kubectl get pods
してみます。SSH 用の Pods が作成されているのが分かります。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
aks-ssh-6fd7758688-l5fhr 1/1 Running 0 36m
SSH キーを Pods にコピーします。そのあとでコンテナーへのターミナルセッションに戻り、id_rsa SSH 秘密キーに対するアクセス許可を読み取り専用に更新します。
kubectl cp ~/.ssh/id_rsa aks-ssh-6fd7758688-l5fhr:/id_rsa (Azure CLI で実行)
chmod 0600 id_rsa (コンテナーターミナルセッションで実行)
ここまで出来たら SSH の準備は完了です。あとは ssh -i id_rsa azureuser@IPアドレス
を実施することで、トラブルシュートをしたい Node にアクセスすることが可能です。
参考
メンテナンスまたはトラブルシューティングのために SSH を使用して Azure Kubernetes Service (AKS) クラスター ノードに接続する
https://docs.microsoft.com/ja-jp/azure/aks/ssh#create-the-ssh-connection