Young Leaves

Azure CLI でプライベートなAKS クラスターでkubectl やコマンドを実行する

プライベートなAKS クラスターを運用している時、kubectl やシェルスクリプトを実行したい時があります。Azure CLI ではaz aks コマンドを介し、プライベートクラスターにコマンドを実行できます。今回はAzure CLI を使いプライベートなAKS クラスターにkubectl やシェルスクリプトを実行する方法について説明します。

実施環境

Azure CLI

2.69.0

Kubernetes (AKS)

1.31.5

前提条件

  • Azure のアカウントおよびサブスクリプションを持っている
  • ローカルPC にAzure CLI がインストールされているまたはAzure CloudShell の実行環境があること

プライベートなAKS クラスターへのコマンド

AKS ではインターネットから直接接続できないプライベートなKubernetes クラスターを作成できます。プライベートなAKS クラスターはインターネットの通信を直接受け付けないため、インターネット経由で直接 kubectl やhelm のような管理コマンドを実行できません。プライベートなAKS クラスターにコマンドを実行するには以下のような方法があります。

  • Azure Portal やAzure CLI のaz aks command invoke コマンドを使う
  • プライベートなAKS クラスターに接続できる踏み台マシンやAzure Bastion のネイティブクライアント機能を使う
  • VPN やExpressRoute のような専用線を使う

企業で既に専用線を利用していればそのまま利用できますが、AKS の管理目的で利用するには料金がかかりすぎます。踏み台マシンやBastion はAKS 以外に用途があれば良いですが、単純に接続するには料金が気になります。トラブルシューティングのためにちょっとコマンドを実行したい、という時にAKS ではAzure Portal やAzure CLI を使ってプライベートクラスターにコマンドを実行できます。また、コマンドを介してマニフェストファイルの適用やシェルスクリプトの実行も可能です。これらの機能を使うことで、運用・管理のちょっとした対応を簡単に実施できます。

今回の構成

今回はプライベートなAKS クラスターを作成し、クラスターへ単体のコマンド、マニフェストファイルの適用、スクリプトを使った複数のコマンド実行を実施します。

AKS の作成

初めにAKS 用のリソースグループとプライベートなAKS クラスターを作成します。

# リソースグループを作成する
az group create --name rg-akscommandexe --location japaneast

# プライベートなAKSクラスターを作成する
az aks create \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --kubernetes-version 1.31.5 \
    --enable-private-cluster

AKS の資格情報を取得

AKS を作成後、AKS クラスターの資格情報を取得します。

# AKSの資格情報を取得する
az aks get-credentials --resource-group rg-akscommandexe --name aks-commandexe

Azure CLI 経由で単一のコマンドを実行

AKS クラスターの準備後、Azure CLI でプライベートなAKS クラスターにコマンドを実行します。単体のコマンドを実行する場合、--command オプションに実行したいコマンドを文字列として入力します。

# 単体のコマンドを実行する
az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl get nodes"

実行すると以下のようにノードの情報が表示されます。

kdkwakaba@TEST:~$ az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl get nodes"
command started at 2025-02-17 14:54:46+00:00, finished at 2025-02-17 14:54:46+00:00 with exitcode=0
NAME                                STATUS   ROLES    AGE   VERSION
aks-nodepool1-60733051-vmss000000   Ready    <none>   38m   v1.31.5
aks-nodepool1-60733051-vmss000001   Ready    <none>   38m   v1.31.5
aks-nodepool1-60733051-vmss000002   Ready    <none>   38m   v1.31.5

Azure CLI 経由でマニフェストファイルを適用

az aks command invoke コマンドではコマンドの実行だけでなくマニフェストファイルを使いKubernetes クラスターに設定を適用できます。マニフェストファイルを渡すには --file オプションでファイルを転送し実行します。今回はNginx Pod のDeployment を作成するマニフェストファイルを適用します。--file オプションで渡したファイルはRoot のファイルで渡されます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
# AKSクラスターにマニフェストファイルを適用する
az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl apply -f deployment.yaml" \
    --file ./deployment.yaml

実行後、Deployment が作成されたことを確認します。

kdkwakaba@TEST:~$ az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl apply -f deployment.yaml" \
    --file ./deployment.yaml
command started at 2025-02-17 15:03:26+00:00, finished at 2025-02-17 15:03:26+00:00 with exitcode=0
deployment.apps/nginx-deployment created

kdkwakaba@TEST:~$ az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl get deployment"
command started at 2025-02-17 15:05:57+00:00, finished at 2025-02-17 15:05:57+00:00 with exitcode=0
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   2/2     2            2           2m31s

Azure CLI 経由でシェルスクリプトを実行

プライベートなAKS クラスターに対し複数のコマンドを実行したい場合、シェルスクリプトを転送し実行することができます。今回は簡単なHelm コマンドをまとめたシェルスクリプトを転送して実行します。

#!/bin/bash

# Helmリポジトリを追加
helm repo add stable https://charts.helm.sh/stable
helm repo update

# 設定のインストール
helm install my-nginx stable/nginx-ingress
# シェルスクリプトを実行する
az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "sh ./install.sh" \
    --file install.sh

実行するとHelm コマンドが実行されます。今回は外部のネットワークに接続する手段を作成していないためヘルスチェックでエラーとなりますが、シェルスクリプトの実行は確認できます。

kdkwakaba@TEST:~$ az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "sh ./install.sh" \
    --file install.sh
command started at 2025-02-17 15:13:40+00:00, finished at 2025-02-17 15:13:53+00:00 with exitcode=0
"stable" has been added to your repositories
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
WARNING: This chart is deprecated
NAME: my-nginx
LAST DEPLOYED: Mon Feb 17 15:13:52 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*******************************************************************************************************
* DEPRECATED, please use https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx *
*******************************************************************************************************


The nginx-ingress controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w my-nginx-nginx-ingress-controller'

An example Ingress that makes use of the controller:

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    rules:
      - host: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

kdkwakaba@TEST:~$ az aks command invoke \
    --resource-group rg-akscommandexe \
    --name aks-commandexe \
    --command "kubectl get pods"
command started at 2025-02-17 15:21:34+00:00, finished at 2025-02-17 15:21:34+00:00 with exitcode=0
NAME                                                      READY   STATUS             RESTARTS      AGE
my-nginx-nginx-ingress-controller-7f6cfb64b4-r2d4q        0/1     CrashLoopBackOff   6 (27s ago)   7m41s
my-nginx-nginx-ingress-default-backend-598f74ff8f-f8zzs   1/1     Running            0             7m41s

Azure Portal からコマンドを実行

AKS クラスターへコマンド実行はAzure Portal から実行することもできます。対象のAKS クラスターを選択後、左ペインの Run command を選択し、実行するコマンドを実行します。

選択後、下の入力欄に実行したいコマンドを入力します。画像例では kubectl get nodes を入力しています。

コマンドを入力し実行すると実行結果が表示されます。

また、こういう用途をやりたいけどコマンドが不明瞭な場合は、実行したいことを入力欄に入れてCopilot のマークを実行するとCopilot で検索することができます。コマンドのオプションに悩んだときなどに利用すると便利です。

リソースのクリーンアップ

動作確認後、Azure リソースを削除します。

# リソースグループを削除する
az group delete --name rg-akscommandexe

まとめ

  • Azure CLI ではaz aks command invoke でプライベートなAKS クラスターにもkubectl やhelm コマンド、シェルスクリプトを実行できる
  • ちょっとしたコマンドであれば確認用のAzure リソースが不要となるため、Azure 利用料を削減できる

参考情報