Azure Arc enabled KubernetesとMonitoringの有効化

# はじめに

## Azure Arc enabled Kubernetesとは

Kubernetesのクラスターといっても、AKSではなく、オンプレでたてたモノやGCP, AWSで稼働するものが色々あります。
それをAzureに接続してAKSと似た感覚で使用できるようにするのが、Azure arc enabled Kubernetesです。
すみません。知ってるっぽい雰囲気で書きましたが最近知ったばかりで実はよく知りません。

https://docs.microsoft.com/en-us/azure/azure-arc/kubernetes/conceptual-agent-architecture

このサイトにはとても分かりやすい図がはいっていますが、Azure Arc enabled Kubernetes agentをクラスター内にインストールして、それがAzureと繋がる、というものとなります。

## Monitoringの有効化とは

AKSで稼働しているなら、Azure MonitorのContainer insightsにより動作を監視したりとか、アラートを飛ばす設定をしたり色々とできるかと思います。
Azure Arc enabled Kubernetesの設定をしたクラスターにすこし設定をしてあげると、たとえオンプレでも他のクラウドサービスで稼働していても、Azure Portalから同様のことができるようになります。

https://docs.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-overview

# 各種手順

ここでは、試しにインストールした時のメモを残しておきます。

## 1.事前準備

すこし手間取ったところも入っているので、細かいところは気にしないで、不要な場合は読み飛ばしてください。

今回試しにAzure Arc enabled Kubernetesの対象としたのは、Windows 10 Proで稼働するMinikubeとなります。
そのPCにはMinikubeがインストールされていなかったので、そこから書きます。
さらに、後述されるインストール用スクリプトに関連することとしてChocolatyやAzure CLIの最新版インストールに進行が阻まれたので、それも記載します。

### 2. Chocolatyのインストール

Chocolatyは後続の手順のMinikube、Helmのインストールで使用します。

https://chocolatey.org/ → このサイトのインストール手順に従います。

### 3. Minikubeのインストール

テスト用のクラスターをWindowsの中で動かすためにしようします。

https://v1-18.docs.kubernetes.io/docs/tasks/tools/install-minikube/ → このサイトのインストール手順に従います。

### 4. Helmのインストール

HelmはKubernetesで稼働するPODのインストールをお手伝いする便利なツールです。
後続の手順に出てくる、Monitoringの有効化の手順で、インストーラーのスクリプトが内部でこれを使用します。

https://helm.sh/docs/intro/install/ → このサイトのインストール手順に従います。

### 5. Azure CLIのインストール

Azure CLIは後続の手順の"Kubernetes - Azure Arc"リソースを作成する途中で使用します。
最新版が入っていないとインストーラーが稼働して面倒になります。

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli-windows?tabs=azure-cli → このサイトのインストール手順に従います。

### 6. Kubernetesクラスターの作成

次のように操作して、Minikube上にクラスターを作成します。
どれでもいいとは思いますが、今回はHyper-Vを使用して作成しました。
後続の手順では、管理者権限は不要です。

1. 管理者権限でPowerShellコンソールを起動します。
1. 次のコマンドを実行して、クラスターを作成します。
1. 正常に作成ができたら、コンソールを閉じます。

```powershell
minikube --kubernetes-version 1.16.15 --driver=hyperv start
```

また、ここで1.16.15を指定しています。これはよく調べていないのですが、バージョン番号を指定しないで作成した場合には後続のAzure Arc enabled Kubernetesの設定の手順で警告が出ていたので、このようになっています。おそらくこれは不要だったかもしれません。

```
Unable to install helm release: W0405 16:09:25.775265    9884 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
```

## Azure Arc enabled Kubernetesの設定

次の手順で操作して、MinikubeのクラスターをAzure Arc enabled Kubernetesとして接続させます。


### 1. Azure Subscriptionの作成

持っていない場合は無料枠を使用して作成します。

### 2. Azure Arc enabled Kubernetesの作成

新規リソース作成の画面で、"Azure Arc Kubernetes"と検索すると出てきます。
https://portal.azure.com/#create/Microsoft.ConnectedCluster
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/164be505-c533-2de0-7bf1-d556110d7183.png)

手順としては、1～5までありますが、このAzure Portal上からすることはほとんどありません。

#### (1) Prerequisitesのタブ

分かりやすい注意書きがあるのでよく読んでおきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/7b79bc73-28bd-d651-2d3c-875e11a70dd2.png)

#### (2) Cluster detailsのタブ

各種設定をします。

- `Resource group`で、適当なリソースグループ名の指定をします。必要な場合は、Create newを押して新規に作成します。
- `Cluster name`で、新しく作られるAzure Arc enabled Kubernetesリソースの名前を入力します。
- `Region`には、適当なリージョンを指定します。注意点としては、今のところ使用可能なリージョンに限りがあります。私は`(US) East US 2`を選びました。
- `Is cluster behind proxy server?`には、そのままNoを選びました。おそらくオンプレなどでProxyを必要とするサーバーで使用したりするものでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/862a9925-080f-3097-d49d-b089806b7dce.png)

#### (3) Tagsのタブ

必要に応じて、タグの指定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/5b35ef96-b6b2-2b9b-d9ac-a90c7f7164fc.png)

#### (4) Run scriptのタブ

`Script type`で、ここではPower Shellを選択します。
コピーアンドペーストでこのコマンドをPowerShellコンソールで実行するか、もしくはダウンロードボタンによりスクリプトをダウンロードします。`Download .ps1`ボタンから`CreateConnectedClusterScript.ps1`をダウンロードした場合、そのままではセキュリティーのために実行不能となっているため、エクスプローラーでファイルのプロパティを開いてからUnlockする必要があります。
実行中には、初めにAzureへのログインが求められます。その後、待機しているとAzure Arcのリソースにクラスターが登録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/ed4d5b34-0324-5962-3ce3-fcc9f4f3e040.png)

実行中には、いくつかのPodがAgentとして`azure-arc`のNamespaceにインストールされます。

なお、手元では、次のようなメッセージが出たのですが、クラスターのバージョンを調整すると直るかもしれません。

```
Ensure that you have the latest helm version installed before proceeding.
This operation might take a while...

'Custom-locations' feature couldn't be enabled on this cluster as the pre-requisite registration of 'Microsoft.ExtendedLocation' was not met. More details for enabling this feature later on this cluster can be found here - https://aka.ms/EnableCustomLocations
```

#### (5) Verificatoinのタブ

ここまで来ると終了となります。作成されたリソースを確認するために、`Go to the cluster`を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/22d8d879-ba4d-d97c-e3c4-44bfbb37ce84.png)

### 作成されたAzureリソースの確認

作成されたKubernetes - Azure Arcのリソースを開くと、次のようになります。
クラスターがminikubeであることや、使用されているバージョン番号が特に手元で指定していなくても、この画面に反映されています。
また、左のメニューにはGitOpsやPoliciesの設定があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/d7d6879e-8485-0ad1-fe46-6c7270856ab6.png)

## Monitoringの設定

先の手順で紐づけしたMinikubeのクラスターでAzure Monitorを使用するためには、このドキュメントに従って設定をします。
ここでは、PowerShellのスクリプトを使用しますが、現在は一部に動作しない箇所があるのでそこだけ注意して進めます。

https://docs.microsoft.com/en-us/azure/azure-monitor/containers/container-insights-enable-arc-enabled-clusters

### (1) PowerShell スクリプトのダウンロード

PowerShellコンソールを開きます。そこで、PowerShellスクリプトのダウンロードをします。

```powershell
Invoke-WebRequest https://aka.ms/enable-monitoring-powershell-script -OutFile enable-monitoring.ps1
```

ダウンロードされたスクリプト`enable-monitoring.ps1`をそのまま実行すると、後半のHELMの動作のところでエラーが発生します。そこで、このスクリプトをテキストエディタで開き、行67の`$mcrChartVersion = "2.8.2"`を`$mcrChartVersion = "2.8.1"`に変更して保存します。
これは一時的な問題であり、しばらくするとこの作業は不要になるはずと思います。

### (2) PowerShell スクリプトの実行

PowerShellコンソールで引き続き、変数の定義のうえで、先ほどのスクリプトを実行します。
このスクリプトの実行により、Minikubeの`kube-system` namespaceにMonitoringのためのAgentのPodのインストールと、Azure SubscriptionにLog Analytics Workspace Resource Groupの作成がされるようです。

```powershell
# リソースIDの指定：この変数は、先の"作成されたAzureリソースの確認"の手順のURLの一部をコピーアンドペーストすると簡単に値を定義できます。
$azureArcClusterResourceId = "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Kubernetes/connectedClusters/<clusterName>"

# KubernetesのContextの名前を指定(`kubectl config get-contexts`で表示される名前と同様のものを指定する)
$kubeContext = "minikube"

# 実行
.\enable-monitoring.ps1 -clusterResourceId $azureArcClusterResourceId -kubeContext $kubeContext
```

実行後に、`Successfully enabled Azure Monitor for containers for cluster: ...`と出たら終了です。

### (3) Azure PortalでMonitorを確認

再度、"作成されたAzureリソースの確認"の時と同様に、Azure Portalを開きます。
左メニューからMonitoring配下の"Insights"や"Metrics"をみると、クラスターの稼働している状態を確認できます。

Monitoringの設定が完了してすぐの出力例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/281e287d-e29a-7a2d-dc40-d77f815f54e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/4561b84c-6bb0-a75a-5931-cae8881a2f22.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37147/54855d03-61a7-64be-628d-d64ff127d067.png)

# 費用

維持費はどの程度かは調べていないので、すみませんが他のドキュメントを参照してください。
6 vCPUまで無料とあります。
Azure Policyで¥672/Server/Monthと書かれているので、もしかするとこれがかかるのかもしれないです。


https://azure.microsoft.com/en-us/pricing/details/azure-arc/

# 最後に

Azure Arc enabled Kubernetesは最近GAされたものです。事前準備のあたりで少し手間取ったものの、それ以降のセットアップはスムーズにできました。
仕事ではオンプレのシステムの管理を容易にするなどありますが、それ以外にも、個人で作成したRaspberry PIのKubernetesクラスターで使うようにでもしても良いなと思ったりしました。

https://azure.microsoft.com/en-us/updates/azure-arc-enabled-kubernetes-is-now-generally-available/

おわり