Azure Kubernetes Service(AKS)を使って、K8sクラスタを作成する

# 概要
- Azure Kubernetes Service(AKS)を使って、K8sクラスタを作成する
- ~~ACR上のコンテナイメージを、AKS上のK8sクラスタからpullして動かす~~ 今回はやらない。
- AppId(Appアイディー)をAppldと打ち間違えないよう注意する
- 使用できるKubernetesのバージョンを確認してから構築する
- 作り直した時は、認証情報も忘れずに設定(上書き)する

# 課金が発生する
- 稼働中は課金が発生する。必要に応じて作成/削除すること。


# 参考書籍
- [しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
](https://www.shoeisha.co.jp/book/detail/9784798157849) 阿佐志保 著
    - 2.4 Azureを使ったKubernetesクラスター作成
        - 説明が分かりやすいので、迷ったら上記を読み返す。

# AKSクラスタの構築

## ACRとAKSの連携

- ACRとAKS間で認証を行う
- サービスプリンシパル＝Azureのリソースを操作するアプリケーションのためのID(?)

- ACRのリソースIDを環境変数に入れる
    - ```ACR_ID=$(az acr show --name $ACR_NAME --query id --output tsv)```
- サービスプリンシパル名を環境変数に入れる
    - ```SP_NAME=sample-acr-service-principal```

- ACRのリソースIDに「Reader」(表示のみ)の権限を付与する
    - (ACRを消さなければ、一度だけやればよい?)
    - ```SP_PASSWD=$(az ad sp create-for-rbac --name $SP_NAME --role Reader --scopes $ACR_ID --query password --output tsv)```

- 作成したサービスプリンシパルのIDを環境変数に入れる
    - ```APP_ID=$(az ad sp show --id http://$SP_NAME --query appId --output tsv)```


## クラスタの作成

- クラスタ名をつける。サンプル通り「AKSCluster」にする。
    - ```AKS_CLUSTER_NAME=AKSCluster```
- クラスタを作成するAzureのリソースグループ名をつける
    - ```AKS_RES_GROUP=$AKS_CLUSTER_NAME```
- リソースグループを作成する
    - ```az group create --resource-group $AKS_RES_GROUP --location japaneast```

- 使用できるKubernetesのバージョンを確認する
    - ```az aks get-versions -l eastus -o table```
    - 使えないバージョンを指定すると、```The value of parameter orchestratorProfile.OrchestratorVersion is invalid.``` とエラーが出る。
    - 2019-04-27現在、Azureで使えるのは以下のバージョン。

```
KubernetesVersion    Upgrades
-------------------  ------------------------
1.13.5               None available
1.12.7               1.13.5
1.12.6               1.12.7, 1.13.5
1.11.9               1.12.6, 1.12.7
1.11.8               1.11.9, 1.12.6, 1.12.7
1.10.13              1.11.8, 1.11.9
1.10.12              1.10.13, 1.11.8, 1.11.9
1.9.11               1.10.12, 1.10.13
1.9.10               1.9.11, 1.10.12, 1.10.13
```


- クラスタを作成する
    - ノード3つ、サイズはStandard_DS1_v2
    - Kubernetesのバージョンは1.11.9を使用
    - 「- Running ..」のまま、構築に7分かかった
 
```
az aks create \
--name $AKS_CLUSTER_NAME \
--resource-group $AKS_RES_GROUP \
--node-count 3 \
--kubernetes-version 1.11.9 \
--node-vm-size Standard_DS1_v2 \
--generate-ssh-keys \
--service-principal $APP_ID \
--client-secret $SP_PASSWD
```

- Azureポータルから「すべてのリソース」－「AKSCluster」で「状態」欄が「Creating」から「Succeeded」になればOK。


## クラスタに接続するための認証情報を設定する
- ```.kube```ディレクトリに接続情報を入れる
    - ```az aks get-credentials --admin --resource-group $AKS_RES_GROUP --name $AKS_CLUSTER_NAME```
        - Kindle版の書籍では、「admin」が「adomin」になっているので注意。

# kubectlでクラスタを操作する

- kubectlの構文は、```kubectl [コマンド] [タイプ] [名前] [フラグ]```
    - [コマンド]は、get/create/apply/deleteなど。logsやdescribeもある。
    - [タイプ]は、リソースのタイプ。pod, deploymentなど。
    - [名前]は、リソースの識別子。大文字と小文字の区別がある。
    - [フラグ]は、-o tsvや-o wideなど。
- 例：クラスタ情報の表示は、```kubectl cluster-info```
- 例：ノード一覧は、```kubectl get node```
- 以下を設定すると、タブ補間できるようになる。

```
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
```

# helm(パッケージマネージャ)を入れる
## helmのインストール
- Ubuntu側にhelmを入れる
    - ~~```sudo snap install helm --classic```~~ ではWSLに入らない
    - ```wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-arm64.tar.gz```
    - ```tar zxvf helm-v2.13.1-linux-arm64.tar.gz```
    - ```sudo cp linux-arm64/helm /usr/local/bin/```
    - ```helm repo update```
    - ```helm version```

## 稼働中のKubernetesクラスターにtillerを入れる
- ```kubectl create serviceaccount --namespace kube-system tiller```
- ```kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller```


## helmの初期化

- helmの初期化(kubernetesクラスタにTillerが入るので、クラスタに接続するための認証情報を設定しておく必要がある)
    - ```kubectl cluster-info```
        - ```Unable to connect to the server:```や```no such host```になったら、接続情報が無いor古いので、上述のやり方で接続情報を設定する
    - ```mkdir ~/helm-wrk```
    - ```cd ~/helm-wrk```
    - ```helm init --service-account tiller```

- helm Tillerが動くか確認
    - Tillerは、Kubernetesクラスタ側に入れるデプロイ用のコンポーネント
    - ```kubectl -n kube-system get pod | grep tiller```
        - ```tiller-deploy-1234567890-abcde          1/1     Running``` のような表示が出ればOK。

- helmのがクライアントにもサーバにも入っている事の確認
    - ```helm version```
    - 下記のように、ClientもServerもバージョン番号が出ればOK。

```
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
```

## helmを使ったインストールとアンインストール

- パッケージのことを「リリース」と呼ぶ
- 基本操作
    - ```helm install helloworld```でインストール
    - ```helm list```でインストール済みパッケージのリストを表示
    - ```helm delete --purge cert-manager-v0.6.6```のように```--purge```を付けると、付随する設定やデータも一緒に消せる



# レジストリ、AKSクラスタの削除
- 課金が気になるので、使い終わったら削除する

## AKSクラスタの削除

- ```az aks delete --resource-group $AKS_RES_GROUP --name $AKS_CLUSTER_NAME```
    - 環境変数未設定の場合、```az aks delete --resource-group AKSCluster --name AKSCluster``` で直書きで消す


## レジストリの削除

- 下記で消えないので、Azureポータルから削除。
- Kindle版の書籍では、```$AKS_RES_GROUP```が```$AKS_RESOURCE_GROUP```になっているので注意。
    - ```az group list```
    - ```az group delete -name $ACR_RES_GROUP```
    - ```az group delete -name $AKS_RESOURCE_GROUP```
    - ```az ad sp delete --id=$(az ad sp show --id http://$SP_NAME --query appId --output tsv)```


# 感想メモ
- 何をしているのか理解せずにコピペしている状態なので、コマンドリファレンスぐらい見る
- 削除や変更前にlistで現状を確認した方がよい
- コンテナレジストリ名とコンテナレジストリ用のグループ名は区別できるように少し名前を変えた方がいいかも。

# 次
次は、[Azure Kubernetes Service(AKS)にLet's EncryptのSSL証明書を入れる](https://qiita.com/jansnap/items/282b5c9f799f76c3bcff)。