Azure Kubernetes ServiceのPod上でkubectlコマンドをマネージドID認証して実行

AKSでもマネージドIDが使えるようになったことで、KubernetesのPodから定期ジョブなどでkubectlを実行したい時にAzure CLIで認証できるようになりました。

前提

以下の記事でも書いたように、AKSに紐付いたマネージドIDに適切な権限が付いていることが前提になります。

yomon.hatenablog.com

コンテナイメージをビルド

ENTRYPOINTのスクリプト

マネージドIDで認証をAzure CLIで取得して、kubectlを実行するスクリプトを entrypoint.sh とう名前で作ります。

AKSの情報は環境変数から取得します。

#!/bin/sh
AZ_RG=${RESOURCE_GROUP}
AZ_CLUSTER=${CLUSTER_NAME}

az login --identity
az aks get-credentials -g ${AZ_RG} -n ${AZ_CLUSTER} > /dev/null

kubectl get pods -n kube-system

イメージのビルド

以下のAzure CLIのイメージをベースにしてイメージをビルドします。

https://hub.docker.com/r/microsoft/azure-cli

kubectlをインストールして、先程のスクリプトをENTRYPOINTに設定しておきます。

FROM microsoft/azure-cli

RUN az aks install-cli

COPY ./entrypoint.sh /

ENTRYPOINT [ "/entrypoint.sh" ]

ACRにイメージをビルド

イメージをACRにビルドします。

az acr build --registry ${ACR_NAME} --image get-pod ./path/to/manifest

Kubernetesデプロイ

定義作成

環境変数でパラメータを渡すために環境変数に RESOURCE_GROUPCLUSTER_NAME を設定します。

ACRの名前も自身の環境のものに調整してください。

apiVersion: batch/v1
kind: Job
metadata:
  name: get-pod
spec:
  backoffLimit: 0
  completions: 1
  parallelism: 1
  template:
    spec:
      containers:
        - name: get-pod
          image: youracr.azurecr.io/get-pod
          env:
            - name: RESOURCE_GROUP
              value: your_resource_group_name
            - name: CLUSTER_NAME
              value: your_aks_cluster_name
      restartPolicy: Never

Podデプロイ

ローカルのkubectlでデプロイします。

$ kubectl apply -f ./path/to/job.yml

ローカルからAKSのpodの情報を取得して確認します。

$ kubectl get po 
NAME            READY   STATUS      RESTARTS   AGE
get-pod-242dx   0/1     Completed   0          10s

ログを確認すると、Pod内部でkubectlが叩けて、kube-systemのPod一覧が取得できていることが確認できます。

また、その前に打った az login コマンドの結果からMSIが使われていることがわかります。

$ kubectl logs -f get-pod-n4srf

# --- 省略 ---

    "user": {
      "assignedIdentityInfo": "MSI",
      "name": "systemAssignedIdentity",
      "type": "servicePrincipal"
    }
  }
]
NAME                                    READY   STATUS    RESTARTS   AGE
coredns-57bcc6456b-gls87                1/1     Running   0          10h
coredns-57bcc6456b-mclbw                1/1     Running   0          10h
coredns-autoscaler-79b778686c-59lw5     1/1     Running   0          10h
kube-proxy-4d2cg                        1/1     Running   0          5h16m
kubernetes-dashboard-74d8c675bc-m7bvn   1/1     Running   0          10h
metrics-server-69df9f75bf-47khn         1/1     Running   0          10h
omsagent-kg6mp                          1/1     Running   0          5h16m
omsagent-rs-6b8f66f7db-lrnbm            1/1     Running   0          5h16m
tunnelfront-64bb48dc47-c5vqb            1/1     Running   0          10h