Kubernetesを徹底解説する記事
はじめに
今回の記事では、PythonやRuby等の他の技術には触れているものの、Kubernetesについては初心者であるプログラマーを対象に、Kubernetesを徹底解説する。
Kubernetesとは
Kubernetes(通称「k8s」)とは、コンテナ化したアプリケーションのデプロイ、スケーリングや管理を行うためのオープンソースのプラットフォームである。Dockerと同様にGo言語で開発されており、2023年現在において、Dockerと双璧をなすコンテナ技術として利用されている。
Kubernetesが開発された経緯
Kubernetesは、コンテナ化されたアプリケーションを大規模にデプロイし管理するという課題に対処するために開発された。Kubernetesが開発される以前は、コンテナを大規模にデプロイし管理することは、複雑で手動のプロセスであり、多くの労力と専門知識が必要だった。
確かに、DockerはWeb開発において便利である。しかし、本番環境において使用するには、Dockerの場合だと基本的に1つのコンテナにつき1つの機能しか実行できないことがある。よって、複雑なアプリケーションを構築する場合には、複数のコンテナを必要とする。では、どのように構築すべきだろうか?
例えば、Docker Composeを用いた場合を考えてみよう。しかしながら、複数のコンテナを1つのサーバーに収めることができないため、どのコンテナがどのサーバーにあるか管理しなければならない。また、コンテナが停止した場合には、すみやかに復旧できるようにしなければならない。さらに、複数のサーバーを跨いだコンテナ間の通信は複雑であるため、注意を払う必要がある。
また、コンテナを更新する場合には、コンテナ間の依存関係やデプロイの順序などを考慮しなければならない。さらに、複数のサーバーにコンテナがある場合には、ロードバランシングも必要となる。また、サーバーのスケーリングも必要となる。各コンテナからはログが出力されるものの、これらを適切に管理しなければ運用が困難となることもある。
このようなタスクは、Kubernetesであれば解決できる。
要は、Kubernetesは、移植性、拡張性、柔軟性に優れており、オンプレミスのデータセンターからパブリッククラウドまで、さまざまな環境で使用できるように設計されている。Kubernetesは、最新のアプリケーション開発とデプロイメントに不可欠なツールとなっており、企業は複雑な分散アプリケーションを容易に構築・管理できるようになった。
Kubernetesを学ぶべき理由
私たちがKubernetesを学ぶべき最大の理由は、Kubernetesが重要な役割を果たすクラウドの導入が進んでいることにある。
コンテナ技術においてはDockerが普及しているものの、Kubernetesは複数のコンテナの管理や運用の効率を高めてくれる。Kubernetesはコードのデプロイメントプロセスを劇的に変化させ、ダウンタイムなしで数百、数千のサーバーに新しいリリースを簡単に展開できるのだ。
アプリケーションのデプロイを直接管理するDevOpsに携わるプログラマにとってKubernetesはより重要で不可欠だが、Kubernetesの仕組みやコンテナを大規模に管理する方法を知っていれば、プログラマーも恩恵を受けることができる。
Kubernetesの実践的な知識が必要なDevOpsに携わるプログラマとは異なり、専門家になる必要はないかもしれない。しかしながら、Kubernetesの基礎知識、本番でのセットアップや動作方法を知っているだけで、あなたのプログラマとしてのキャリアの形成に大きく貢献してくれるのは間違いない。
Kubernetesが使われる理由
Kubernetesは現在のWeb開発で使われている理由は、主に以下の様な特徴を持っていることにある。
- スケーラビリティが高い:Kubernetesは、クラウドネイティブなアプリケーションを構築するためのプラットフォームであり、スケーラビリティが非常に高いため、急激なトラフィックの変化にも柔軟に対応できる。KubernetesはWindows、macOSやLinuxどれも対応している。
- アプリケーションのデプロイ自動化と管理が得意:Kubernetesは、アプリケーションの自動化されたデプロイと管理を可能にするための機能を提供しており、DevOpsチームがアプリケーションの展開と管理にかかる時間を大幅に短縮することができる。
- ポータビリティが高い:Kubernetesは、複数のクラウドプロバイダーとオンプレミス環境で動作するため、アプリケーションをどこでも実行できるようになる。これにより、ベンダーロックインのリスクを軽減し、アプリケーションのポータビリティを高めることができる。
- マイクロサービスのサポート:Kubernetesは、マイクロサービスアーキテクチャを採用したアプリケーションの開発と管理を簡単にするための機能を提供している。これにより、アプリケーションを小さなサービスに分割し、それぞれのサービスを個別に展開および管理することができる。
- 障害に強い:Kubernetesは、高可用性のための冗長性を提供するために、複数のノードにアプリケーションをデプロイできる。また、障害が発生した場合には、自動的に障害のあるノードからアプリケーションを再スケジュールすることができる。
これらの特徴により、Kubernetesは現在のDevOpsを実現する上で非常に強力なプラットフォームだといえよう。
Kubernetesの強み
Kubernetesを一から説明するのは非常に困難なので、特に強調しておきたい特徴を5つ紹介する。
- 多種多様なワークフローに対応できるほど機能が豊富
- 宣言的設定と突き合わせループでリソースを管理できる
- 幅広いデプロイ形式のサポート
- 拡張性が高い
多種多様なワークフローに対応できるほど機能が豊富
Kubernetesには多種多様なリソースが存在する。これらを正しく選択、設定して起動させることで商用のアプリケーションのコンテナで利用する際に求められるワークフローの大半に対応できるのだ。
専門用語 | 意味 |
---|---|
Cluster | Kubernetesのリソースを管理する集合体。Master Nodeと複数のNodeから構成される。 |
Node | Kubernetesのリソースの中で最も大きな概念。 |
Pod | コンテナの集合体。Nodeの中で動作し、1つ以上のコンテナを持っている。原則、Kubernetesでコンテナを運用・管理する際にはPod単位で行う。Kubernetesにデプロイする際には、Pod単位で実施する。 |
Deployment | Podを管理する方法を定義する。 |
DaemonSet | クラスタが動作するサーバ1つにつき、必ず1つは起動させたいPodを定義する。 |
Job | 処理を行って終了するようなPodを定義する。 |
CronJob | JobリソースをCronのように定期的に変更する |
Service | 外部やクラスタ内からのリクエストをPodに割り振るようなネットワーク定義。 |
ConfigMap | 環境変数等、Podで利用する設定を定義する。 |
Secret | パスワードやトークン情報等、Podで利用する設定を定義する。 |
Volume | Podで利用するストレージを定義する。 |
宣言的設定と突き合わせループでリソースを管理できる
Kubernetesでは前述の各種リソースを、マニフェストと呼ばれるファイルを書いてそれをクラスタ(Cluster)に渡すことで各種リソースを生成できる。このマニュフェストを用いて、リソースを定義したり生成したりする方法は宣言的設定と突き合わせループという考え方が使われている。
宣言的設定(Declarative Configuration)
本特徴は、Kubernetesが持つ強みの中で最も強調しておきたいものである。
あるアプリケーションをKubernetes上にデプロイする際に、Kubernetesに対して「あるアプリケーションやそれを構成するコンテナはこのようにあるべき」という理想の状態をyamlやJSONファイルで宣言すると、それを実現したり維持したりするために必要な具体的な作業をKubernetesが行ってくれるものだ。
マニフェストには、Kubernetes環境で稼働するべきコンテナの数やそのデプロイ形式、コンテナから認識するべきストレージ、コンテナが持つべき通信エンドポイントなどアプリケーションの理想状態を表現する様々な設定が含まれる。
このようなファイルを持つ利点としては、主に以下のようなものが考えられる。
- マニフェスト群をGit上で管理できる点
- Kubernetes環境を前の環境に戻しやすい点(要は、マニフェストで以前の状態を表現するマニフェスト群を宣言すればいい)
図1 理想状態の宣言とKubernetesの役割
突き合わせループ(Reconciliation loop)
マニフェストをクラスタに渡すと、クラスタ内でのリソースの状態とマニフェストのリソース定義を比較し、リソース定義の状態になるように調整する。突き合わせループはこれを繰り返す。
宣言的設定と突き合わせループで障害に強くなる
Kubernetesにおける、このような宣言的なリソース定義は障害に対して強くなる。例えば、負荷量に合わせてPod数を調整することを考えよう。
命令的なアプローチでは、「負荷量が増えたら1つPodを増やす」というように、あるタイミングでPodを増やす処理が失敗した場合はPod数を減らして調整することを検討する。
一方で、宣言的アプローチでは「負荷X%に対して、PodをY個ある状態にしておく」というようにすることで、あるタイミングでPod数の調整を失敗しても、突き合わせループの次のサイクルで正確な数に変更できる。
このように、Kubernetesは宣言的アプローチを採用することで障害に対して強くなる。
幅広いデプロイ形式のサポート
Kubernetesは幅広いデプロイ形式のサポートをしている。コンテナをデプロイする方法には様々な方法がある。一般的に、コンテナは書き込まれたデータをその終了とともに破棄して、それ自体に永続的なデータや長期的な状態を持たせないといった、「ステートレス」な方針で使われることが多い。
ところが、一方で、ユースケースによっては「ステートフル」な使い方―たとえば、データベースなどコンテナ自身の寿命よりも長期的な状態やデータを管理するアプリケーションを実行する必要もあるかもしれない。あるいは、パッチジョブのように単発で、場合によっては特定の時間間隔でコンテナを実行するなどのユースケースが考えられる。
Kubernetesはこれら様々なデプロイ形式をサポートする。さらに、Kubernetesはコンテナ群の自動復旧やスケーリング、アップデート等の管理作業も一部肩代わりしており、ユーザがコンテナを管理しやすくなっている。
図2 Kubernetesにおける様々なデプロイ方法
拡張性が高い
KubernetesはPodやDeployment等のリソースに加えて、CRD(Custom Resource Definition)という機能を使ってユーザ自身が独自のリソースを定義できる。これの最大の利点は、プロジェクト内でリソースを統一したフォーマットで統一した管理が行える点である。
Kubernetesは管理情報をHTTP APIで公開しており、ユーザはそのAPIの操作を通じて理想状態の宣言とアプリケーションに関する状態の確認を行う。
このAPIを参照しながら、ユーザが宣言した理想状態を維持するために具体的な作業を行うコンポーネント群をコントローラと呼ぶ。
Kubernetesは基本的な機能を提供するためのコントローラをもともと持っているものの、ユースケースに合わせて、新しくサードパーティや自身で実装したコントローラをプラグインすることでKubernetesの管理機能を拡張できる。
Kubernetesをマスターする上で必要な基礎知識
最後に、Kubernetesをマスターする上で必要な基礎知識を解説する。Kubernetesをマスターする上で必要な基礎チキは以下の通り。
- コンテナ技術の基礎知識
- Linux
- ネットワーク知識
- YAML(YAML Ain't Markup Language)
- クラウドプラットフォーム
- 自動化スキル
- 監視に関する知識
- セキュリティの知識
それぞれ順番に解説する。
コンテナ技術の基礎知識
KubernetesはDockerと同様にコンテナ技術の1つである。これは言うまでもないことだが、Dockerを始めとしたコンテナ技術の基礎的な理解が必要不可欠である。
Linux
KubernetesはLinuxサーバで動作するので、Linuxのコマンドに関する基礎知識や基本的なシステム管理のタスクを実行する手順を理解する必要がある。
ネットワーク知識
ネットワークの基礎知識とKubernetesのネットワークモデルを理解することは、Kubernetesのクラスターの設定とトラブルシューティングを行う上で非常に重宝する。
TCP/IP、DNSやロードバランシング等のネットワークの原理を理解する必要がある。
YAML(YAML Ain't Markup Language)
YAMLはKubernetesのリソースを定義するマニフェストを正確に書くために使われる。YAMLファイルの書き方に慣れる必要がある。
クラウドプラットフォーム
Kubernetesはクラウド上にアプリケーションを展開するために使われることが多いので、AWSやAzure、GCP等のクラウドプラットフォームの知識を持っていることが必要だ。
自動化スキル
Kubernetesはコンテナ化されたアプリケーションのデプロイと管理を自動化するためのプラットフォームだ。AnsibleやTerraform等の自動化ツールの使い方を学ぶことで、Kubernetesクラスタのデプロイを自動化できる。
監視・可観測性(オブザーバビリティ)に関する知識
Kubernetesのクラスタの安全性とパフォーマンスを確保するためには、監視とオブザーバビリティに関する知識が必要不可欠だ。PrometheusやGrafana等のモニタリングツールの知識があると尚良い。
セキュリティの知識
セキュリティ関連の知識ははKubernetesのSecretを扱う上で最も重要だ。暗号化、RBAC、ネットワークポリシー、安全な通信などのセキュリティの知識を深めておく必要がある。
参考サイト
- Kubernetes
- 数時間で完全理解!わりとゴツいKubernetesハンズオン!!
- Kubernetesの基本用語
- Kubernetesをだいたい理解するまで
- 僕らは何故Kubernetesを使うのか
- 今さら人に聞けない Kubernetes とは?
- Top 7 Benefits of Kubernetes
- Why Developers Should Learn Docker and Kubernetes in 2023
参考文献
参考メディア
Discussion