Azure Kubernetes Serviceでカンタンk8s環境構築

# はじめに
Kubernetes魅力的です！
AzureにおけるKubernetesプラットフォームであるAzure Kubernetes Service（以下、AKS）を触ってみたので以下にまとめます。

# Kubernetesとは
- コンテナ化されたアプリケーションのデプロイメント、スケーリング、および管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。以下、k8sと記載します。
- クラウドではサーバ機器や回線など物理的な要素が抽象化されていますが、kubernetesでは負荷分散やIaaSとしてのサーバ、ルーティングテーブルなどのコンポーネントが抽象化されています（ServiceやNode、Podなど）。
- AKSの裏ではAzure Load Balancer、仮想マシンスケールセット（VMSS）、OSのiptablesなどのコンポーネントが組み合わさってk8sの機能が実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/79035826-00fc-d3db-1289-80130522c66f.png)

# AKSとは
AKSはフルマネージドKubernetesサービスです。AKSは、Kubernetesクラスタのデプロイ、管理、スケーリングを簡素化することを目的としています。以下に、AKSの主な特徴をまとめます。
## 主な特徴
### マネージドサービス
AKSはフルマネージドサービスであり、AzureがKubernetesクラスタの管理、監視、保守を行います。これには、Kubernetesのアップグレード、パッチ適用、バックアップが含まれています。
### 簡単なデプロイ
簡単なコマンドやAzureポータルを使用して、数分でKubernetesクラスタをデプロイできます。複雑なインフラストラクチャの設定が不要です。
### スケーリング
AKSは自動スケーリング機能を提供しており、負荷に応じてクラスタのノード数を自動的に増減できます。これにより、リソースの効率的な利用が可能になります。ちなみに、裏ではVMSSの機能が使われています。
### 統合されたAzureサービス
Azure DevOps、Azure Monitor、Azure Policyなど、他のAzureサービスとシームレスに統合されています。これにより、CI/CDパイプラインの構築や、モニタリング、セキュリティポリシーの適用が容易になります。
### 高可用性とリソース分離
AKSは、複数の可用性ゾーンにわたるクラスタのデプロイをサポートしており、高可用性を確保します。また、ノードプール機能により、異なるタイプのVMを混在させて使用できます。


# AKS環境セットアップ
### AzureCLIのインストール
```
az login

az provider register -n Microsoft.Network

az provider register -n Microsoft.Compute

az provider register -n Microsoft.Storage

az provider register -n Microsoft.ContainerService

```
参考

https://aka.ms/installazurecliwindows



### kubectlコマンドのインストール
eksctlのインストール(chocolately)
```
choco install -y kubernetes-cli
```
### バージョンの確認
```
kubectl version --client
```
参考

https://kubernetes.io/ja/docs/tasks/tools/install-kubectl/

https://qiita.com/h-r-k-matsumoto/items/68f694650029ddf7351d


### Azure Container Registry

Azure上のコンテナレジストリサービスです（Docker Hubのようなもの）。

ACRを作成
```
az acr create --resource-group $ACR_RES_GROUP --name $ACR_NAME --sku Standard --location japaneast
```
イメージのビルド
```
az acr build —registry $ACR_NAME —image sample-image:v1.0 .
```
上記のイメージはkubernetesクラスタ上でpullすることで動かすことができます。

### サービスプリンシパルの設定
あるAzureリソースがまた別のAzureリソースに何らかの操作を行いたいとき「サービスプリンシパル」を作成してそのアカウント（のようなもの）に対して権限を付与します（閲覧者か共同作成者かなど）。

サービスプリンシパルの作成
```
az ad sp create-for-rbac —name sample-principal —role Reader —scope $SAMPLE_ACR_RESOURCE_ID
```
※リソースIDは以下のコマンドにて取得できる。
```
$SAMPLE_ACR_RESOURCE_ID=$(az acr show —name sample-acr —query id —output tsv)
```
サービスプリンシパル作成時のappIdとpasswordを控える（AKSにACRの参照権限を与えるときに使うため）。

なお、以下のようにするとそれぞれの値を変数に格納できる
```
$APP_ID=$(az ad sp list —display-name sample_principal —query ‘[].{ID.appId}’ —output tsv)
$SP_PWD=$(**az ad sp create-for-rbac —name sample-pricipal —role Reader —scope $SAMPLE_ACR_RESOURCE_ID **—query password —output tsv)
```

portal上でACRのIAMを見ると該当のサービスプリンシパルが作成されていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/1a0cdc3d-1205-1550-3670-8ec146e2a12b.png)

参考

https://blog.nextscape.net/archives/Date/2016/07/azure-ad-serviceprincipal

https://learn.microsoft.com/ja-jp/azure/aks/kubernetes-service-principal?tabs=azure-cli

### AKSクラスターの作成
```
az aks create —name $AKS_NAME —resource-group AZ-foo —node-count 3 —kubernetes-version 1.11.4 —node-vm-size Standard_DS1_v2 —generate-ssh-keys —service-principal $APP_ID —client-secret $SP_PWD
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/6b62b5d9-f0b0-5905-3765-fd2e55f1ead0.png)
K8sのVersion1.12以降でAzure VMSSがサポートされている。chatGPT曰くv1.12より前はVMの可用性セットを用いてAKSが構築されていたとのこと。
参考

https://kubernetes.io/blog/2018/10/08/support-for-azure-vmss-cluster-autoscaler-and-user-assigned-identity/

AKSを作成するとリソースグループが自動的に作成されます。VMSS、ネットワーク系、およびストレージがここに含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/818a6f67-7bb4-22e3-8f51-c1a8badd5ccc.png)

VMSSには—node-countで指定した数のインスタンスが作成される（今回は3つ）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/fd7c012b-78f2-3b3d-a379-5d508e7ba6ca.png)

### kubectlを実行してみる
クラスターで動くノード一覧を表示する
```
kubectl get node
```
-wオプションで定期的に実行します。なお、実行間隔はexponential backoffというアルゴリズムに基づいており、繰り返すごとに間隔が長くなっていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/6d4343af-99df-7278-a282-28b7f1b466b0.png)

ノード数の確認をするとAzure portalからVMSSを確認したときと同じコンピュータ名のノードが3つ確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475719/edf2b074-0af8-d95f-d968-817209795842.png)

# おわりに
皆様もよきAKSライフを！