【手動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」がインストールされていること。

## 事前準備

- ローカルの環境変数に以下を定義しておきます。
  - ACR_NAME=acr0ituru
  - ACR_RES_GROUP=rg_ituru_acr
  - SP_NAME=sp_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のレジストリ作成

ACRのレジストリを作成します。

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

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

---

## AKS と ACR の連携のためのサービスプリンシバルの定義

### ACR のリソースIDの取得

```
$ ACR_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
```

### サービスプリンシパルのクライアントIDとシークレットの取得

```
SP_PASSWD=$(az ad sp create-for-rbac --name $SP_NAME --role Reader --scopes $ACR_ID --query password --output tsv)
APP_ID=$(az ad sp list --display-name $SP_NAME --query '[].{ID:appId}' --output tsv)
```

---

## 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 \
  --service-principal $APP_ID \
  --client-secret $SP_PASSWD
```

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

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

```
$ az aks get-credentials --admin --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)