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)

## アーキテクチャ
アーキテクチャは下図で、以下のコンポーネントから成り立っています。

- コントロールプレーン(紫の部分)
SaaSベースで開発者、管理者向けのUIを提供し、インフラとアプリケーションのライフサイクル管理をマルチテナントで提供しています。

- サービスドメイン(黄緑の部分)
ベアメタル環境、Nutanix環境、VMware環境、パブリッククラウド環境とロケーションを選ばずKubernetesクラスタを展開し、その上にランタイム/ネットワーク/データ/可観測性の各領域における代表的な機能群のうち、管理者によって選択されたサービスを展開します。
![スクリーンショット 2020-10-27 22.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/5ec068c3-7e50-e02c-5474-adacda95fbf5.png)

管理画面の見え方はこちらです。プロジェクト(テナント)毎にどのようなプラットフォーム機能を有効化するのか選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/19eef2dc-b304-e3b9-1a42-e975278147cc.png)

## メリット
開発者/運用者を、インフラを含めたユーティリティの管理業務から解放し、競争力の源泉となるアプリケーションを迅速、安全、継続的に本番環境へとデリバリすることで、組織のビジネスゴール達成を支援します。

## ユニークな点
同じメリットを謳うKubernetesベースの製品は世にあまた存在していますが、以下がKPSのユニークな点です。

- マルチクラウド対応
サービスドメインをあらゆる環境にデプロイし、SaaSコントロールプレーンから統合的に管理可能です。インフラの配置先をロックインしません。

- グローバルデータパイプライン
あるサイトで発生するデータを、KPSのサービスドメインで処理した後、マルチクラウド対応のグローバルデータパイプラインを利用することでリアルタイムに転送可能です。技術要件やコスト要件に基づいて最適な場所にデータを配置出来ます。データの配置場所についてもロックインしません。

- プラネットスケール
アプリケーション開発者が書いたコードをコントロールプレーンにアップロードすると、数千のサイトにアプリケーションの一斉配信が出来ます。REST API対応によりCI/CDパイプラインとの連携も可能です。

- IoTエッジのユースケースに強い
ご存知の方もいらっしゃるかもしれませんが、KPSは以前、Xi IoTというIoTエッジに特化したソリューションで提供していたものを汎用的なPaaS製品としてリブランド致しました。上記の「グローバルデータパイプライン」、「プラネットスケール」はIoTユースケースのために実装されたものです。よって特にIoTエッジのユースケースに強みを持っています。

## Nutanix Karbonとの違い
Nutanixに詳しい方は「Karbonってそもそもあったじゃん？」と疑問を持たれるかもしれませんが、KarbonとKPSはそれぞれ用途が異なる製品となっています。

下図左のNutanix KarbonはいわゆるKubernetes as a Service(KaaS)に位置付けられる製品であり、Nutanixクラスタ上において「Kubernetesクラスタのライフサイクル管理をシンプルに」する製品です。よって、ユーザアプリケーションやファンクションの実装にあたっては補完的なユーティリティ群を管理者が構築/管理運用を行う必要があります。ユーティリティ群のバージョンや詳細設計位に柔軟性があるメリットがある反面、管理者はそれぞれの構成要素の運用にリソースを投じ、安定稼働に責任を追わなくてはいけません。

一方、右のKPSはKubernetesベースのPaaSであり、インフラとしてのKubernetesクラスタや補完的なユーティリティの管理運用をまるっとプラットフォーム機能として抽象化、ビルトインされた形で提供します。これにより開発者や運用者はよりユーザアプリケーションやファンクションの実装や管理に集中出来ます。プラットフォーム機能に制限がある等、柔軟性にデメリットが出てくる可能性がある反面、俊敏性や管理者の生産性にメリットがあります。
![スクリーンショット 2020-10-27 22.46.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/ac453079-834f-5529-deb9-4393697e151c.png)

これらのアプローチはどちらが良い悪いという議論ではなく、最終的なビジネスゴール、技術要件、コスト要件等を元に、これら2つの選択肢からベストなアプローチを決定されることを推奨致します。

# 本記事では
前置きが長くなりましたが、本記事ではこんなKPSをとりあえず使ってみることを目的に、始め方、Nutanix AHVにおけるサービスドメインの構築、サンプルのマイクロサービスアプリケーションの構築までを前後編に分けてご紹介致します。今回はその前編として、サービスドメインの構築までを行います。

# 構築手順
## 1. 事前準備
### 1-1. My Nutanixアカウントの作成
[こちら](https://my.nutanix.com)にアクセスし、My Nutanixアカウントを作成します

### 1-2. AHV用イメージのURL取得
[こちら](https://portal.nutanix.com/page/downloads?product=karbonplatformservices)にアクセスし、"Service Domain VM QCOW2 File for AHV"の右にある点３つアイコンをクリックするし、"Copy Download Link"をクリックします。My Nutanixへのログインが必要です。

![スクリーンショット 2020-10-28 13.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/3f51f8e1-7687-62ea-2a8a-b85dc2cd14ff.png)

### 1-3. イメージのアップロード
ご自身の環境のPrism Elementにアクセスし、"+イメージをアップロード"から以下入力し、"保存"をクリックします。

**Name**: お好きなイメージ名
**Storage Container**: イメージの格納先コンテナ
**Image Source**: "From URL"をクリックし、1-2で取得したダウンロードリンクをペーストします。
![スクリーンショット 2020-10-28 13.57.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/0ecff83a-2a50-17f1-f929-8e618213de13.png)

## 2. Karbon Platform Servicesを始める
### 2-1. KPSトライアルの開始
[こちら](https://my.nutanix.com/#/page/accounts)にアクセスし、"Karbon Platform Services"の下の"Start Trial"をクリックします。(画像はLaunchとなっていますが、新規アカウントの場合、Start Trialとなっています。)
![スクリーンショット 2020-10-27 16.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/5daab514-4ff1-9092-eab4-11792393a208.png)

下記画像のようなWelcomeメッセージが現れます。"Get Started"をクリックします。
![スクリーンショット 2020-10-27 16.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/a0120107-ea5f-1482-c276-55136cc83820.png)

更新情報が現れます。"OK, Got it!"をクリックします。
![スクリーンショット 2020-10-27 16.46.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/717aa6de-15f2-1cde-9af3-f27ca9a24bc6.png)

KPSのコントロールプレーンにログイン出来ました。
![スクリーンショット 2020-10-27 16.48.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/5fb40cd6-14a4-66f3-49fb-8589038cf27c.png)

## 3. サービスドメイン構築
### 3-1. サービスドメインのベースとなる仮想マシンの構築
Nutanix上においてサービスドメインと呼ばれる、Kubernetesクラスタのベースとなる仮想マシンを起動します。Prism Elementにログインし、"仮想マシン" -> "+仮想マシンを作成"の順で進めます。

**Name**: お好きな仮想マシン名を入力
**vCPU(s)**: 8
**Number of Cores Per vCPU**: 1
**Memory**: 16 GiB
**Disk**: "+Add New Disk"を選択後、以下入力し、"Add"
**タイプ**: DISK
**オペレーション**: イメージサービスからクローン
**バスタイプ**: SCSI
**イメージ**: 1-3でアップロードしたイメージを選択
**Boot Configuration**: Legacy BIOS
**Network Adapters (NIC)**: "+Add New NIC"から接続させるネットワークを選択
**Custom Script**: チェックを有効化
**Type Or Paste Script**: 以下を入力

```sh:cloud-init
#cloud-config 
final_message: "cloud-config completed"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/b67c6c96-f67d-5c73-7700-bfa4af2e069d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/3fcbd2d9-5bbc-77a2-748a-4c5f8570f0a6.png)
![スクリーンショット 2020-10-28 9.58.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/7b4d8f8f-9a83-3a2c-969f-b60c8e98aff5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/145da5dd-f746-6e6b-36ac-77d87ea7fb6a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/c69028ea-7d1e-a240-cad2-2c235b6a11bd.png)

仮想マシンが電源オフ状態で作成されますので、"Power On"をクリックして電源をオンにします。
![スクリーンショット 2020-10-27 17.05.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/7ddf8bc0-ef37-274c-3eaa-d6958794b88d.png)

電源が上がりました。このとき、"IP Address"カラムからこの仮想マシンのIPアドレスを確認します。
![スクリーンショット 2020-10-27 17.08.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/dbd73b6b-a738-016b-2d7f-6ae102fa6c1e.png)

### 3-2. 仮想マシンの起動とシリアル番号確認
ブラウザから、`http://(3-1で作成した仮想マシンのIPアドレス):8080/v1/sn`にアクセスすると、以下画像のような画面が現れれば、仮想マシンの起動が確認出来ます。これを後のステップで使用するため、タブを消さないで残しておきます。
![スクリーンショット 2020-10-27 17.08.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/40273dd7-47a4-e890-8e8a-24d320a42897.png)

### 3-3. 複数ノードのサービスドメインを作成したいときは...
このまま進むと、単一ノードのサービスドメイン(=Kubernetesクラスタ)が作成されますが、複数ノードによるサービスドメインを作成することも可能です。その場合、3-1,3-2のステップをノード数分繰り返します。**注意: トライアルにおいては最大3ノード分のサービスドメイン作成のみとなっていますので、ご注意下さい。**

### 3-4. KPSコントロールプレーンへのサービスドメイン登録
KPSにログインし、中央の"+Add Service Domain"をクリックします。
![スクリーンショット 2020-10-27 17.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/c5e2f3be-22f2-3fc1-8c53-75948ca02a94.png)

以下入力し、"Next"をクリックします。
**Name**: サービスドメインの名前
**Type**: 単一ノードのサービスドメインであれば"Single-Node", 複数ノードであれば"Multi-Node"
**Node Details**: 
作成した仮想マシンそれぞれについて、以下入力し、チェックをクリックします。
**Serial Number**: 3-2で取得したシリアル番号を入力
**IP Address**: IPアドレスを入力
**Gateway**: デフォルトゲートウェイのIPアドレスを入力
**Subnet**: サブネットマスクを入力
**Add Categories**: KPSではカテゴリーという属性情報を使用してスケーラブルなリソース管理が可能ですが、こちらではカテゴリーを付与せずに進めます。
![スクリーンショット 2020-10-27 17.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/9dfc4dea-d15e-b376-7632-0529aa17b63e.png)
![スクリーンショット 2020-10-27 17.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/131bc1ed-1685-fd16-a41f-27e51b589285.png)

以下入力し、"Add"をクリックします。
**Environment Variables**: サービスドメインに固有の環境変数を設定し、Kubernetesアプリケーションから参照して利用する事ができますが、ここでは設定せずに進めます。
**GPU Usage**: もしあなたのサービスドメインが(v)GPUを搭載している場合、その利用方法を選択できます。Kubernetes AppやデータパイプラインでGPUを使用する場合は"Use GPU for Kubernetes Apps and Data Pipelines"を、AI学習モデル管理機能を用いてGPUを使用する場合は"Use GPU for AI Inferencing"を選択します。ここではGPUを搭載していませんが、"Use GPU for Kubernetes Apps and Data Pipelines"を選んで進めます。
**SSH Access**: 通常サービスドメインへのアクセスは認められてませんが、要件上、あるいはトラブルシューティング等特別な理由でNutanixより権限付与されたユーザについてはチェックを有効化することでサービスドメインじへのSSHアクセスが可能となります。
![スクリーンショット 2020-10-27 17.13.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/0077c67a-a1aa-a489-9391-aeeae64cd313.png)

サービスドメインの登録が完了し、"Not Onboarded"状態となります。
![スクリーンショット 2020-10-27 17.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/74adee38-e656-b026-0e67-773f1d9972e6.png)

15~20分ほど待機すると、"Healthy"状態となります。
![スクリーンショット 2020-10-27 22.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134931/de988e7d-6755-12c1-7e20-e67c3b16d82a.png)

以上でサービスドメインの登録が完了しました。前編はここまでで、次回後編としてサンプルアプリケーションのデプロイを行っていきます。

# 参考文献
IoTユースケースについては[こちら](https://konchangakita.hatenablog.com/)のブログが詳しいです。
[開発チームブログ1](https://medium.com/@amitjain_leo/introducing-nutanix-karbon-platform-services-21cad34851aa)
[開発チームブログ2](https://www.nutanix.dev/2020/09/09/introducing-karbon-platform-services/)
[開発チームがホストしているGithub](https://github.com/nutanix/karbon-platform-services)