Karbon Platform Services ~NutanixによるマルチクラウドPaaS~ を使ってみる 後編

# はじめに
## 概要
Nutanixは2020年9月、Karbon Platform Services(KPS)を発表しました。これはKubernetesをベースとしたマルチクラウドPaaSを実現するものです。プレスリリースと製品紹介は以下をご覧ください。

[プレスリリース](https://www.nutanix.com/jp/press-releases/2020/nutanix-launches-kubernetes-platform-as-a-service)
[Karbon Platform Services製品紹介ページ](https://www.nutanix.com/jp/products/karbon/platform-services)

# 本記事では
[前編](https://qiita.com/shocnt/items/e3ae4d837ae8957e6682)のサービスドメインの構築に引き続き、今回は後編としてサンプルアプリケーションの構築を行います。[こちら](https://github.com/nutanix/karbon-platform-services/tree/master/projects/woodkraft)のGithubレポジトリのガイドに沿って進めていきます。

# アプリケーションデザイン
デプロイするアプリケーション、WoodKraftについて説明します。ここではよくあるE-コマースサイトを取り上げます。サイト上でのユーザ行動をもとにレコメンデーションを行う機能を実装しています。

主なコンポーネントは以下です。
**Wordpress**: Eコマースサイトを作成するためのベースとなるCMS
**MySQL**: Wordpressのバックエンドとして用いるデータベース
**Debezium**: データベースに対する変更を追跡してKafkaのトピックを作成
**Kafka**: レコメンデーションサービス等のビジネスロジックへのデータストリーム
**Recommendation Logic**: ストリームを受け取り最も人気のある製品ページを更新する
**Review Logic**: ストリームを受け取りレビューページを更新する
**Ingress Controller**: サービスドメイン外からのトラフィックを制御
**Istio**: マイクロサービス間の通信を制御
**Prometheus**: アプリケーションおよびサービスの監視とアラート
**Grafana**: Prometheusで取得されたデータの可視化
**Log Forwarding**: 外部へのログデータ送信

このうち、青で示されている部分はKPSのプラットフォーム機能を用いて、水色と黄緑で示されている部分はKPSのKubernetes Apps(CaaS)の機能を用いて構築していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/89b7bfec-a180-e725-de4d-3885aad80fbf.png)

**注意: このガイドでは簡略化のため、全サービスを1つのマニフェスト(Kubernetes YamlもしはHelmチャート)に統合して提供します。本番環境ではそれぞれのサービスをCI/CDパイプラインに掛け、承認されたサービスのみをAPIコールを用いてデプロイするといった手法を取ります。**

# 構築手順
## 1. プロジェクトの設定
プロジェクトはKPSにおいてKubernetes Appsや他のサービスを論理的に分離し、認可されたユーザのみが閲覧、編集できるようにします。これにより異なる開発プロジェクト間でサービスドメインを共有したり、共通のコントロールプレーン内で複数のプロジェクトを管理出来ます。ここでは、サンプルアプリケーション用に新たなプロジェクトを作成します。

### 1-1. KPSにログイン
[こちら](https://karbon.nutanix.com/)にアクセスし、My Nutanixアカウントでログインします。

### 1-2. プロジェクト画面に移動
左側のナビゲーションペインから"Projects"メニューをクリックします。

### 1-3. 新規プロジェクト作成
"+Create"をクリックします。
![スクリーンショット 2020-10-28 15.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/620f04a5-4873-d1e1-77c2-b304366a9df1.png)

以下を入力し、"Next"をクリックします。
**Name**: お好きな名前
**Users**: "Edit"をクリックし、あなたのユーザ名を指定
![スクリーンショット 2020-10-28 15.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/50212cdf-6096-c04b-275d-73bc40babb47.png)

以下を入力し、"Next"をクリックします。
**Service Domain Selection**: カテゴリを用いて複数のサービスドメインをこのプロジェクトに紐付けたい際は"Select by Category"を、個別に選択したい場合は"Select Individually"を選択します。ここでは"Select Individually"を選択し、前編で作成したサービスドメインを静的に紐付けます。 
**Cloud Profile**: データパイプライン等を用いて外部クラウドプロバイダのデータサービスと連携したい場合、別途Cloud Profileを設定した上でプロジェクトと紐付けます。ここでは空白のまま進めます。
**Container Registry Selection**: デフォルトではdockerhubにコンテナイメージを検索しに行きますが、プライベートレジストリをお使いの場合、別途Container Registryを設定した上でプロジェクトと紐付けます。ここでは空白のまま進めます。
![スクリーンショット 2020-10-28 15.36.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/e252a7b1-11a7-813c-4ece-46a23686aa88.png)

このプロジェクトで有効化するプラットフォーム機能を選択し、"Create"をクリックします。
**Ingress Controller**: "Traefik"を"Enable"
**Service Mesh**: "Istio"を"Enable"
**Data Streaming | Messaging**: "Kafka"を"Enable"
**Logging | Monitoring | Alerting**: "Prometheus"を"Enable"
![スクリーンショット 2020-10-28 15.46.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/006bee66-0555-9c7a-cb49-10d0bf2ca4bb.png)
![スクリーンショット 2020-10-28 15.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/f706280d-bfb4-dfd5-9d61-96645a30b465.png)

## 2. アプリケーションのデプロイ
この章ではHelmチャートを用い、WordpressやDebezium、PrometheusやMySQLといったアプリケーションの構成要素をKPS上のKubernetes App(CaaS)機能上でデプロイします。

## 2-1. Helmチャートのダウンロード
[こちら](https://github.com/shocnt/karbon-platform-services/raw/master/projects/woodkraft/woodkraft-apps.tgz)からHelmチャートをダウンロードします。

## 2-2. プロジェクトコンテクストへの移動
左側のナビゲーションペイン上部のドロップダウンから第1章にて作成したプロジェクトへと移動します。
![スクリーンショット 2020-10-28 15.56.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/daf90ad2-c901-79fe-9cea-f199a099a1cd.png)

## 2-3. Kubernetes Appsの作成
"+Create Kubernetes App"をクリックします。
![スクリーンショット 2020-10-28 15.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/5d51a35c-3499-def1-eb28-29a7dcbd4aff.png)

以下を入力し、"Next"をクリックします。
**Name**: "woodkraft-apps"
**Service Domain Selection**: "Select Individually"を選択し、"+Add Service Domain"をクリックして前編で作成したサービスドメインを静的に紐付けます。 
![スクリーンショット 2020-10-28 16.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/d8c4941d-fb70-f256-b894-145acdbd022b.png)

以下を入力し、"Create"をクリックします。
**Configuration Method**: Yamlベースのマニフェストを使用する場合は"YAML based configuration"を選択しますが、ここではHelmチャートを使用するため、"Upload a Helm Chart"を選択します。
**Helm Chart File**: "Browse"から2-1でダウンロードしたtgzファイルを指定します。
**Values Override File(Optional)**: Helmチャートでテンプレートとデフォルト値を定義し、実際の値の入力を別ファイルで管理する場合、こちらにyamlファイルを指定します。ここでは空白のまま進めます。
**View Generated YAML file**: "Show YAML"をクリックすると上記のHelmチャートにて作成されたYAMLマニフェストを確認できます。
![スクリーンショット 2020-10-28 16.19.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/249786d2-9b17-babd-8f99-8078af0a0947.png)

"Kubernetes Apps"メニューから作成した"woodkraft-apps"アプリケーションの作成過程を確認できます。デプロイ完了まで15分ほど掛かります。
![スクリーンショット 2020-10-28 16.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/8328ff63-f537-9fc9-8092-1aa0f7e578bb.png)

"Service Domain Deployments"の"Status"列が"17 of 17 Running"となっていればデプロイ完了です。
![スクリーンショット 2020-10-28 16.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/96f46a39-7083-ad94-5051-0f0d2838f0ba.png)

"View Real-Time Logs"をクリックすると、Kubernetes Appの各コンテナからのログをリアルタイムで確認可能です。
![スクリーンショット 2020-10-28 16.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/f553b275-a9d6-829c-f43d-c6780b8d64b9.png)

## 2-4. Traefik/Istio/Kafkaの状態確認
このサンプルアプリケーションではTraefik/Istio/Kafkaのプラットフォームサービスが呼び出されて利用されていますが、その状態を確認します。

左側のナビゲーションペインから"Traefik"をクリックし、クラスタへのIngressルールが2つ、登録されていることを確認します。
![スクリーンショット 2020-10-28 16.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/27618589-1426-7e9e-5051-da89fdbfafef.png)

"Istio"をクリックし、マイクロサービス間のアプリケーションメトリックが取得されていることを確認します。
![スクリーンショット 2020-10-28 16.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/e550e1d2-9fad-ebe5-f43d-a65e17d9ef6d.png)

"Kafka"をクリックし、アプリケーションで生成されるKafkaトピックが登録されていることを確認します。
![スクリーンショット 2020-10-28 17.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/f3c995da-3aac-97bb-a9b0-2fb59fbddaf3.png)

## 3. サービスメトリックの取得
次は別のHelmチャートを用いてGrafanaという各種メトリックの可視化サービスを立ち上げます。GrafanaはPrometheusのような各種データソースと連携し、図表やアラート、カスタマイズ可能なダッシュボードや分析といった機能を提供します。

### 3-1. Helmチャートのダウンロード
[こちら](https://github.com/shocnt/karbon-platform-services/raw/master/projects/woodkraft/woodkraft-monitoring.tgz)からHelmチャートをダウンロードします。

### 3-2. Kubernetes Appの作成
2-2, 2-3と同じ手順でHelmチャートからKubernetes Appを作成します。Kubernetes Appの**Name**を"woodkraft-monitoring"としておきます。今度は5分ほどでデプロイが完了します。

"Service Domain Deployments"の"Status"列が"2 of 2 Running"となっていればデプロイ完了です。
![スクリーンショット 2020-10-28 17.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/060a721b-38c1-14e2-d082-ba705b5c3390.png)

### 3-3. Traefikの状態確認
左側のナビゲーションペインから"Traefik"をクリックすると、クラスタへのIngressルールが1つ増えていることが確認できます。これによりGrafanaダッシュボードへのルールが追加されました。
![スクリーンショット 2020-10-28 17.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/16e9754f-db4c-b5d5-2d23-39bf59bd20f4.png)

### 3-4. アプリケーションへのアクセス準備
TraefikによるIngressルールでは`https://woodkraft.karbon.nutanix.com`と`https://grafana.woodkraft.karbon.nutanix.com`という2つのURLに対するアクセスが定義されています。本番環境ではDNSサービスにおいてレコードを登録して組織内、あるいは世界中からアクセス可能としますが、今回はテスト目的でホストマシンの`hosts`ファイルにレコードを追加します。

**MacOS/Linux**

```shell
echo "(サービスドメインのIPアドレス) woodkraft.karbon.nutanix.com" | sudo tee -a /etc/hosts
echo "(サービスドメインのIPアドレス) grafana.woodkraft.karbon.nutanix.com" | sudo tee -a /etc/hosts
```

**Windows**

```powershell
echo (サービスドメインのIPアドレス) woodkraft.karbon.nutanix.com >> %WINDIR%\System32\Drivers\Etc\Hosts
echo (サービスドメインのIPアドレス) grafana.woodkraft.karbon.nutanix.com >> %WINDIR%\System32\Drivers\Etc\Hosts
```
### 3-5. WoodKraftアプリケーションへのアクセス
[https://woodkraft.karbon.nutanix.com](https://woodkraft.karbon.nutanix.com)にアクセスし、アプリケーションが稼働していることを確認します。
![スクリーンショット 2020-10-28 17.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/69b9fa46-b6c1-e8dc-041c-b8b7ec23da7c.png)

### 3-6. Grafanaへのアクセス
[https://grafana.woodkraft.karbon.nutanix.com](https://grafana.woodkraft.karbon.nutanix.com)にアクセスします。ユーザ名/パスワード: admin/adminを入力すると、パスワード変更を促されます。
![スクリーンショット 2020-10-28 17.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/3082dab4-184f-4536-0b20-0b3ad8a2576a.png)

Grafanaへのログインが出来ました。
![スクリーンショット 2020-10-28 17.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/0e4e482b-dd72-aa95-429f-1207b3f27d44.png)

## 4. マイクロサービスのアップデート
最後のHelmチャートは既にデプロイされているマイクロサービス、"Recommendation Service"のアップデートを行います。KPSに実装されているIstioはトラフィック管理、セキュアなコネクション、ポリシー実行、可観測性等様々な機能がありますが、ここではトラフィック管理機能を用い、特定のマイクロサービスに対して一気にアップデートを掛けるのではなく、特定のユーザから新バージョンを使い始めるリリース戦略を実装します。具体的には、Firefoxブラウザからアクセスした場合には新バージョンを、その他の場合は旧バージョンにアクセスさせます。

### 4-1. Helmチャートのダウンロード
[こちら](https://github.com/shocnt/karbon-platform-services/raw/master/projects/woodkraft/woodkraft-smart-update.tgz)からHelmチャートをダウンロードします。

### 4-2. Kubernetes Appの作成
2-2, 2-3と同じ手順でHelmチャートからKubernetes Appを作成します。Kubernetes Appの**Name**を"woodkraft-updates"としておきます。今度は5分ほどでデプロイが完了します。

"Service Domain Deployments"の"Status"列が"3 of 3 Running"となっていればデプロイ完了です。
![スクリーンショット 2020-10-28 17.59.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/4d596b6d-8838-3c01-725f-044ff215e830.png)

### 4-3. Istioの状態確認
左側のナビゲーションペインから"Istio"をクリックし、"Virtual Services"タブをクリックします。

HTTPヘッダの"user-agent"が"Firefox"であった場合、recommendation-service subset: v2にルーティングするルールが作成されました。
![スクリーンショット 2020-10-28 18.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/6f3f24d3-7426-b182-db32-d50003f3e400.png)

### 4-4. Recommendationサービスへのアクセス
[https://woodkraft.karbon.nutanix.com/recommendations/](https://woodkraft.karbon.nutanix.com/recommendations/)にFirefoxとそれ以外のブラウザからアクセスします。

**Firefox**
![スクリーンショット 2020-10-28 18.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/4ea6a5c1-9a80-91f0-8a9f-521d788a7adc.png)

**それ以外**
![スクリーンショット 2020-10-28 18.06.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/3ba94a52-e196-02af-b586-922ffd617705.png)

IstioにおけるVirtual Serviceの設定通り、サービスのルーティング先がブラウザによって変わっていることを確認しました。

# まとめ
Karbon Platform Services(KPS)を用いた、サービスドメインの構築、サンプルマイクロサービスのデプロイ、サービス監視、アップデートを流れを追って説明しました。今回は汎用PaaS機能のみを取り上げてご紹介しましたが、IoT/AIユースケースがKPSの得意分野であり、それを担うデータパイプラインやFaaS、AI機能はまた機会を見つけてご紹介しようと思います。