NutanixのオンプレミスなマネージドKubernetesサービス「Karbon」

![スクリーンショット 2018-11-28 02.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/84474/4392de85-e7de-0cc4-9594-688e2c844200.png)
本記事は、Nutanix Advent Calendar 2018の2枚目及びKubernetes Advent Calendar 2018の3枚目の9日目、12月9日分としての投稿になります。

Nutanix Advent Calendar 2018の2枚目
https://adventar.org/calendars/3174

Kubernetes Advent Calendar 2018の3枚目
https://qiita.com/advent-calendar/2018/kubernetes3

**本記事の内容は、この日付時点の情報（Karbon 0.8 Tech Preview）に基づいています。そのため，今後新しいバージョンが提供された場合に，当該記載と矛盾が生じる場合がありますのでご注意ください。**

#はじめに
昨今、コンテナベースの仮想化技術の利用が徐々に広まりつつあり、VMベースの仮想化界隈にいる人間としては、コンテナに関わる技術もはるべく早くキャッチアップしないとなー、と思いつつ割と逃げ続けてきた訳なんですが、自身の仕事の関係でも、いよいよもって逃げられない状況となりつつあることもあって（本当にいまさらなんですが…）ついにコンテナさんに入門することになりました。
そこで、今回は（自分ところの製品と言うこともあり）NutanixのオンプレマネージドKubernetesなサービスを提供するKarbonと言う製品について触れてみたいと思います。

#ご注意
Kubernetes Advent Calendarなんか見てると、いまさらKubernetes環境がデプロイできるだけじゃないかと言われそうでドキドキですが、VMベースの仮想化技術の中で生きている人間が書いており、その辺は察していただけると幸いです。

#NutanixのKarbonとは
##Karbonイントロ
既にバリバリKubernetesを使いこなしている方からすると、いまさら何言ってんだと突っ込まれそうですが、The New Stack 2017 Kubernetes Experience Surveyと言うアンケートによると、約75％の組織や企業がKubernetesの導入にはなんらか難しい障壁があると回答していて、特に実際にKubernetesの評価を行った企業では、その傾向がより顕著に出ているようです。
>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84474/5cac5dd7-a43e-230c-82c6-9821bfa0fab7.png)
The State of the Kubernetes Ecosystemより

コンテナを使ってサービスを既に提供し始めている、yamlファイルをいい感じに管理するのに悩んでいる、コンテナ同士の通信のセキュリティ実装を悩んでいる、トレーシングの実装を何で行うか悩んでいる等のレベルではなく、もっと手前のそもそもコンテナの実行環境をどう構築するか、そしてそれをどう運用・維持していくかと言ったところで悩んでいる企業や組織が数多くあることを示している結果とも言えるかもしれません。

そうすると、そういったことで悩まずに、コンテナの実行環境については、よしなに用意されてて、サービスとして利用したいと言う要求が出てくることは容易に想像でき得ます（その善し悪しは別として）。

既にそのためのパブリッククラウドなGKEに代表されるサービスが提供されている一方で、VMベースの世界と同様にパブリッククラウドの便利さや手軽さを理解しつつも、会社の事情や顧客の要件等でオンプレミスを選択せざるを得ない環境では、Kubernetesをはじめとするコンテナの実行環境をよしなに用意してくれるGKEやEKS、AKSなどの便利なサービスを利用することができません。

NutanixのKarbonは、まずは主にそんな層をターゲットにしています（パブリッククラウドのようなサービスを利用できない組織や企業がコンテナを使おうとしても、用途的にもカルチャー的にも幸せにはなれないと言う諸説もありますが、そこは一旦置いといて…）。

##Karbonの概要
Karbonの概要は以下のようなものになります。

 - Kubernetes ClustersをNutanixのインフラストラクチャに配置して管理するためのターンキーソリューション
 - （現時点において）オンプレミスのためのマネージドKubernetesサービス
 - upstreamおよびネイティブなKubernetesのエクスペリエンスをNutanix上で提供
 - コンテナプラットフォームのデプロイメントとオペレーションに必要な反復的なタスクを自動化し、複雑なタスクを単純化するもの
 - (コンテナプラットフォームをインビジブルにすることで)組織がコード、コンテナ、アプリケーションに集中できるようにするもの

##Karbonで実現できること
 - vanillaなKubernetesをPrism Centralを通じてNutanix上に展開
 - Kubernetesをスケジューラー・オーケストレーターに据えたコンテナ実行環境を即座に提供
 - ユーザはKarbonをデプロイするだけですぐにコンテナの利用が可能
 - Kubernetesに対してNutanix独自の機能実装等は行っていない（可能な限り行わない）

##（Tech Preview時点で）Karbonが提供する機能
 - Kubernetesクラスター(Master、Node、etcd)の1-Clickデプロイ
 - Persistentなストレージボリューム(Volume Plug-in)
 - ネットワークスタック(flannel)
 - Loggingスタック(EFKスタック-Elasticsearch/Fruentbit/Kibana)

上記のとおり、Kubernetesのベーシックなコンポーネントのみに対応している状況です。正直なところ、現時点でのKarbonは、まだ実装を進めている最中で、多くのパブリッククラウドなどで既に提供されているマネージドKubernetesサービスと比較して足りないものは多いです。

オンプレミスでの利用を前提としたマネージドKubernetesサービスと言うことを考えると、コンテナレジストリの機能も内部で提供できていませんし、Loggingは最低限の機能としてEFKスタックで提供できているものの、現時点でTracingとMetricについては機能の提供もできていません（ただし、PaaSを目指している訳ではないためKarbonは周辺エコシステムを網羅的に実装し提供する想定ではないハズです）。

##Karbonのスタック
そんな訳で以下に示すように、Karbonのスタックは（現時点において）非常にシンプルなものになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84474/3d19b45d-05e5-88ff-709b-0240a0eea5e0.png)

Karbonでは、Kubernetesのバージョン（実際にKarbonで利用しているバージョンについては後述）及びコンテナランタイム等のバージョンについて、基本的に検証済みの動作するものを組み合わせて提供する形となり、ユーザーがそれを意識する必要なくコンテナ実行環境を利用可能です。

##Karbonのストレージ機能
Nutanixはハイパーコンバージドインフラの仕組みを利用して仮想化基盤のクラスターを構成するホストを跨いだ高可用性・耐障害性のあるインテリジェントな階層化ストレージを提供しています。Karbonでは、それらのストレージ領域をコンテナに見せる機能を提供しています。現時点でKarbonでは、2つのPV提供方式と2つのタイプのストレージを提供します。

###2つのPV
- 静的ボリューム（Static storage attaching）
    - コンテナインフラストラクチャの管理者(≒Nutanixのadmin)が事前に準備したNutanix VolumesベースのPVをNodeが利用する

- 動的ボリューム（Dynamic storage provisioning）
    - コンテナのデプロイに応じてオンデマンドでプロビジョニングされるPVで、NutanixのStorage provisionerがコンテナからの要求を監視し、要求時にPVをデプロイする
    - ※現時点ではExternal Provisionerで対応しているが将来的にはCNCFのCSI準拠に

###2つのタイプのストレージ
- ブロックレベルストレージの提供
    - ブロックストレージをiSCSIを通じてNutanix Volumes(旧ABS)が提供
    - Nutanix Volume：iSCSI Volume Groups == Single-Reader / Writer

- ファイルレベルストレージの提供(※Tech Previewでは未提供)
    - NFSv4ベースのファイルレベルのストレージをNutanix Files(旧AFS)が提供
    - Nutanix Files：NFSv4 == Multi-Reader / Writer

##Karbonが提供するロギング機能
Karbonでは、Kubernetesクラスターのデプロイ時に、同時にElasticsearch、Fluentbit、KibanaのロギングセットをPodでデプロイします。

```bash:kubectl&nbsp;get&nbsp;pods&nbsp;--all-namespaces&nbsp;の一部抜粋

NAMESPACE      NAME                                          READY   STATUS    RESTARTS   AGE
kube-system    fluent-bit-5mxjn                              1/1     Running   0          28m
kube-system    fluent-bit-6xtvt                              1/1     Running   0          28m
kube-system    fluent-bit-fllgn                              1/1     Running   0          28m
kube-system    fluent-bit-pd998                              1/1     Running   0          28m
ntnx-logging   elasticsearch-logging-0                       1/1     Running   0          28m
ntnx-logging   kibana-logging-6b658895b5-8kxxp               1/1     Running   0          28m
ntnx-logging   kubernetes-events-printer-87f7fff-4rzgb       1/1     Running   0          28m
```

#Karbonのデプロイ
ざっくりTech Preview時点でのKarbonのデプロイ方法についてスクリーンショット付きで紹介しておきます。
まずPrism CentralのメインメニューからServices > Karbonを選択します。
![スクリーンショット 2018-11-27 23.17.00.png](https://qiita-image-store.s3.amazonaws.com/0/84474/a5f9c7ee-ef5d-6652-d41c-fba4ffea31b3.png)

次に開いた画面から「Enable Karbon」をクリック。
![スクリーンショット 2018-11-27 23.17.27.png](https://qiita-image-store.s3.amazonaws.com/0/84474/8b036120-6b02-b96b-d599-c382d944c07b.png)

Karbonの有効化が開始されるので少し待ちます（おおよそ1、2分）。有効化が完了すると「Click here to go to Karbon Console」が表示されるのでhereをクリックします。
![スクリーンショット 2018-11-27 23.21.22.png](https://qiita-image-store.s3.amazonaws.com/0/84474/f56ad2dc-06fd-3d7a-bada-dc56cdc495c0.png)

KarbonのコンソールにはPrism Centralのクレデンシャルでログインします。ログインすると以下のような画面が表示されるので「＋Create Cluster」でKubernetesクラスターのデプロイを開始します。
![スクリーンショット 2018-11-27 23.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/84474/84ec8166-5f14-5c79-9658-6f18bff2851e.png)

デプロイするKubernetesクラスター名を入力しKubernetesのバージョンを選択します。GAリリース以後のKarbonでは、基本的に最新から3つのバージョンを選択できるようになる予定です。Tech Preview時点では、Kubernetesの1.813、1.96、1.10.3が選択可能です（またコンテナラインタイムは、選択したKubernetesのバージョンに応じて自動的に設定されます、Kubernetesの1.10.3を選択した場合は、Docker 1.13が選択されます）。
![スクリーンショット 2018-11-27 23.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/84474/df67317e-b46c-e272-48ca-d288882a5deb.png)

次にホストVMのOSイメージを選択します。ホストVMのOSイメージはPrism Centralにあらかじめ登録しておく必要があります。
![スクリーンショット 2018-11-27 23.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/84474/5156f63a-2723-3c8a-5991-3065bcd372d7.png)

Worker（Node）のリソースを設定します。ここで設定するものは、台数、vCPU、メモリ、ストレージ容量などです。
![スクリーンショット 2018-11-27 23.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/84474/d116b1ef-227a-32eb-52d5-75822a299555.png)

KubernetesのMaster及びetcdのリソースを設定します。ここで設定するものは、台数、vCPU、メモリ、ストレージ容量などです。なお、Tech Preview時点ではマルチMaster構成には対応しておらず、Masterは1台のみでの構成となります。GAリリース以降はマルチMaster構成が設定可能となる予定です。
![スクリーンショット 2018-11-27 23.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/84474/1056e0e3-06af-f741-830e-340a9d82fc9c.png)

ネットワークのリソースを設定します。Network ProviderはTech Preview時点でFlannelのみが選択可能ですが、GAリリース以降は複数のNetwork Providerから好みのものが選択可能になる予定です。
オンプレミスのKubernetesサービスなので、このKubernetesクラスターVMが動作するネットワークをNutanixが定義しているVLANの中から選択します。
またService CIDRとPod CIDRをそれぞれ設定します。Tech Preview時点では、Nodeは最大256、そして、Podについても1つのNodeあたり256が動作可能なので、それのIPを割り当て可能な任意のCIDRを設定しますが、基本的にはデフォルトのままで問題ありません。
![スクリーンショット 2018-11-27 23.44.23.png](https://qiita-image-store.s3.amazonaws.com/0/84474/5b51d009-87fb-c0d5-14b7-6daa85ebf85e.png)

次にStorage Classを設定します。Nutanixの提供するストレージは、基本的にHybrid（SSDとHDD混在）構成の場合やAll-Flash（NVMeとSSD混在）構成の場合、常にティアリング（インテリジェントな階層化制御）されているため、Storage Classの設定はブロックストレージを要求するのかファイルレベルストレージを要求するのか及び利用するストレージのRF（レプリケーションファクター：データの保持コピー数、NutanixのストレージはRAIDを利用せず、デフォルトでデータの単純2コピーを持ち、最大3コピーを持つ設定が可能）違いで利用されるものと想定しています。
その他に、PVを提供するリソースはNutanixのストレージであり、そちらを利用するためのNutanixのシステム管理者のクレデンシャル情報や利用するデータストア（Nutanixの用語としてStorage Container）、そしてファイルシステムをext4かxfsのいずれかを設定します。
ここまで設定をし終えたら「Create」をクリックします。
![スクリーンショット 2018-11-27 23.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/84474/5609768d-bc0a-b0ac-71b7-2a2dc51867ab.png)

そうすると、先ほどまでの設定に基づいてKubernetesクラスターがデプロイされはじめます。おおよそ10分弱程度で、今回の構成だとMasterが1台、etcdが3台のクラスター構成、Nodeが3台、それに加えて、EFKスタックとデフォルトで1つのPVのデプロイ開始されます。
![スクリーンショット 2018-11-27 23.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/84474/82896058-fb4c-ff44-93a3-9e904cdd6229.png)

おおよそ10分弱程度でKubernetesクラスターがデプロイされ、すぐにコンテナ環境が利用可能になります。
![スクリーンショット 2018-11-28 01.50.57.png](https://qiita-image-store.s3.amazonaws.com/0/84474/70d7bf35-90a1-1111-c393-c733a159581a.png)

デプロイが完了すると、KarbonのコンソールからはデプロイされたKubernetesクラスターの各種プロパティが参照可能になり、Storage Classの設定や静的なPVの追加が可能になります。その他、ロギング等の周辺機能（エコシステム）へのアクセスのためのダッシュボード画面も利用可能になります。
![スクリーンショット 2018-11-28 01.51.20.png](https://qiita-image-store.s3.amazonaws.com/0/84474/72f49da7-01af-a188-3bea-5b13dde135a2.png)

Karbonコンソール画面のメインメニューである左ペインの中から「Add-on」を選択すると、Tech Preview時点のKarbonで利用可能なロギング機能へのアクセスが可能です。画面の「Logging」をクリックするとKibanaのコンソール画面が開きます。
![スクリーンショット 2018-11-28 01.55.02.png](https://qiita-image-store.s3.amazonaws.com/0/84474/9e4eb69f-32d9-afff-7e02-08bf99196bc8.png)

KarbonでKubernetesクラスターと同時にデプロイされたEFKスタックのうちのKibanaでは、デフォルトでLogTailがすぐに利用可能な状態になっています。
![スクリーンショット 2018-11-28 01.55.15.png](https://qiita-image-store.s3.amazonaws.com/0/84474/4f728f48-a3f2-224a-53b6-4d4605353226.png)

Kibanaのコンソール画面のメインメニューである左ペインの中から「LogTail」を選択すると、各ノードに配置されたfuluentbitのPodが取得したログが表示されます。
![スクリーンショット 2018-11-28 01.55.27.png](https://qiita-image-store.s3.amazonaws.com/0/84474/0aac0a73-aafb-fc2c-1a92-3fea75ca9cfd.png)

実際にここからコンテナのデプロイなどを行って行くには、KarbonでデプロイしたKubernetesクラスターを選択して`kubeconfig`を操作用の端末に読み込ませる必要があります。Karbonのコンソール画面のトップに戻り、操作対象のKubernetesクラスターを選択し、画面上部にあるボタンの「Download kubeconfig」をクリックして、`kubeconfig`をダウンロードします。
![スクリーンショット 2018-11-28 02.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/84474/96e3fc36-6b23-7b9d-323b-ff8f6b5842bc.png)

後は、NutanixのKarbonで利用するしないに関わらず、ふつうにKubernetesを操作する際と変わらない手順で`kubeconfig`を`export`コマンドで環境変数に設定し利用を開始します。
![スクリーンショット 2018-11-28 02.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/84474/dd899138-15b6-4456-bf36-27fb599e345d.png)

基本的な確認コマンド`kubectl get nodes`を叩いてみます。
![スクリーンショット 2018-11-28 02.18.45.png](https://qiita-image-store.s3.amazonaws.com/0/84474/b5b94dc4-0f6d-5b5f-9cd0-b535bb1de295.png)

次に`kubectl get pods --all-namespace`でデプロイされているpodを見てみます。
![スクリーンショット 2018-11-28 02.19.46.png](https://qiita-image-store.s3.amazonaws.com/0/84474/dc4be52e-cec1-50a1-9bc3-72566e78bd85.png)

#Karbonの今後
##Kubernetesと周辺エコシステムの利用拡大に向けて
KarbonはNutanixが提供するマネージドのコンテナプラットフォームであるため、ユーザーはコンテナプラットフォームのスタック、バージョン同士の組み合わせをマネージする必要はない形で提供されます。
逆説的に言うのならKarbonは特定のコンテナスタックのバージョン同士を個々に選択して設定させるような形態ではありません。
このへんの自由度はあまり高くなく、非常にベーシックなKubernetesの利用環境を提供するだけのものになっていますが、今後は機能の拡充と共に、これらのコンポーネント、エコシステムとの組み合わせの自由度を拡大していく予定です。

##ハイブリッドクラウド対応
現時点でKarbonはオンプレミスのためのマネージドKubernetesです。しかし将来的にKarbonはハイブリッドクラウド対応できることを目指しています。Googleが発表したGKE On-Premの逆バージョンのような形で、GKE On-PremがMasterをパブリッククラウド側に、Nodeをパブリッククラウド及びオンプレミス側に展開するのとは逆に、KarbonはMasterをオンプレミス側にNodeをオンプレミス及びパブリッククラウド側に展開するような構成です（ただし、Karbonのハイブリッドクラウド対応には少し時間がかかるかもしれません、どのような形で実現するかの詳細は明らかになっていません）。

##CNCFへのコントリビューション
NutanixはCNCFのSilver Memberとなっており、KubeConのイベントなどでスポンサードなども行っています。そして今後、Karbonの機能拡充を進めていく上で、CNCFの規格などに準拠していく予定です。
また、つい最近ですがTech Preview時点のKarbonは「CNCF Platform Certified Kubernetes - Hosted」のカテゴリでCertifiedを取得しました。今後はGAリリースに向けてKubernetesのupstreamへの追従・同期を進めていく予定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/84474/7b75f276-f1c8-f48e-fd56-b70fb9ddcf9d.png)

#まとめ
パブリッククラウドを利用できない多くの企業や組織において、オンプレミスでKubernetesを含むコンテナのプラットフォームを構築・運用していくには、コンテナ環境を動作させるインフラストラクチャの課題、もう1つはコンテナ環境のデプロイメント・マネジメントの2つの障壁がありますが、それらをNutanixで一挙に解決してしまおう、と言うのがKarbonのコンセプトになります。

Karbonの概要と重複になりますが、Kubernetes ClustersをNutanixのインフラストラクチャに配置して管理するためのターンキーソリューションで、KubernetesをPrism Centralを通じてNutanix上に展開し、コンテナ実行環境を即座に提供するものです。ユーザはKarbonをデプロイするだけですぐにコンテナの利用が可能になります。

#POST SCRIPT
いかがでしたでしょうか、Nutanix Advent CalendarとしてはOKではあるものの、Kubernetes Advent Calendarとしては、かなりベンダーの宣伝チックな内容になってしまった感じですが、VMベース仮想化ソリューションを提供しているNutanixがKubernetesを何するモノぞ、Karbonとはなんぞや、と言う疑問を持たれている方への参考になれば幸いです。

明日の[Nutanix Advent Calendar 2018の2枚目](https://adventar.org/calendars/3174)はmmorishiさん、そして[Kubernetes Advent Calendar 2018の3枚目](https://qiita.com/advent-calendar/2018/kubernetes3)はtaishinさんです。