【既存】 Azure Kubernetes Service (AKS) に Helm を使用して既存のアプリケーションをインストールしてみました


## 概要

[この記事](https://qiita.com/loftkun/items/bcfe1f205cde4d74a384) を参考にさせていただき、Helm v3 をちょっとだけ理解するため、ACRにあるコンテナアプリケーション（RabbitMQ）をAKSで起動させる手順をまとめました。

## ローカル環境

macOS Big Sur 11.3 
python 3.8.3
helm 3.6.3

## 事前準備

1. [この記事](https://qiita.com/turupon/items/96c5ce8c7c1d39373eac) を参考にして、AKS と ACR を構築し、AKSクラスター上で動く Node の確認まで完了していること。
2. [この記事](https://qiita.com/turupon/items/c8c1b4c3c51caa1b85b2) を参考にして、ACRへコンテナアプリケーションをプッシュしておきます。
3. [この記事](https://qiita.com/turupon/items/f129bab7a989ae9bdf77) にある、「Helm 準備」が完了していること。

---

## Helm Chart の作成

### ACRログインサーバーアドレスの取得

```
$ az acr list --resource-group $ACR_RES_GROUP --query "[].{acrLoginServer:loginServer}" --output tsv
acr0ituru.azurecr.io
```

### Helm Chart の検索

ACRに登録されている RabbitMQ コンテナアプリケーションを使用するので、rabbitmq を検索します

```
$ helm search repo rabbitmq

NAME                               	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami-azure/rabbitmq             	8.19.1       	3.8.19     	Open source message broker software that implem...
stable/prometheus-rabbitmq-exporter	0.5.6        	v0.29.0    	DEPRECATED Rabbitmq metrics exporter for promet...
stable/rabbitmq                    	6.18.2       	3.8.2      	DEPRECATED Open source message broker software ...
stable/rabbitmq-ha                 	1.47.1       	3.8.7      	DEPRECATED - Highly available RabbitMQ cluster,...
```

### 元ネタとしての Helm Chrat の Pull

```
$ helm pull bitnami-azure/rabbitmq
$ tar zxf rabbitmq-8.19.1.tgz

$ tree -a
.
├── rabbitmq
│   ├── .helmignore
│   ├── Chart.lock
│   ├── Chart.yaml
│   ├── README.md
│   ├── charts
│   │   └── common
│   │       ├── .helmignore
│   │       ├── Chart.yaml
│   │       ├── README.md
│   │       ├── templates
│   │       │   ├── _affinities.tpl
│   │       │   ├── _capabilities.tpl
│   │       │   ├── _errors.tpl
│   │       │   ├── _images.tpl
│   │       │   ├── _ingress.tpl
│   │       │   ├── _labels.tpl
│   │       │   ├── _names.tpl
│   │       │   ├── _secrets.tpl
│   │       │   ├── _storage.tpl
│   │       │   ├── _tplvalues.tpl
│   │       │   ├── _utils.tpl
│   │       │   ├── _warnings.tpl
│   │       │   └── validations
│   │       │       ├── _cassandra.tpl
│   │       │       ├── _mariadb.tpl
│   │       │       ├── _mongodb.tpl
│   │       │       ├── _postgresql.tpl
│   │       │       ├── _redis.tpl
│   │       │       └── _validations.tpl
│   │       └── values.yaml
│   ├── ci
│   │   ├── default-values.yaml
│   │   └── tolerations-values.yaml
│   ├── templates
│   │   ├── NOTES.txt
│   │   ├── _helpers.tpl
│   │   ├── configuration.yaml
│   │   ├── extra-list.yaml
│   │   ├── ingress.yaml
│   │   ├── networkpolicy.yaml
│   │   ├── pdb.yaml
│   │   ├── prometheusrule.yaml
│   │   ├── role.yaml
│   │   ├── rolebinding.yaml
│   │   ├── secrets.yaml
│   │   ├── serviceaccount.yaml
│   │   ├── servicemonitor.yaml
│   │   ├── statefulset.yaml
│   │   ├── svc-headless.yaml
│   │   ├── svc.yaml
│   │   └── tls-secrets.yaml
│   ├── values.schema.json
│   └── values.yaml
└── rabbitmq-8.19.1.tgz
```

### values.yaml ファイルの編集

上記ディレクトリ内にある values.yaml の以下の部分を編集します

```
global:
  # imageRegistry: acr0ituru.azurecr.io
  imageRegistry: acr0ituru.azurecr.io
```

```
image:
  # registry: docker.io
  # repository: bitnami/rabbitmq
  # tag: 3.8.19-debian-10-r0
  registry: acr0ituru.azurecr.io
  repository: rabbitmq
  tag: 3.8.17
```

### NOTES.txt ファイルの編集

上記ディレクトリ内にある NOTES.txt の以下の部分を編集します

```
Credentials:
    Username      : guest
    Password      : guest
```

### Chart.yaml ファイルの編集

上記ディレクトリ内にある Chart.yaml の以下の部分を編集します（既存アプリケーションのRabbitMQのバージョンに記載変更）

```
# appVersion: 3.8.19
appVersion: 3.8.17
```

---

## アプリケーションのデプロイ

### namespace の作成

```
$ kubectl create namespace helm-mq02
```

### dry-run

```
$ helm install mqtest02 ./rabbitmq --namespace helm-mq02 --dry-run
```

### デプロイ

```
$ helm install mqtest02 ./rabbitmq --namespace helm-mq02

NAME: mqtest02
LAST DEPLOYED: Fri Aug  6 13:33:44 2021
NAMESPACE: helm-mq02
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **

Credentials:
    Username      : guest
    Password      : guest

Note that the credentials are saved in persistent volume claims and will not be changed upon upgrade or reinstallation unless the persistent volume claim has been deleted. If this is not the first installation of this chart, the credentials may not be valid.
This is applicable when no passwords are set and therefore the random password is autogenerated. In case of using a fixed password, you should specify it when upgrading.
More information about the credentials may be found at https://docs.bitnami.com/general/how-to/troubleshoot-helm-chart-issues/#credential-errors-while-upgrading-chart-releases.

RabbitMQ can be accessed within the cluster on port  at mqtest02-rabbitmq.helm-mq02.svc.

To access for outside the cluster, perform the following steps:

To Access the RabbitMQ AMQP port:

    echo "URL : amqp://127.0.0.1:5672/"
    kubectl port-forward --namespace helm-mq02 svc/mqtest02-rabbitmq 5672:5672

To Access the RabbitMQ Management interface:

    echo "URL : http://127.0.0.1:15672/"
    kubectl port-forward --namespace helm-mq02 svc/mqtest02-rabbitmq 15672:15672
```

### インストール済み Chart の表示

```
$ helm list -n helm-mq02

NAME    	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART          	APP VERSION
mqtest02	helm-mq02	1       	2021-08-06 13:33:44.284954 +0900 JST	deployed	rabbitmq-8.19.1	3.8.17     
```

### Pod の確認

```
$ kubectl get pod -n helm-mq02

NAME                  READY   STATUS    RESTARTS   AGE
mqtest02-rabbitmq-0   1/1     Running   0          2m17s
```

### その他リソースの確認

```
$ kubectl get deployment -n helm-mq02
$ kubectl get service -n helm-mq02
$ kubectl get configmap -n helm-mq02
```

---

## アプリケーションの動作確認

### NOTES での手順の確認

上記実行結果のNOTES部分に基本的な使い方が記載されてます

```
$ helm install mqtest01 bitnami-azure/rabbitmq --namespace helm-mq01

NOTES:＜抜粋＞
To Access the RabbitMQ AMQP port:

    echo "URL : amqp://127.0.0.1:5672/"
    kubectl port-forward --namespace helm-mq01 svc/mqtest01-rabbitmq 5672:5672

To Access the RabbitMQ Management interface:

    echo "URL : http://127.0.0.1:15672/"
    kubectl port-forward --namespace helm-mq01 svc/mqtest01-rabbitmq 15672:15672
```

### NOTES 手順の実行

ポートフォワーディングの設定

```
$ kubectl port-forward --namespace helm-mq02 svc/mqtest02-rabbitmq 15672:15672

Forwarding from 127.0.0.1:15672 -> 15672
Forwarding from [::1]:15672 -> 15672
```

※ポートフォワーディングを中止する場合、CTRL+C を押します

### アプリケーションへのアクセス

ブラウザで http://localhost:15672 にアクセスします。 RabbitMQのログイン画面が表示されます
Username : guest　/　Password : guest を入力し、承認後 Queues 画面に切替表示し　で事前に設定していた「IoTHub」というQueueがあることを確認できました（RabbitMQ のバージョンも 3.8.17 になっています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/9be90831-7f7d-5b92-65ce-092be4e19775.png)

### アプリケーションのアンインストール

```
$ helm uninstall mqtest02 -n helm-mq02
   or
$ helm delete mqtest02 -n helm-mq02
release "mqtest02" uninstalled
```

### namespace の削除

```
$ kubectl delete namespace helm-mq02
namespace "helm-mq02" deleted
```

---

## まとめ

Helm v3 を使用して Helm repository のチャートベースに変更することにより、AKSに既存のコンテナアプリケーションを稼働せさることを確認しました。

## 番外編

### もっと手軽に（動作確認だけであれば、、、、）

カレントディレクトリに values.yaml をコピーします

```
$ cp rabbitmq/values.yaml .

$ ls -l
drwxr-xr-x   7 hoge  staff    224  8  6 00:58 ./
drwxr-xr-x   7 hoge  staff    224  8  4 01:18 ../
drwxr-xr-x  11 hoge  staff    352  8  6 00:30 rabbitmq/
-rw-r--r--   1 hoge  staff  47260  8  6 00:29 rabbitmq-8.19.1.tgz
-rw-r--r--   1 hoge  staff  42656  8  6 00:58 values.yaml
```

デプロイ

```
$ helm install -f values.yaml mqtest02 bitnami-azure/rabbitmq --namespace helm-mq02
```

---

## 参考情報

以下の情報を参考にさせていただきました。感謝申し上げます。
[Helm v3のすゝめ](https://qiita.com/loftkun/items/bcfe1f205cde4d74a384)
[事実上の標準ツールとなっているKubernetes向けデプロイツール「Helm」入門](https://knowledge.sakura.ad.jp/23603/)