【自動SP】 Azure CLI を使用して Azure Kubernetes Service (AKS) と Azure Container Registry (ACR) をデプロイし連携させる


# サービスプリンシパルを自動的に作成して使用する方法

[この記事](https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-service-principal?tabs=azure-cli) をベースにデプロイしています。（ほぼそのまま記載部分あり）

## ローカル環境

macOS Big Sur 11.3 
python 3.8.3

## 前提条件

1. Azure環境がすでに用意されていること（テナント/サブスクリプション）。
2. ローカル環境に「azure cli」がインストールされていること。
3. このシナリオでは、Azure CLI によって、AKS クラスター用のサービスプリンシパルが自動的に作成されます。 この操作を正しく完了するためには、Azureアカウントが、サービスプリンシパルを作成するための適切な権限を持っている必要があります。

## 事前準備

- ローカルの環境変数に以下を定義しておきます。
  - ACR_NAME=acr0ituru
  - ACR_RES_GROUP=rg_ituru_acr
  - AKS_CLUSTER_NAME=ituruAKSCluster
  - AKS_RES_GROUP=rg_ituru_aks_cp

---

## Azure にログイン

### azure cli バージョンの確認

```
$ az version                    

{
  "azure-cli": "2.26.1",
  "azure-cli-core": "2.26.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "azure-iot": "0.10.13"
  }
}
```

### 使用するテナントのAzure環境へのログイン

```
$ az login --tenant <tenant_id>
```

### 使用サブスクリプションを定義します

```
$ az account set --subscription '<サブスクリプション名>'
```

---

## Azure Container Registry

### ACR リソースグループの作成

```
$ az group create --resource-group $ACR_RES_GROUP --location japaneast
```

### ACRのレジストリ作成

```
$ az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast
```

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。loginServerが、"acr0ituru.azurecr.io"（指定したACR名）になっていることを確認します。

---

## Azure Kubernetes Service

### AKS リソースグループの作成

```
$ az group create --name $AKS_RES_GROUP --location japaneast
```

### クラスターの監視を有効にする

Microsoft.OperationsManagement と Microsoft.OperationalInsights がサブスクリプションで登録されていることを確認します。

```
$ az provider show -n Microsoft.OperationsManagement -o table
$ az provider show -n Microsoft.OperationalInsights -o table
```

登録されていない場合は、次を使用して、Microsoft.OperationsManagement と Microsoft.OperationalInsights を登録します。

```
$ az provider register --namespace Microsoft.OperationsManagement
$ az provider register --namespace Microsoft.OperationalInsights
```

### AKS クラスターの作成

クラスターを 3 つのノードで作成します。ACRとAKS連携のためのパラーメータも定義します。

```
$ az aks create \
  --name $AKS_CLUSTER_NAME \
  --resource-group $AKS_RES_GROUP \
  --node-count 3 \
  --enable-addons monitoring \
  --node-vm-size Standard_DS2_v2 \
  --generate-ssh-keys \
  --attach-acr $ACR_NAME
```

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

### Kubernetesクラスタ接続のための認証情報の取得

```
$ az aks get-credentials --resource-group $AKS_RES_GROUP --name $AKS_CLUSTER_NAME
```

.kube/configファイルに接続情報を書き込むことで、ローカルからクラスタ操作できるようになります。

---

## kubectlコマンドを使ったクラスターの操作
ローカルから、kubectlコマンド実行してみる

### kubectl をローカルにインストールします

```
$ az aks install-cli            
```

### 接続先クラスターの確認

```
$ kubectl config view
```

### クラスターの情報確認

```
$ kubectl cluster-info
```

### クラスター上で動く Node の確認

```
$ kubectl get node
```

-o=wideをつけると、Nodeの追加情報表示（IPやOSバージョン等）

```
$ kubectl get node -o=wide
```

３台のNodeのうち、1台目の詳細確認

```
$ kubectl describe node $(kubectl get node -o=jsonpath='{.items[0].metadata.name}')
```

### ヘルプ

```
$ kubectl help
```

---

## ACR および AKS の操作

### イメージを ACR にインポートする

```
$ az acr import  -n $ACR_NAME --source docker.io/library/nginx:latest --image nginx:v1
```

### ACR から AKS にサンプルイメージをデプロイする

デプロイするマニフェスト

```acr-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx0-deployment
  labels:
    app: nginx0-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx0
  template:
    metadata:
      labels:
        app: nginx0
    spec:
      containers:
      - name: nginx
        image: acr0ituru.azurecr.io/nginx:v1
        ports:
        - containerPort: 80
```

デプロイの実施

```
$ kubectl apply -f acr-nginx.yaml
```

Podの確認

```
$ kubectl get pods
```

---

## 番外編：課金回避のためのリソースグループの削除

リソースグループ、コンテナーサービス、およびすべての関連リソースを削除します。

```
az group delete --name $AKS_RES_GROUP --yes --no-wait
az group delete --name $ACR_RES_GROUP --yes --no-wait
```

---

## 参考情報

以下の情報を参考にさせていただきました。感謝申し上げます。
[az ad sp create-for-rbac は何をやっているのか](https://qiita.com/tomohat/items/48779dd7c7e393a692ed)
[Azure AD のサービスプリンシパルを 3 つのユースケースから眺めてみた](https://qiita.com/watahani/items/1f3f533097b7a15d6698)