この記事は人間が真心を込めて作成しました。
安心してオーガニックな記事をお楽しみください。
とうとう12月になってしまいました!
毎年この時期は「やばい!今年何もできていない!」と焦っているような気がします。
ところでみなさん、Kubernetes使っていますか?
当たり前のようにKubernetesを業務で扱っている人もいれば、Kubernetesの難しさの前に躊躇している人もいるのではないでしょうか?
Kubernetesは難しい
Kubernetesは難しさ故に避けられることが多いのかなと思います。私も避けていました。
過去何度もKubernetes完全ガイドを手に取り、圧倒的なボリュームの前に挫折するといったことを繰り返していました。(「Kubernetes完全ガイド」はまごうことなきk8s界のバイブルであり、良書です。量がボリューミーなだけです!)
最近、ようやく本腰を入れてKubernetesを理解し始め、業務にて取り扱うようになりました。
なぜKubernetesってこんなに難しいのか、Kubernetesを理解していくことで理由が見えてきました。
この記事ではKubernetesとは何か、Kubernetesの本質とは、そしてなぜ難しいのかと言った内容を説明します。主に初学者向きに書いています。
Podとは?Namespaceとは?といった技術の具体的な内容には触れません。Kubernetesの技術的な内容について知りたい方は、Kubernetes完全ガイドを読んでください!
対象読者
- これからKubernetesについてキャッチアップしようとしている方
- Kubernetesに何度も挫折してしまっている方
- Kubernetesを使っているけど、ぶっちゃけよくわかってない方
kubernetesとは
一応、Kubernetesの一般的な説明をさせていただきます。
ここは読み飛ばしてもらっても良いです。
Kubernetesは、現在最も広く使われているコンテナオーケストレーションツールです。(コンテナオーケストレーションについては後述)
Googleが10年以上にわたり社内の全サービス(GmailやYouTubeなど)を支えてきたクラスタ管理システム「Borg」の設計思想と経験を継承し、2014年にオープンソースとして公開されました。翌2015年には、Linux Foundationの傘下にあるCNCF(Cloud Native Computing Foundation)へ寄贈され、現在はCNCFが中心となって開発が進められています。
ちなみに、CNCFはKubernetesだけでなく、Prometheus、Helmなど、クラウドネイティブなエコシステムを支える数多くのプロジェクトをホスティングしており、ベンダー中立的な立場からクラウドネイティブ技術の標準化と普及を推進しています。
Kubernetesの本質
ここからが本題です。
まず理解してほしいのは、kubernetesの本質はコンテナ実行環境ではないと言うことです。
実際にKubernetesは1つのコンテナ実行環境という括りにされて議論されがちです。(ECS vs EKSみたいな)
Kubernetesの本質はプラットフォームを実現するツールであることです。
プラットフォームとは
ITの世界で「プラットフォーム」と言うと文脈によって意味が変わってきます。
そのため、この記事ではプラットフォーム=システムを実現するための環境と定義させていただきます。
システムを作る時、そのシステムは何かしらのプラットフォームの上で稼働します。
AWSも1つのプラットフォームですし、最近流行りのVercelも1つのプラットフォームです。世の中には様々なプラットフォームがあります。そして、それぞれに特徴があり、明確な違いを持ちます。
AWSを例にしましょう。AWSではコンピューティングリソースとしてEC2、ECSなどがあり、データベースとしてはRDSやDynamoDBがあります。そのほかオブジェクトストレージのS3など様々なシステムのコンポーネントとなるサービスもあります。多種多様な構成要素を組み合わせて1つのシステムを作ることができます。そしてこれがプラットフォームなのです。
Kubernetesも1つのプラットフォーム
Kubernetesはただのコンテナ実行環境(コンピューティングリソース)ではなく、プラットフォームなのです。
よく対比されるECSとEKSを例にしましょう。
ECSはあくまでコンテナ実行環境です。コンテナをマネージドに実行するための機能は豊富に兼ね揃えています。ただし、コンテナ実行環境以外の機能は基本的に持たず、他のAWSリソースと組み合わせることが前提です。例えばDBはRDSと、認証情報はSecretManagerと連携します。
一方、EKSはそれ単体でプラットフォームになり得ます。EKSにはStatefulSetという永続的にリソースを稼働させる機能があります。それを利用してMySQLなどをコンテナとして稼働させることでDBの機能をKubernetes上で実現します。またSecretsという機能を利用することで認証情報管理をKubernetes上で実現することができます。
ECSはAWSというプラットフォームのコンテナ実行環境という構成要素であり、EKSはそれ自体がプラットフォームであるということです。
ECSとEKSを比較して、どちらが良い/悪いと言うことはありません。
あくまでそれぞれの本質が異なるだけです。
ちなみ
「EKSってAWSの上で動くよね?それってプラットフォームの上にプラットフォームあるということ?」と疑問を持つ方もいるかと思います。答えはYesです。Kubernetes自体はプラットフォームですが、Kubernetesもサーバーやネットワークというインフラストラクチャの上で成り立つものです。それらインフラなどの面倒をAWSが見ますよというのがKubernetesのマネージドサービスであるEKSです。
またEKSだからと言って他のAWSマネージメントサービスを使わない訳ではありません。KubernetesでMySQLを動かす場合、RDSに比べて運用コストがかかります。そういった運用コストは全てオフロードしたいという要件があれば、Kubernetesの単一プラットフォームというメリットを削ってでも、EKSとRDSなどのマネージドサービスなどを組み合わせることもあります。結局は要件次第です。
だから難しい
上で述べたようにKubernetesはプラットフォームなのです。
AWSには多種多少なサービスがあります。なぜなら、プラットフォームを実現するためには多種多様な機能が必要だからです。それはKubernetesも同じです。
多種多様な機能があるからこそ、Kubernetesには構成要素が多いのです。
だから難しいのです。
Kubernetesの実態
先ほどからKubernetesはプラットフォームであるという言い方をしていましたが、正確には少し異なります。
Kubernetesの実態はコンテナオーケストレーションというツールなのです。コンテナオーケストレーションとインフラストラクチャが組み合わさることでプラットフォームになります。(EKSではそのインフラ部分がAWSに該当するイメージです。)
コンテナオーケストレーションとは
コンテナオーケストレーションとは複数のコンテナのデプロイ、スケーリング、管理を自動化する技術を指します。
Dockerなどコンテナ技術の登場により、アプリケーションをコンテナとしてパッケージングし、どこでも同じように実行できるようになりました。しかし本番環境で大規模なサービスを運用する場合、単にコンテナを動かすだけでは不十分でした。
実際に大規模なサービスを運用する場合、数百〜数千のコンテナを複数のサーバーに効率よく配置したり、負荷に応じてコンテナ数を増減させたり、障害が発生したコンテナを自動的に再起動したりする必要です。また、コンテナ間の通信制御や、設定情報の管理、ストレージの割り当てなども大規模であれば煩雑になってしまいます。
これらを人手で管理するのは複雑でミスが起きやすいため、システム全体の状態を定義し、自動的にその状態を維持してくれる仕組みが求められていました。
そこで登場したのがコンテナオーケストレーションという概念であり、今最も広く使われているコンテナオーケストレーションがKubernetesなのです。
Kubernetesの特徴
最後にKubernetesの特徴についてまとめます。
Kubernetesは
- 宣言的な構成管理
- 自動化
- 充実したエコシステム
という特徴を持つコンテナオーケストレーションツールです。
それぞれについて解説していきます。
宣言的な構成管理
Kubernetesでは、YAMLやJSON形式のマニフェストファイルにシステムの「あるべき姿(Desired State)」を定義します。
これは「どうやって実現するか」ではなく「どうあるべきか」を記述する宣言的アプローチであり、細かい手順を指定する命令的アプローチとは対照的です。
(宣言的な構成管理の性質は冪等性という言葉で示されることもあります。)
自動化
Kubernetesは、コンテナの運用に必要な多くの作業を自動化します。
例えば
- サービスディスカバリ機能は、動的に変化するPodのIPアドレスを意識せずにサービス間通信が可能にします。これによりKubernetesが自動的にDNS名とロードバランシングを提供し、アプリケーションは常に適切なエンドポイントに接続できます
- スケーリング機能は、負荷に応じてPod数を自動的に増減させたり、ノード数を調整することを可能にします
- セルフヒーリング機能は、異常な Pod を自動的に再起動・再スケジュールし、システムの可用性を維持します
これらの自動化により、運用負荷が大幅に削減されたプラットフォームを実現します。
充実したエコシステム
Kubernetes 自体は、コンテナのオーケストレーションというコア機能に特化したプラットフォームです。
データベースやメッセージキュー、監視ツール(Observability)といった実際のアプリケーション運用に必要なミドルウェアやツールは、3rd partyの製品をKubernetes上に組み込んで利用する設計思想となってます。
この拡張性の高さが、Kubernetesの大きな強みです。
CNCFのエコシステムには、モニタリング(Prometheus)、ログ管理(Fluentd)、サービスメッシュ(Istio)、パッケージ管理(Helm)など、Kubernetes と統合可能な豊富なツール群が揃っています。
これらのエコシステムをアドオン的な形でKubernetesと組み合わせることで、幅広い用途に対応できる独自のプラットフォームを実現できます。
まとめ
- 単なるコンテナ実行環境ではなく、プラットフォーム
- 実態はコンテナオーケストレーションツール
- プラットフォームを実現する故に構成要素が多く、難しい
Kubernetesが難しい理由を理解してくれたでしょうか?
なぜ難しいのか理由が分かれば、学習し甲斐があるのではないでしょうか?(多分)
諦めてコツコツ学習して、Kubernetesで自分のプラットフォームを作りあげましょう!