クラウド教材としての Kubernetes

## 前提

### 背景

会社から資格取得費用が出るので、せっかくならと Kubernetes、Google Cloud、AWS、Azure の名が付く対象資格 36 種を全て取りました。(少し前の話になってしまいますが)

|        | Kubernetes | Google Cloud | AWS      | Azure             |
| ------ | ---------- | ------------ | -------- | ----------------- |
| リンク | [Credly]   | [Credly]     | [Credly] | [Microsoft Learn] |
| 取得数 | 2          | 6            | 12       | 16                |

[Credly]: https://www.credly.com/users/mineco13
[Microsoft Learn]: https://learn.microsoft.com/ja-jp/users/mineco13/transcript/dz6grsqgkp5ozrg

様々な資格を取る中で、クラウドという謎に包まれた概念を学習するにあたっては Kubernetes に最初に集中して取り組むことが効率的だと思ったのと、Kubernetes とクラウドサービスの構造を比較したものが見当たらなかったので、この記事を書いています。

### 但し書き

簡易化のために厳密には異なるサービスを同一視したり、アプリケーションとコンテナと Pod と VM を区別なく扱ったりと、だいぶざっくりしてます。\
全体を通して致命的な間違いはないことを願っていますが、もし何かあればご教授頂けると助かります。\
Kubernetes(クーバネティス)という名前は長すぎるので、しばしば [K8s(ケーエイツ) という略称](https://glossary.cncf.io/ja/kubernetes/)を使います。(こういうの[ヌメロニム - 数略語](https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%A1%E3%83%AD%E3%83%8B%E3%83%A0)というらしいですね)\
本記事は個人の見解であり、ベンダー(Google Cloud,Azure,AWS など)の利用や資格の取得を否定するものではありません。

## TL;DR

Kubernetes は[クラウドネイティブアプリケーション](https://glossary.cncf.io/ja/cloud-native-apps/)に必要な基礎の詰め合わせで、最初に集中的に学習することで後々の学習効率が段違いに上がると思う。

## Kubernetes とは何か、クラウドサービスとの比較

不正確な説明をすると、複数のサーバやストレージをまとめて、その上にシステムに必要な要素を配置して自動で管理してくれるオープンソースの技術です。(正確な説明は[こちら](https://kubernetes.io/ja/))\
サーバをプロジェクトメンバー、ストレージをフォルダ、システムコンポーネントをタスクと対応させるなら、メンバーをまとめて、タスクを割り振って成果物を含め管理してくれる PMO みたいなイメージでしょうか。

クラウドサービスはというと、PMO というよりは協力会社の営業に近いイメージでいます。\
お金さえ払えばバイトから派遣社員、専門人材からロボットまでビジネスに必要な大体のものを提供してくれますし、成果物も依頼すれば管理してくれます。

言い方を変えると物理サーバやストレージを用意、管理するかどうか、指示を出すのに利用するのが K8s API かサービス提供画面かの違いで、両者はサービスを End-User に提供するために存在する技術基盤です。\
両者で実際に API を叩いてシステムを構築、ユーザがそれを利用するまでの流れを、かなり省略していますが図にしてみました。

![k8s_cloud_architecture.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947829/c2cf85d5-7c06-3f25-05dd-9b6d1f282b56.png)

1. エンジニアが(Control Plane/サービス提供サーバ)に (K8s オブジェクト/クラウドリソース) の作成を指示(VM や Storage など)
1. どこかの物理サーバや物理ストレージの資源を消費して、(K8s オブジェクト/クラウドリソース)が作成される
1. End-User が(K8s オブジェクト/クラウドリソース)にアクセス

クラウドサービスではベンダーが運用管理するデータセンター上で、クラウドリソースを組み合わせてシステムを構築するように\
K8s では管理者が運用管理する K8s クラスタ上で、 K8s オブジェクトを組み合わせてシステムを構築します。

K8s とクラウドサービスの共通項を少しばかり認識してもらえたと思いますが、図からも分かる通り K8s に関しては 下部(物理リソースや Control Plane/クラウドサービス提供サーバ)に関しても自分たちで運用、管理**できてしまいます**。\
しかし実際には、開発でローカル K8s 環境([minikube](https://kubernetes.io/ja/docs/setup/learning-environment/minikube/) や [KinD](https://kind.sigs.k8s.io/) など)を使う場合は運用管理は実質不要で、本番でも運用管理をベンダーに任せられるマネージド K8s を使うことになると思います。\
K8s の面白い部分でもあると思いますが、クラウドサービスとの比較という観点からも、**運用管理はしない**ものとして話を進めます。

## K8s でできること、できないこと

VM や Storge だけでなく、よくあるユースケースに対応した K8s object が用意されており、それらを組み合わせることで様々なシステムを効率的に構築できます。\
毎度かなり乱暴ですが利用者から見た K8s とクラウドサービスの比較を図にしてみました。

![k8s_vs_cloud.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947829/3f57c396-1594-c465-6abc-4c086dc36fbe.png)

例えば下記のようなパターンを K8s で構成できます

| パターン     | 説明                                                                                                                                                                    |
| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| API          | End-User からの通信を LoadBalancer が引き受け、適切な VM にルーティングする。Orchestrator によって VM は[オートスケール](https://glossary.cncf.io/ja/auto-scaling/)する |
| Batch        | Scheduler で指定された時刻に Job を呼び出す。Job は複数の VM を制御し、結果は Storage に保存される                                                                      |
| 通信         | Service Discovery で通信対象のサービスを見つけ出し、 Firewall で通信を制御する                                                                                          |
| 環境変数管理 | 環境変数を Parameter で、機密情報は別途 Secret で管理し、IAM でそれらへのアクセスを制御する                                                                             |

### クラウドサービスはさらに多機能

![cloud.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3947829/ef7342b2-26e7-edc4-21a1-c5426ea666f1.png)


一部を上図にまとめてみましたが、多様なニーズに応えるべく進化してきたクラウドベンダーのサービスは圧倒的な機能量を誇ります。\
K8s は多くのクラウドベンダーにおいて提供されるマネージドサービスの一部に過ぎません。

| サービス一覧                                             |                                           |                                                     |
| -------------------------------------------------------- | ----------------------------------------- | --------------------------------------------------- |
| [Google Cloud](https://cloud.google.com/products/?hl=ja) | [AWS](https://aws.amazon.com/jp/products) | [Azure](https://azure.microsoft.com/ja-jp/products) |

## K8s が学習向きだと思う理由

### 必要最低限かつ拡張可能な機能群

先に挙げたようなクラウドサービス群はどれも正しく使えば大いに役立ち、学ぶ価値のあるものです。\
またサーバレスなどのクラウドの特徴的な機能に関しては、クラウドサービスを通して学ぶのが手っ取り早いと思います。(K8s でも似たようなことはできると思いますが、ビルトインではありません)\
しかし冒頭に述べた通り、それらに手を出す前に K8s で基本的な機能について学ぶ方が効率がいいと考えています。

また、[クラウドコントローラー](https://kubernetes.io/ja/docs/concepts/architecture/cloud-controller/)を通してクラウドサービスとうまく連携できる(例えば負荷に応じて物理リソースをスケールしたり、クラウドリソースを作成するなど)ようにできていて、クラウドサービスとの親和性も高いです

### 低い学習抵抗と自然な動線

下記の通り継続的な学習をする上で抵抗となるような要素が少なく、また最近のトレンドも最低限網羅できると思っています

|                                                            | Kubernetes                                                                                                 | クラウドサービス                                                                                                                                                                                                                                                                                                                             |
| ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| クレジットカード                                           | 不要                                                                                                       | 必要                                                                                                                                                                                                                                                                                                                                         |
| 制約                                                       | PC のスペック                                                                                              | サービスごと、期間ごとの無料枠<br> [Google Cloud](https://cloud.google.com/free?hl=ja#free-tier-products) \| [AWS](https://aws.amazon.com/jp/products/?awsf.Free%20Tier%20Type=free-tier%23always-free%7Cfree-tier%2312-months-free) \| [Azure](https://azure.microsoft.com/ja-jp/pricing/purchase-options/pay-as-you-go/#all-free-services) |
| [コンテナ](https://glossary.cncf.io/ja/container/)         | 必須                                                                                                       | サービスによる                                                                                                                                                                                                                                                                                                                               |
| [IaC](https://glossary.cncf.io/ja/infrastructure-as-code/) | 組み込み([K8s manifest](https://kubernetes.io/ja/docs/concepts/cluster-administration/manage-deployment/)) | [OpenTofu](https://opentofu.org/)(Terraform)、[Pulumi](https://www.pulumi.com/) などの外部ツール<br>またはベンダー固有ツールを利用                                                                                                                                                                                                           |

K8s であれば必要なのは自分の PC と時間だけなので、いくら使ってもいくら放置しても請求は一切発生しません\
サービスの無料枠を意識する必要がないので学習に集中できますし、休みたくなったら休めばいいです\
PC のスペックが不足してきたら買い替えてもいいし、クラウドサービスにすぐ移行できます\
IaC は組み込み、コンテナも学習できて[サーバレス](https://glossary.cncf.io/ja/serverless/)、[CI](https://glossary.cncf.io/ja/continuous-integration/)/[CD](https://glossary.cncf.io/ja/continuous-deployment/) といった機能も追加できます\
並の PC でも動きますし、少し性能のいい PC を使っているなら倍の CPU やメモリを割り当ててもお釣りが来ます\
万一動かなかったなら K8s を消せばいいです

## 最後に - K8s(**のクラスタを自前運用するの**)は難しい

ここまで読んでくださりありがとうございました。\
K8s で調べ物をしていると`おうち Kubernetes`や`Kubernetes 「クラスタ」を構築する`といった**管理者向け**の機能に触れる記事がヒットしますが、最初は避けて通ることをお勧めします。\
K8s 基盤を**利用**する分にはハードルは高くないと思いますが、基盤そのものを**運用、管理**するとなると話は別です。\
まずはどう役に立つのかを理解した上で、その背後にある仕組みを理解する方がわかりやすいと思います。

Kubernetes は PC と自分の努力次第でいくらでも上達でき、その考え方はクラウドサービスを利用する際にも低コストで適用できる技術だと思います。\
ぜひ学んでみて欲しいです。

## 学習リソース

下記は自分が学習にあたって活用したリソースの中で、特に良かったと思うものです。\
参考になれば幸いです。

|      |                                                                                                                                                     |                                                                                                                                                                                              |
| ---- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|      | [クラウドネイティブ用語集](https://glossary.cncf.io/ja/)                                                                                            | クラウドの辞書([CNCF](https://ja.wikipedia.org/wiki/Cloud_Native_Computing_Foundation) 監修?)                                                                                                |
|      | [Kubernetes 完全ガイド 第 2 版](https://book.impress.co.jp/books/1119101148)                                                                        | K8s の辞書                                                                                                                                                                                   |
|      | [Kubernetes で実践するクラウドネイティブ DevOps](https://www.ohmsha.co.jp/book/9784873119014/)                                                      | K8s の教科書                                                                                                                                                                                 |
|      | [CKAD-exercises](https://github.com/dgkanatsios/CKAD-exercises)                                                                                     | K8s コマンドの練習問題                                                                                                                                                                       |
|      | [Beyond The Twelve-Factor App](https://qiita.com/yusukaaay/items/7ae2df0b0e9cc66ac572)                                                                                                       | モダンな WEB アプリケーションを構築するためのベストプラクティス。K8s 使ってアプリ作ってれば自ずと身に付く気がします                                                                          |
|      | [Developer Roadmaps](https://roadmap.sh/kubernetes)                                                                                                 | K8s のロードマップ                                                                                                                                                                           |
| 資格 | [認定 Kubernetes アプリケーション開発者](https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad-jp/) | ハンズオン形式での資格試験<br>模試 2 回と本試験、再受験分込みの料金<br>よく 40%OFF セールになる[Linux Foundation](https://ja.wikipedia.org/wiki/Linux_Foundation) 経由(ドル決済)での申し込み |
|      | [認定 Kubernetes アプリケーション開発者](https://lpi.or.jp/k8s/#CKAD)                                                                               | 上と同一の資格試験<br>[LPI-Japan](https://www.npo-homepage.go.jp/npoportal/detail/013000624) 経由(日本円決済)での申し込み                                                                    |
|      | [Professional Cloud Developer](https://cloud.google.com/learn/certification/cloud-developer?hl=ja)                                                  | 試験中に K8s の基本的な知識が問われます                                                                                                                                                      |