【2021年４月版】Kubernetes ナビ その１: ディストリいろいろ

# Kubernetes ナビ

本シリーズでは kubernetes クラスタを構成する様々なコンポーネント・技術をざっとご紹介しております。

- [【2021年４月版】Kubernetes ナビ その１: ディストリいろいろ](https://qiita.com/koinori/items/3eeea1ce1bd5420ac09c)
- [【2021年４月版】Kubernetes ナビ その２: ネットワーク・サービス関連](https://qiita.com/koinori/items/ef66ce6b1dd0a27a5fa4)
- [【2021年４月版】Kubernetes ナビ その３: ストレージ関連](https://qiita.com/koinori/items/20c71563dcd2c14f0058)
- [【2021年４月版】Kubernetes ナビ その４: コンテナ関連](https://qiita.com/koinori/items/43aabffddce01938e80d)
- [【2021年４月版】Kubernetes ナビ その５: Serverless](https://qiita.com/koinori/items/1b3850cd922d06eda528)

今回はその１となります。

# Kubernetes ざっくり

クラウド技術の集大成である Kubernetes は非常に多くのレイヤ、プロダクトが組み合わされており、全体像をしっかり把握するだけでも非常に困難なプロダクトであります。
というわけで、このシリーズでは Kubenetes 関連の OSS プロダクト、サービスをできるだけ簡潔に把握しやすくご紹介してみたいと思います。

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

オープンソースである Kubernetes には、Linux 同様いろいろなディストリビューションがあります。そこでまずは Kubernetes パッケージ丸ごとのディストリビューションについて、以下、筆者が気になるものをご紹介いたします。
各社の Kubernetes ディストリについて比較・検討できる資料になれば幸いです。

## 比較するレイヤー・コンポーネント

k8sはいくつかのレイヤー・コンポーネントで構成されていることは上記で述べたとおりですが、各ディストリを比較する上で、主に以下のレイヤー・コンポーネントをメインに比較してみたいと思います。

1. CRI (Container Runtime Interface) … デフォルトで対応するもしくは同梱のコンテナ・ランタイム
1. コントロールプレーンストレージ … クラスタの設定そのものを保存・同期するKVSもしくはDBサービス
1. CNI (Container Networking Interface) … デフォルトで対応するもしくは同梱のコンテナ通信インタフェース
1. CSI (Container Storage Interface) … デフォルトで対応するもしくは同梱の永続化インタフェース
1. DNS … デフォルトで対応するもしくは同梱のDNS、サービスディスカバリサービス

それでは以下で代表的なディストリビューションをご紹介します。

## 1. 本家 Kubernetes

| スペック概要 |  |
|:--|:--|
|公式サイト| https://kubernetes.io/ |
|リポジトリ| https://github.com/kubernetes/kubernetes |
|開発団体| [Cloud Native Computing Foundation](https://www.cncf.io/) |
|最新バージョン|  1.21.0 |
|対応CRI|  [containerd,  CRI-O, Dockerなど](https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/) |
|コントロールプレーンストレージ|etcd|
|CNIプロバイダ| [CNI純正？のプラグイン](https://github.com/containernetworking/plugins) |
|CSIプロバイダ|×|
|DNS| CoreDNS|

公式が配布するすっぴんのKubernetesですが、フルスタックのパッケージなのでサイズ(容量、必要なメモリ、ＣＰＵ)が大きいです。
単一のＰＣで動かすのは [kind](https://kind.sigs.k8s.io/) でも可能ですが、あまりお勧めしないのでローカルでの学習には正直なところ、向かないと思います。すっぴんのKubernetesをローカルで試すのであれば [Minikube](https://kubernetes.io/ja/docs/setup/learning-environment/minikube/) をお勧めします。
こちらはKubernetesをフルカスタマイズして自前で運用したり、Kubernetesのプラグインを開発するような**ガチ勢向け**であると思っています。

## 2. K3s

| スペック概要 |  |
|:--|:--|
|公式サイト| https://k3s.io/ |
|リポジトリ| https://github.com/k3s-io/k3s |
|開発団体| [Rancher](https://rancher.com/) |
|K8s バージョン互換|  1.20.5 |
|対応CRI| containerd & [runc](https://github.com/opencontainers/runc) |
|コントロールプレーンストレージ|[kine](https://github.com/k3s-io/kine)|
|CNIプロバイダ|[flannel](https://github.com/flannel-io/flannel)|
|CSIプロバイダ|× ※ストレージは[Local-path-provisioner](https://github.com/rancher/local-path-provisioner)を使用|
|DNS| CoreDNS|
|その他|[metrics-server](https://github.com/kubernetes-sigs/metrics-server), [Traefik](https://traefik.io/traefik/) for ingress, [Klipper-lb](https://github.com/k3s-io/klipper-lb) as an embedded service loadbalancer provider, [Kube-router](https://www.kube-router.io/) for network policy, [Helm-controller](https://github.com/k3s-io/helm-controller) to allow for CRD-driven deployment of helm manifests |
インストールと動作が簡単・軽量なので個人的にはおすすめのディストリです。
まずKubernetesを使うことが第一目標であれば docker にて k3s を立ち上げればkubernetes構築完了です。
開発環境の構築などでKubernetesの内部の理解よりもとにかくさっさと運用スタートしてしまいたい場合には重宝します。

## 3. Microk8s

| スペック概要 |  |
|:--|:--|
|公式サイト| https://microk8s.io/ |
|リポジトリ| https://github.com/ubuntu/microk8s |
|開発団体| [Canonical](https://canonical.com/) |
|K8s バージョン互換|  1.20 |
|対応CRI| containerd & [runc](https://github.com/opencontainers/runc) |
|コントロールプレーンストレージ|不明。 [dqlite](https://dqlite.io/)か？|
|CNIプロバイダ| [CNI純正？のプラグイン](https://github.com/containernetworking/plugins) |
|CSIプロバイダ|× ※プラグインとして[OpenEBS](https://openebs.io/)が利用可能|
|DNS| × ※ プラグインとして[CoreDNS](https://microk8s.io/docs/addon-dns)が利用可能|
|その他|Service Mesh: [Istio](https://istio.io/), [Linkerd](https://linkerd.io/), Serverless: [Knative](https://knative.dev/), Monitoring: [Fluentd](https://microk8s.io/docs/addon-fluentd), [Prometheus](https://prometheus.io/), [Grafana](https://grafana.com/), Metrics, [Ingress](https://microk8s.io/docs/addon-ingress), [Dashboard](https://microk8s.io/docs/addon-dashboard), Clustering,Automatic updates to the latest Kubernetes version,[GPGPU](https://microk8s.io/docs/addon-gpu) bindings for AI/ML,[Kubeflow](https://www.kubeflow.org/)! |

Uuntuでおなじみ Canonical 御謹製の K8s です。Ubuntu & Canonical 好きな方、抵抗のない方はどうぞご利用ください。自分はちょっと遠慮しておきます・・・笑

## 5. K0s

| スペック概要 |  |
|:--|:--|
|公式サイト| https://k0sproject.io/ |
|リポジトリ| https://github.com/k0sproject/k0s |
|開発団体| [Mirantis](https://www.mirantis.com/) |
|K8s バージョン互換|  1.20 |
|対応CRI| containerd & [runc](https://github.com/opencontainers/runc) |
|コントロールプレーンストレージ|sqlite, etcd, [kine](https://github.com/k3s-io/kine)|
|CNIプロバイダ| [Calico](https://www.projectcalico.org/) |
|CSIプロバイダ|×|
|DNS| CoreDNS|

たぶんミニマルな K8sとしては今のところ最後発で絶賛開発中の k0s です。ご覧の通り極めてミニマルな構成です。
実際、Kubernetesはプラグインそのものが自分にコンテナをデプロイして動作することになるので、初期構成はこんなもんでいいのです。ただし絶賛開発中ですので個人の実験はともかく、案件での開発環境として採用するのはまだまだかな、というところでございます。半年後、どうなっているか、が期待です。

## 6. GKE, EKS, AKS

Google の GKE、AWS の EKS、MS Azureの AKS についてはディストリと同列の比較はできないので、名前だけ上げておきます。

- [Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine?hl=ja)
- [Amazon Elastic Kubernetes Service](https://aws.amazon.com/jp/eks/)
- [Azure Kubernetes Service](https://azure.microsoft.com/ja-jp/services/kubernetes-service/)

正直なところ、Kubernetes の運用、つまりこれを載せるサーバーのハードウェアを自前で運用するのはかなりしんどいです。
特に案件で開発環境に構築するとなると、**落ちるのが前提の単一ノードクラスタ** を運用することになり、これは**リスクでしかない**です。
K8sサービスを使えば札束で安全が買えるのです。実際の案件では開発環境から各社のサービスを利用することをお勧めします。

# 雑感

Kubernetes は間違いなく学習するべき技術ですが、クラウド技術の集大成なだけあって非常にハードルが高いです。
とりあえず手元で k8s を動かしてみて学ぶ、ということが必要ですので、MinikubeやMicroK8sのような "小さなクラスタ"は学習用に必要でした。
ところが RaspberryPi を代表とする IoT のエッジ向けのコンテナベースアプリ開発のために、k3sやk0sのような"ミニマルなクラスタ"が発展してきてしまいました。ARM で K8s を動かすのがもはやメインストリームですよ。いやぁ・・・まいった。

上記で代表的なディストリとそのコンポーネントを挙げていますが、まさにOSSのオールスターのようですね。数も多いがそれぞれ第一級の機能と特徴と設定を持ってますので個々の内容も濃いわけです。いやぁ・・・まいった。

以降のシリーズではそれぞれのレイヤーについて代表的なOSSをご紹介していきたいと思います。