AKS を使いこなす : チュートリアルの深堀り - AKS クラスターのデプロイ

今回は[チュートリアル:Azure Kubernetes Service (AKS) クラスターのデプロイ](https://docs.microsoft.com/ja-jp/azure/aks/tutorial-kubernetes-deploy-cluster)の深堀をしていきます。

このチュートリアルでようやく AKS を作成します。また深堀では作成したクラスタの詳細を見ることで k8s の操作についても触れていきます。

# kubectl

kubectl は k8s を操作する CLI ツールであり、今後のチュートリアルのメインとなるツールです。

# Azure AD サービスプリンシパル

AKS クラスターが他の Azure リソースと対話できるようにするために、Azure AD (Active Directory) のサービスプリンシパル作成して使用します。サービスプリンシパルはアプリケーション専用のユーザーアカウントのようなもので、各種権限の設定が柔軟に行えます。

前回作成した ACR に対するアクセスについてもサービスプリンシパルを使っています。

# チュートリアルの深堀
では実際にチュートリアルを見ていきましょう。

## サービスプリンシパルの作成

まず AKS で利用するサービスプリンシパルの作成と、ACR への権限付与を行います。

1\. ```az ad sp``` コマンドでサービスプリンシパル作成。

- RBAC (ロールベースアクセスコントロール) で使えるサービスプリンシパル作成
- 既定のロールはアサインしない

```shell
az ad sp create-for-rbac --skip-assignment
```
```shell
{
  "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "displayName": "azure-cli-2019-09-24-04-32-40",
  "name": "http://azure-cli-2019-09-24-04-32-40",
  "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
```
2\. ACR に権限を付与するため、まずは ACR のリソース名を取得。

```shell
az acr show --resource-group akstutorial --name kenakamuacr --query "id" --output tsv
```

3\. サービスプリンシパルに ACR の ```acrpull``` 権限を付与。

- appId: サービスプリンシパル作成の結果から確認
- acrId: 上記で取得したリソース名
- acrpull ロールをアサインすることで ACR よりイメージをプル可能

```shell
az role assignment create --assignee <appId> --scope <acrId> --role acrpull
```

## クラスタの作成

次に AKS クラスタを作成します。クラスタ作成から接続までは、以下の 3 コマンドで完了します。

- az aks create : AKS クラスタの作成
- az aks install-cli : kubectl のインストール
- az aks get-credentials : AKS クラスタへの認証

では早速クラスタを作っていきましょう。

1\. ```az aks create``` コマンドで AKS クラスタを作成。ここでは名前を myfirstaks, ノード数を 2 として作成。AKS クラスタの割り当てと VM の作成を行うため、数分～10分程度時間がかかる。

- appId/client-secret はサービスプリンシパル作成時の結果より取得
- 作成時、SSH キーがユーザーディレクトリの .ssh に作成される
- VM のサイズは既定の Standard_DS2_v2 (詳細は[こちら](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sizes-general#dsv2-series))

```shell
az aks create \
    --resource-group aksturotial \
    --name myfirstaks \
    --node-count 2 \
    --service-principal <appId> \
    --client-secret <password> \
    --generate-ssh-keys
```

2\. kubectl をインストール。

```shell
az aks install-cli
```

3\. 作成した AKS クラスタへの接続。

```shell
az aks get-credentials --resource-group akstutorial --name myfirstaks
```
4\. 接続ができているかノードを取得して確認。

```shell
kubectl get nodes
```
```shell
NAME                       STATUS   ROLES   AGE     VERSION
aks-nodepool1-34717040-0   Ready    agent   5m34s   v1.13.10
aks-nodepool1-34717040-1   Ready    agent   5m36s   v1.13.10
```

チュートリアルはここで終わりですが深堀として、ここから作成したクラスタを見ていきます。

# 作成したクラスタの詳細確認

## Azure ポータルから見た AKS クラスタ

AKS クラスタを作成すると、Azure ポータル上では 2 つのリソースグループが作成されます。MC から始まるリソースグループはノードをホストする仮想マシンが含まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6890c2a7-b453-1cbe-dc5a-14ac7c29ce78.png)

仮想マシンが含まれるリソースグループには、仮想マシンに必要なネットワークやディスクリソースの他、仮想ネットワークやルートテーブルが含まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2fe76e06-f210-be00-ba81-dd4c43c7e226.png)
仮想マシンは既定の Standard_DS2_v2 です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a870fb1c-7045-a6f1-3c89-158bfb348f40.png)
メインのリソースグループは AKS と ACR が含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/367910fe-999c-2348-0285-228a64686dab.png)

## k8s から見た AKS クラスタ

kubectl を使うと様々な情報を見ることができます。

### kubectl バージョン

```shell
> kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.6", GitCommit:"96fac5cd13a5dc064f7d9f4f23030a6aeface6cc", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:49Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.10", GitCommit:"37d169313237cb4ceb2cc4bef300f2ae3053c1a2", GitTreeState:"clean", BuildDate:"2019-08-19T10:44:49Z", GoVersion:"go1.11.13", Compiler:"gc", Platform:"linux/amd64"}
```

### クラスタの情報

1\. 現在のクラスタの情報を取得。

```shell
> kubectl cluster-info
Kubernetes master is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443
CoreDNS is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/kubernetes-dashboard/proxy
Metrics-server is running at https://myfirstaks-akstutorial-a20085-c733648e.hcp.japaneast.azmk8s.io:443/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
```

2\. 他にもクラスタがある場合はその情報も取得可能。

- * は現在操作対象となっているクラスタ

```shell
> kubectl config get-contexts
CURRENT   NAME          CLUSTER       AUTHINFO                                 NAMESPACE
          kenakamuaks   kenakamuaks   clusterAdmin_kenakamuaksrg_kenakamuaks
*         myfirstaks    myfirstaks    clusterUser_akstutorial_myfirstaks
```

3\. 変更する場合は set-context を使用。

### 名前空間

```shell
> kubectl get namespaces
NAME          STATUS   AGE
default       Active   98m
kube-public   Active   98m
kube-system   Active   98m
```

### ノードの情報を取得

1\. まずノード一覧を表示。

- ```-o wide```　で付加情報を表示

```shell
> kubectl get nodes -o wide
NAME                       STATUS   ROLES   AGE   VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-nodepool1-34717040-0   Ready    agent   81m   v1.13.10   10.240.0.5    <none>        Ubuntu 16.04.6 LTS   4.15.0-1055-azure   docker://3.0.6
aks-nodepool1-34717040-1   Ready    agent   81m   v1.13.10   10.240.0.4    <none>        Ubuntu 16.04.6 LTS   4.15.0-1055-azure   docker://3.0.6
```

2\. 次に特定ノードの詳細を確認。

- Labels で既定のラベルの値が確認 ※今後のチュートリアルでも beta.kubernetes.io/os が linux となっているノードを指定している場所がある
- Conditions で現在の状態が確認
- Capacity でノードの性能が確認
- Allocatable で割り当て可能なリソースを確認
- Non-terminated Pods では常時起動しているポッドとして kube-proxy が表示
- Allocated resouces で現在割り当て済のリソースを確認

```shell
> kubectl describe node aks-nodepool1-34717040-0
Name:               aks-nodepool1-34717040-0
Roles:              agent
Labels:             agentpool=nodepool1
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=Standard_DS2_v2
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=japaneast
                    failure-domain.beta.kubernetes.io/zone=0
                    kubernetes.azure.com/cluster=MC_akstutorial_myfirstaks_japaneast
                    kubernetes.azure.com/role=agent
                    kubernetes.io/hostname=aks-nodepool1-34717040-0
                    kubernetes.io/role=agent
                    node-role.kubernetes.io/agent=
                    storageprofile=managed
                    storagetier=Premium_LRS
Annotations:        node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Tue, 24 Sep 2019 13:49:56 +0900
Taints:             <none>
Unschedulable:      false
Conditions:
  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----                 ------  -----------------                 ------------------                ------                       -------
  NetworkUnavailable   False   Tue, 24 Sep 2019 13:51:15 +0900   Tue, 24 Sep 2019 13:51:15 +0900   RouteCreated                 RouteController created a route
  MemoryPressure       False   Tue, 24 Sep 2019 15:13:28 +0900   Tue, 24 Sep 2019 13:49:56 +0900   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure         False   Tue, 24 Sep 2019 15:13:28 +0900   Tue, 24 Sep 2019 13:49:56 +0900   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure          False   Tue, 24 Sep 2019 15:13:28 +0900   Tue, 24 Sep 2019 13:49:56 +0900   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready                True    Tue, 24 Sep 2019 15:13:28 +0900   Tue, 24 Sep 2019 13:49:56 +0900   KubeletReady                 kubelet is posting ready status. AppArmor enabled
Addresses:
  Hostname:    aks-nodepool1-34717040-0
  InternalIP:  10.240.0.5
Capacity:
 attachable-volumes-azure-disk:  8
 cpu:                            2
 ephemeral-storage:              101584140Ki
 hugepages-1Gi:                  0
 hugepages-2Mi:                  0
 memory:                         7113568Ki
 pods:                           110
Allocatable:
 attachable-volumes-azure-disk:  8
 cpu:                            1931m
 ephemeral-storage:              93619943269
 hugepages-1Gi:                  0
 hugepages-2Mi:                  0
 memory:                         4668256Ki
 pods:                           110
System Info:
 Machine ID:                 8bc992d3d0284015b50878d7143c5442
 System UUID:                CA607A86-F7C3-8B42-A382-F950DA89663E
 Boot ID:                    d0ea6613-7826-416d-ab31-093cd7011f9d
 Kernel Version:             4.15.0-1055-azure
 OS Image:                   Ubuntu 16.04.6 LTS
 Operating System:           linux
 Architecture:               amd64
 Container Runtime Version:  docker://3.0.6
 Kubelet Version:            v1.13.10
 Kube-Proxy Version:         v1.13.10
PodCIDR:                     10.244.1.0/24
ProviderID:                  azure:///subscriptions/a200855b-a4ab-491f-a769-1015fa35dee3/resourceGroups/MC_akstutorial_myfirstaks_japaneast/providers/Microsoft.Compute/virtualMachines/aks-nodepool1-34717040-0
Non-terminated Pods:         (1 in total)
  Namespace                  Name                CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                ------------  ----------  ---------------  -------------  ---
  kube-system                kube-proxy-wvpdp    100m (5%)     0 (0%)      0 (0%)           0 (0%)         83m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource                       Requests   Limits
  --------                       --------   ------
  cpu                            100m (5%)  0 (0%)
  memory                         0 (0%)     0 (0%)
  ephemeral-storage              0 (0%)     0 (0%)
  attachable-volumes-azure-disk  0          0
Events:                          <none>
```

### サービスの確認

```shell
> kubectl get services -o wide
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE    SELECTOR
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   116m   <none>
```

## k8s Web ダッシュボードからみたクラスタ

k8s は Web ダッシュボードでも確認できます。

1\. RBAC ベースのサービスプリンシパルで AKS を利用している場合、まずダッシュボードにアクセスするための権限を作成。

```shell
kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
```

2\. ```az aks browse``` でダッシュボードを起動。

```shell
az aks browse -g akstutorial -n myfirstaks
```
3\.　ブラウザが起動したら内容を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c0358388-c5ab-8d41-df00-9a776395966e.png)


# まとめ

AKS を使うと簡単に k8s クラスタが作成できることがわかりました。次回はアプリケーションを展開します。

[次の記事へ](https://qiita.com/kenakamu/items/cac80a548b0b43a270fa)
[目次に戻る](https://qiita.com/kenakamu/items/e155740aa60c85a3d867)

# 参考
[kubectl Cheat Sheet](https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-nodes-and-cluster)
[Azure Kubernetes Service (AKS) で Kubernetes Web ダッシュボードにアクセスする](https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-dashboard?view=azure-cli-latest)