#1 Azure Kubernetes Service (AKS) で Confluent Platform の Helm Chart を使用してアプリケーションを動かしてみました


## 概要

[この記事](https://qiita.com/loftkun/items/bcfe1f205cde4d74a384) を参考にさせていただき、ちょっとだけ理解したつもりの Helm v3 を使って、Confuent Platform の Helm Chart と ACRにあるコンテナイメージ（rabbitmq）から AKS でコンテナアプリケーションを稼働させる手順をまとめました

ベースとなるDockerコンテナアプリケーションは、[この記事達](https://qiita.com/turupon/items/7d1eb598e0291fb999da) となり、これをAKS上で稼働させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/7028f2ff-648e-35ed-9c78-24b558eb260d.png)

以下の２つのステップで上記内容を順次説明します。今回は STEP-1 について説明します。
[STEP-1．AKS上での Confluent Platform 環境構築](https://qiita.com/turupon/items/7f9265856480288f4bc7)
[STEP-2．AKS上でのコンテナアプリケーションの実行](https://qiita.com/turupon/items/4736b6d28ecfca727ef8)

## ローカル環境

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
```

### リポジトリの追加と確認

Confluent Platform は [github](https://github.com/confluentinc/cp-helm-charts) から Helm Chart 情報を入手します。
[Helm Hub](https://artifacthub.io/) から RabbitMQ / InfluxDB / Grafana の該当する Helm Chart 情報を見つけ、レポジトリに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544022/4b8cd518-0d37-4ced-f3c3-6b3d46a0e858.png)

```
$ helm repo add confluentinc https://confluentinc.github.io/cp-helm-charts/
"confluentinc" has been added to your repositories

$ helm repo add bitnami-azure https://marketplace.azurecr.io/helm/v1/repo
"bitnami-azure" has been added to your repositories

$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories

$ helm repo update
```

### Helm Chart の検索

confluentinc / rabbitmq / Influxdb / grafana のそれぞれのチャートを検索します

```
$ helm search repo confluentinc

NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                                       
confluentinc/cp-helm-charts	0.6.1        	1.0        	A Helm chart for Confluent Platform Community E...
stable/schema-registry-ui  	0.4.4        	v0.9.5     	DEPRECATED - This is a web tool for the conflue...
```

```
$ helm search repo rabbitmq

NAME                               	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami-azure/rabbitmq             	8.20.2       	3.8.21     	Open source message broker software that implem...
bitnami/rabbitmq                   	8.20.2       	3.8.21     	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 search repo influxdb

NAME                  	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami-azure/influxdb	2.3.5        	2.0.7      	InfluxDB&trade; is an open source time-series d...
bitnami/influxdb      	2.3.6        	2.0.8      	InfluxDB&trade; is an open source time-series d...
stable/influxdb       	4.3.2        	1.7.9      	DEPRECATED Scalable datastore for metrics, even...
bitnami-azure/grafana 	6.1.9        	8.1.2      	Grafana is an open source, feature rich metrics...
bitnami/grafana       	6.1.9        	8.1.2      	Grafana is an open source, feature rich metrics...
stable/kapacitor      	1.2.2        	1.5.2      	DEPRECATED InfluxDB's native data processing en...
```

```
$ helm search repo grafana

NAME                          	CHART VERSION	APP VERSION	DESCRIPTION                                       
bitnami-azure/grafana         	6.1.9        	8.1.2      	Grafana is an open source, feature rich metrics...
bitnami-azure/grafana-operator	1.1.1        	3.10.3     	Kubernetes Operator based on the Operator SDK f...
bitnami/grafana               	6.1.9        	8.1.2      	Grafana is an open source, feature rich metrics...
bitnami/grafana-operator      	1.1.1        	3.10.3     	Kubernetes Operator based on the Operator SDK f...
bitnami/grafana-tempo         	0.2.2        	1.0.1      	Grafana Tempo is an open source, easy-to-use an...
stable/grafana                	5.5.7        	7.1.1      	DEPRECATED - The leading tool for querying and ...
```

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

cp-helm-charts / rabbitmq / Influxdb / grafana の Helm Chart を Pull します。

```
$ helm pull confluentinc/cp-helm-charts
$ tar zxf cp-helm-charts-0.6.1.tgz

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

$ helm pull bitnami-azure/influxdb
$ tar zxf influxdb-2.3.4.tgz

$ helm pull bitnami-azure/grafana
$ tar zxf grafana-6.1.6.tgz
```

ディレクトリ構成は以下となります。

```
$ ls -l                     

drwxr-xr-x  12 hoge  staff    384  8 24 09:38 ./
drwxr-xr-x   7 hoge  staff    224  8 19 14:33 ../
drwxr-xr-x  17 hoge  staff    544  8 19 15:39 cp-helm-charts/
-rw-r--r--   1 hoge  staff  50496  8 19 15:32 cp-helm-charts-0.6.1.tgz
drwxr-xr-x   9 hoge  staff    288  8 19 14:15 grafana/
-rw-r--r--   1 hoge  staff  34570  8 19 14:14 grafana-6.1.6.tgz
drwxr-xr-x  10 hoge  staff    320  8 19 14:15 influxdb/
-rw-r--r--   1 hoge  staff  43726  8 19 14:13 influxdb-2.3.4.tgz
drwxr-xr-x  11 hoge  staff    352  8 19 13:52 rabbitmq/
-rw-r--r--   1 hoge  staff  47260  8 19 13:52 rabbitmq-8.19.1.tgz
```

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

ACRに登録されている rabbitmq コンテナイメージを使用するので、イメージ名称のディレクトリ内にある values.yaml の以下の部分を編集します

|Chart|タグ|項目|値|
|:--:|:---|:---|:---|
|rabbitmq|global|imageRegistry|acr0ituru.azurecr.io|
||image|registry|acr0ituru.azurecr.io|
||image|repository|rabbitmq|
||image|tag|3.8.17|

Influxdb / grafana の各イメージ名称のディレクトリ内にある values.yaml については以下の部分を編集します。コンテナ起動後必要な設定を入れる必要があります。

|Chart|タグ|項目|値|
|:--:|:---|:---|:---|
|influxdb|global|imageRegistry|""|
||image|tag|1.8.5|
||auth|enabled|false|
|grafana|global|imageRegistry|""|
||image|tag|8.0.6|
||admin|password|admin|

cp-helm-charts の values.yaml については以下の部分を編集します（Confluent Platform は 6.0.0 を使用します）。ただし、Connector のみACRに登録されているコンテナイメージを使用します。また、今回は REST-Proxy を使用しないので無効化にしておきます

|Chart|タグ|項目|値|
|:---:|:---|:---|:---|
|cp-helm-charts|cp-zookeeper|imageTag|6.0.0|
||cp-kafka|imageTag|6.0.0|
||cp-schema-registry|imageTag|6.0.0|
||cp-kafka-rest|enabled|false|
||cp-kafka-connect|image|acr0ituru.azurecr.io/cp-connect-base|
||cp-kafka-connect|imageTag|6.0.0|
||cp-ksql-server|imageTag|6.0.0|
||cp-control-center|imageTag|6.0.0|

---

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

### namespace の作成

```
$ kubectl create namespace akscp01
```

### dry-run

```
$ helm install cp600mq ./rabbitmq --namespace akscp01 --dry-run
$ helm install cp600db ./influxdb --namespace akscp01 --dry-run
$ helm install cp600gf ./grafana --namespace akscp01 --dry-run
$ helm install cp600 ./cp-helm-charts --namespace akscp01 --dry-run
```

### デプロイ

```
$ helm install cp600mq ./rabbitmq --namespace akscp01
$ helm install cp600db ./influxdb --namespace akscp01
$ helm install cp600gf ./grafana --namespace akscp01
$ helm install cp600 ./cp-helm-charts --namespace akscp01
```

全てのPoｄが立ち上がるまでに数分かかります。しばし、待ちましょう、、、、、

※ rabbitmq / Influxdb / grafana を アンブレラチャート/サブチャート で定義したかったのですが、そこまでの技量がまだなく、、、（涙）

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

```
$ helm list -n akscp01

NAME   	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART               	APP VERSION
cp600  	akscp01  	1       	2021-08-25 00:24:20.279592 +0900 JST	deployed	cp-helm-charts-0.6.1	1.0        
cp600db	akscp01  	1       	2021-08-24 23:54:35.304915 +0900 JST	deployed	influxdb-2.3.4      	1.8.5      
cp600gf	akscp01  	1       	2021-08-25 00:14:28.04076 +0900 JST 	deployed	grafana-6.1.6       	8.0.6      
cp600mq	akscp01  	1       	2021-08-25 00:21:44.218668 +0900 JST	deployed	rabbitmq-8.19.1     	3.8.17     
```

### Pod の確認

```
$ kubectl get pod -n akscp01

NAME                                       READY   STATUS    RESTARTS   AGE
cp600-cp-control-center-5b55c5676f-tn5w9   1/1     Running   3          3m46s
cp600-cp-kafka-0                           2/2     Running   1          3m46s
cp600-cp-kafka-1                           2/2     Running   0          3m8s
cp600-cp-kafka-2                           2/2     Running   0          2m46s
cp600-cp-kafka-connect-764c9bd6cd-n84qw    2/2     Running   3          3m46s
cp600-cp-ksql-server-5948c75b8b-dnfcm      2/2     Running   4          3m46s
cp600-cp-schema-registry-5d79b8c57-r4r5p   2/2     Running   3          3m46s
cp600-cp-zookeeper-0                       2/2     Running   0          3m46s
cp600-cp-zookeeper-1                       2/2     Running   0          3m8s
cp600-cp-zookeeper-2                       2/2     Running   0          2m32s
cp600db-influxdb-5ff9b5cfbc-zkvjb          1/1     Running   0          33m
cp600gf-grafana-59cff8f44b-rwlwx           1/1     Running   0          13m
cp600mq-rabbitmq-0                         1/1     Running   0          6m22s
```

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

```
$ kubectl get deployment -n akscp01

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
cp600-cp-control-center    1/1     1            1           4m23s
cp600-cp-kafka-connect     1/1     1            1           4m23s
cp600-cp-ksql-server       1/1     1            1           4m23s
cp600-cp-schema-registry   1/1     1            1           4m23s
cp600db-influxdb           1/1     1            1           34m
cp600gf-grafana            1/1     1            1           14m
```

```
$ kubectl get service -n akscp01

NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                 AGE
cp600-cp-control-center       ClusterIP   10.0.58.233    <none>        9021/TCP                                4m42s
cp600-cp-kafka                ClusterIP   10.0.53.78     <none>        9092/TCP,5556/TCP                       4m42s
cp600-cp-kafka-connect        ClusterIP   10.0.140.5     <none>        8083/TCP,5556/TCP                       4m42s
cp600-cp-kafka-headless       ClusterIP   None           <none>        9092/TCP                                4m42s
cp600-cp-ksql-server          ClusterIP   10.0.103.176   <none>        8088/TCP,5556/TCP                       4m42s
cp600-cp-schema-registry      ClusterIP   10.0.85.39     <none>        8081/TCP,5556/TCP                       4m42s
cp600-cp-zookeeper            ClusterIP   10.0.111.229   <none>        2181/TCP,5556/TCP                       4m42s
cp600-cp-zookeeper-headless   ClusterIP   None           <none>        2888/TCP,3888/TCP                       4m42s
cp600db-influxdb              ClusterIP   10.0.104.94    <none>        8086/TCP,8088/TCP                       34m
cp600gf-grafana               ClusterIP   10.0.185.234   <none>        3000/TCP                                14m
cp600mq-rabbitmq              ClusterIP   10.0.14.56     <none>        5672/TCP,4369/TCP,25672/TCP,15672/TCP   7m19s
cp600mq-rabbitmq-headless     ClusterIP   None           <none>        4369/TCP,5672/TCP,25672/TCP,15672/TCP   7m19s
```

```
$ kubectl get configmap -n akscp01

NAME                                          DATA   AGE
cp600-cp-kafka-connect-jmx-configmap          1      5m1s
cp600-cp-kafka-jmx-configmap                  1      5m1s
cp600-cp-ksql-server-jmx-configmap            1      5m1s
cp600-cp-ksql-server-ksql-queries-configmap   1      5m1s
cp600-cp-schema-registry-jmx-configmap        1      5m1s
cp600-cp-zookeeper-jmx-configmap              1      5m1s
cp600gf-grafana-envvars                       10     14m
cp600mq-rabbitmq-config                       1      7m38s
kube-root-ca.crt                              1      35m
```

---

## 設定の前の下準備

### kafka-client Pod

kafka topic の設定を行うためのクライントのコンテナを用意します。cp-helm-charts/examples に予め用意されている kafka-client.yaml を以下のように変更します。

```
apiVersion: v1
kind: Pod
metadata:
  name: kafka-client
spec:
  containers:
  - name: kafka-client
    image: confluentinc/cp-kafka:6.0.0
    command:
      - sh
      - -c
      - "exec tail -f /dev/null"
```

この Pod を起動させます。

```
$ kubectl apply -f cp-helm-charts/examples/kafka-client.yaml -n akscp01
```

### ksql-client Pod

ksql の設定を行うためのクライントのコンテナを用意します。cp-helm-charts/examples に予め用意されている ksql-demo.yaml を ksql-client.yaml としてコピーし、以下のように変更します。

```
apiVersion: v1
kind: Pod
metadata:
  name: ksql-client
spec:
  containers:
  - name: ksql-client
    image: confluentinc/cp-ksqldb-cli:6.0.0
    command:
      - sh
      - -c
      - "exec tail -f /dev/null"
```

この Pod を起動させます。

```
$ kubectl apply -f cp-helm-charts/examples/ksql-client.yaml -n akscp01
```

### AKS の Pod 状況

ここまでの手順を終了すると、以下の Pod 状況となります

```
$ kubectl get pod -n akscp01

NAME                                       READY   STATUS    RESTARTS   AGE
cp600-cp-control-center-5b55c5676f-tn5w9   1/1     Running   3          8m45s
cp600-cp-kafka-0                           2/2     Running   1          8m45s
cp600-cp-kafka-1                           2/2     Running   0          8m7s
cp600-cp-kafka-2                           2/2     Running   0          7m45s
cp600-cp-kafka-connect-764c9bd6cd-n84qw    2/2     Running   3          8m45s
cp600-cp-ksql-server-5948c75b8b-dnfcm      2/2     Running   4          8m45s
cp600-cp-schema-registry-5d79b8c57-r4r5p   2/2     Running   3          8m45s
cp600-cp-zookeeper-0                       2/2     Running   0          8m45s
cp600-cp-zookeeper-1                       2/2     Running   0          8m7s
cp600-cp-zookeeper-2                       2/2     Running   0          7m31s
cp600db-influxdb-5ff9b5cfbc-zkvjb          1/1     Running   0          38m
cp600gf-grafana-59cff8f44b-rwlwx           1/1     Running   0          18m
cp600mq-rabbitmq-0                         1/1     Running   0          11m
kafka-client                               1/1     Running   0          24s
ksql-client                                1/1     Running   0          8s
```

これで、コンテナアプリケーションを設定するための環境が整いました。[次回](https://qiita.com/turupon/items/4736b6d28ecfca727ef8) はこの環境上でプリケーションを実行してみます。

---

### Pod のアンインストール方法（例）

```
$ helm delete cp600 -n akscp01
release "cp600" uninstalled
```

### namespace の削除方法

```
$ kubectl delete namespace akscp01
namespace "akscp01" deleted
```

### 本課題のステップ情報

[STEP-1．AKS上での Confluent Platform 環境構築](https://qiita.com/turupon/items/7f9265856480288f4bc7)
[STEP-2．AKS上でのコンテナアプリケーションの実行](https://qiita.com/turupon/items/4736b6d28ecfca727ef8)

### 参考情報

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