オンプレミス Kubernetes デプロイモデル比較

各種 Kubernetes ディストリビューションの、オンプレミス向けデプロイモデル・アーキテクチャを比較してみました。概ね、私がデプロイを試してみたもの中心です。
なお各ディストリビューションはクラウド向けのデプロイにも対応していたりますが、本記事はオンプレ部分のみ記載するのでクラウドデプロイはばっさり省略します。

私の勝手な分類ですが、大きく分けると以下のようになります。

* a) SW on Linux タイプ
* b) Docker タイプ
* c) 独自 OS タイプ
* d) VM タイプ

# a) SW on Linux タイプ

Linux　をインストールしたノードを用意し、この上にソフトウェアとしてインストールするタイプです。一番基本といえる形だと思います。

特徴としては、kubelet が Linux 上のデーモンとして起動し、それ以外のコンポーネントは Kubelet からコンテナ(Static Pod)として起動されるという形になります。

## Kubeadm

[Kubeadm](https://github.com/kubernetes/kubeadm) では、利用者が Linux OS とコンテナランタイム(Docker, containerd, cri-o など)、および kubelet のインストールまで行っておく必要があります。そのあと kubeadm を実行することによって、Control Plane, Worker の各コンポーネントをデプロイ、kubelet により起動されます。

Kubeadm を使う場合は、利用者が全ノードに kubeadm をインストールしてそれぞれのノードでデプロイ作業を実行する必要があるので、台数が多いと大変です。

## Kubespray

[Kubespray](https://kubespray.io/) では、Ansible を使って各ノードに対して一斉にデプロイを実施します。クラスタ台数が多い場合は Kubeadm ではなく Kubespray を使うのが現実的でしょう。

Kubespray は内部で Kubeadm を使っているので、構成は Kubeadm を使った場合と基本的に同じです (etcd が kubelet 起動でないとか細かい違いはありますが)。

コンテナランタイムや kubelet のデプロイもやってくれるので、利用者が事前にやっておくのは Linux のインストールと ssh でログインできるようにしておくこと、sudo 使えるようにしておくこと、くらいです。

## 軽量ディストリビューション

以下軽量ディストリビューションも a) に分類できるかと思います。

* [k3s](https://k3s.io/) (Rancher)
* [k0s](https://github.com/k0sproject/k0s) (Mirantis)
* [Microk8s](https://microk8s.io/) (Canonical)

# b) Docker タイプ

Docker に依存するタイプです。実際のところ MKE や RKE は Linux には依存しているので、この分類はちょっと無理があるかもしれません。一応、kubelet が Docker の中で動くか、という観点で分類してみました。

## kind (Kubernetes in Docker)

[kind](https://kind.sigs.k8s.io/) はその名の通り Docker コンテナ内で Kubernetes を動作させます。Docker コンテナ１つがノード(VM)1つ、というイメージです。

![kind architecture](https://d33wubrfki0l68.cloudfront.net/79bdd6c59934dec77bf525514c2416f547407720/a470d/docs/images/diagram.png)

kind は開発・テスト用で、本番環境で使うものではありません。マルチノードクラスタに対応していますが、これは１つの物理or仮想マシン上で複数のVM(ノードコンテナ)をエミュレートできるという意味で、複数のマシンに跨ってクラスタを構成できるわけではありません。

## MKE (Mirantis Kubernetes Engine)

[MKE](https://www.mirantis.co.jp/) は Docker EE を買収した Mirantis の製品です。インストール手順は[こちら](https://www.mirantis.com/download/mirantis-cloud-native-platform/mirantis-kubernetes-engine/)

launchpad CLI から全ノードに対して ssh でログインして一斉にデプロイ可能で、Docker EE (MCR) のインストール、k8s のデプロイが実施されます。

## RKE (Rancher Kubernetes Engine)

[RKE](https://rancher.com/products/rke/) は Rancher 社の製品です。

rke up コマンドで全ノードに対して ssh でログインして一斉にデプロイします。MKE と違い、Docker は事前にインストールしておかなければなりません。

なお、RKE の操作は CLI オンリーですが、Rancher Server を使用するとRKEクラスタ含む各種 Kubernetes クラスタの管理を GUI で行うことができます。

なお、上記は RKE1 の話で、RKE2 からは Docker には依存せず、containerd ベースになるようです。また Control plane は kubelet から static Pod として起動する形になるようです。

本題とずれますが Rancher/RKE は 100% OSS なのが良いです。他の商用製品は評価用はありますが本番で使うならライセンス購入が必要です。

# c) 独自 OS タイプ

a), b) は OS は利用者が用意したものを使用しますが、このタイプは Kubernetes を動作させる OS 自体がディストリビューションに含まれているのが特徴です。

## OCP (OpenShift Container Platform)

[OCP](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.8/) はRedHat 社の製品です。機能を絞った OKE や　OpenSource版の [OKD](https://www.okd.io/) もあります)。OS には RedHat Core OS が使われています。

ベアメタルにインストールする場合は、物理マシンに Core OS をインストールし、この上に OpenShift をインストールすることになります。
ベアメタルにインストールする手順は [ここ](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.8/html/installing/_installing-on-bare-metal)にあります。インストール方法は以下の２通り。

* IPI (Installer Provisioned Infrastructure)
    - インストーラが自動でインフラを構築する方法
    - 各ノードをPXEブート(ネットワークブート)させ OS インストールする
* UPI(User Provisioned Infrastructure) 
    - ユーザが事前に用意してから構築する方法
    - ユーザが Core OS　の CD-ROM を用意して各ノードをブートする

どちらの方法でも外部にプロビジョニング用のマシン、DHCPサーバ、DNSサーバなど用意しなければならないので準備が大変です。

# d) VM タイプ

Kubernetes を稼働させるために専用の VM をデプロイするタイプです。

## Minikube

[Minikube](https://minikube.sigs.k8s.io/docs/) は、Kubernetesが入った VM を立てるタイプです。Hyper-V や VirtualBox, VMware が使えます。また Docker も使えるので b) もできます。

なお、~~マルチノードクラスタは構成できません。シングルのみです~~ 。
指摘いただいたので訂正。[マルチノードクラスタも対応している](https://minikube.sigs.k8s.io/docs/tutorials/multi_node/)ようです。ただ、シングルノード上に複数の VM を立てる形なので HA 構成にはなりません。開発・評価用ですね。

## Charmed Kubernetes

[Charmed Kubernetes](https://jp.ubuntu.com/kubernetes) は Ubuntu で有名な　Canonical の製品。

[インストール方法](https://ubuntu.com/kubernetes/install)は何通りかあるのですが、シングルノードにインストールするときは [LXD](https://linuxcontainers.org/ja/lxd/introduction/) を使って VM を立ててデプロイするという形になります。デプロイ用のツールは Juju というものを使います。

マルチノードデプロイする方法としては [MAAS(Metal as a Service)](https://maas.io/) を使うようです。これはローカルにクラウド環境を構築するようなものなので、VMware vSphere に似ている感じです(試してはいないですが)

## VMware vSphere with Tanzu

[VMware vSphere with Tanzu](https://docs.vmware.com/jp/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-70CAF0BB-1722-4526-9CE7-D5C92C15D7D0.html) は VMware 社の製品。仮想化基盤の vSphere を用意し、その上に Kubernetes 用の VM を立てるという方式になります。VM 内で動作する OS は Photon OS なので、ある意味 c) にも近いとも言えます。

物理ノードにハイパーバイザの ESXi をインストールし、この上に VM を立てます。クラスタノード全体の管理には vCenter Server を使います。⇒ [アーキテクチャ](https://docs.vmware.com/jp/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-3E4E6039-BD24-4C40-8575-5AA0EECBBBEC.html)

![Structure](https://docs.vmware.com/jp/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/images/GUID-DF8905E1-C098-4882-BFC1-B0BAC668B424-high.png)

すでに vSphere を導入しているところに立てる場合は良さげですが、オンプレ Kubernetes クラスタ1個だけのためにこれを使うのはさすがに(運用が)重いかな、という印象。

# おまけ

各種商用ディストリビューションの参考価格情報など。

* RedHat
    - [OCP/OKE](https://licensecounter.jp/devops-hub/product/redhat/)
    - CPU 2コア単位/年額
* VMware
    - [VMware vSphere with Tanzu](https://store-jp.vmware.com/vmware-vsphere-with-tanzu-configuration-for-1-processor-5473161400.html)
    - [プロセッサ単位](https://www.idaten.ne.jp/portal/page/out/secolumn/vmware/column66.html) (1プロセッサ32コア上限)
* Canonical Charmed Kubernetes
    - [Ubuntu Advantage](https://jp.ubuntu.com/kubernetes)
    - ノード単位
* Rancher / RKE
    - 要問合せ
* Mirantis MKE
    - 要問合せ (ちなみに旧 Docker EE の価格は[ここ](https://cas.softbank.jp/wp-content/uploads/2017/04/170417_01.pdf))