「作ったアプリを公開したら、アクセスが急に増えてサーバーがダウンした…」「コンテナが増えすぎて管理しきれない…」そんな悩みを抱えるエンジニアの救世主がKubernetesだよ。名前を見ると「なんか難しそう…」ってなるかもしれないけど、この記事を読み終わったら「あーそういうことか!コンテナ管理ってそういう仕組みなんだ!」って思えるはずだよ。
- Kubernetesはコンテナ(アプリの箱詰め)をまとめて自動管理してくれるシステムだよ
- アクセス増加で自動増量・障害時に自動復旧するオートスケーリングとセルフヒーリングが最大の強みだよ
- Googleが開発して今はオープンソース(誰でも無料で使えるソフトウェア)として公開され、世界中の大規模サービスで使われているよ
もうちょっと詳しく
Kubernetesは2014年にGoogleが開発してオープンソースとして公開したツールだよ。Googleは長年、「Borg」という社内システムで同じような仕組みを使ってきたんだけど、その経験をもとにKubernetesが生まれたんだ。今は「CNCF(Cloud Native Computing Foundation)」という団体が管理していて、AWS・Microsoft・Googleなどの大手クラウドが全員サポートしているくらい業界標準になってるよ。Kubernetesを使えばアプリの更新作業がほぼ自動化できて、障害が起きても自動で回復するから、エンジニアが深夜に緊急対応で起こされるケースがぐっと減るんだよ。企業にとっては「サービスの安定稼働」と「エンジニアの残業削減」が同時にかなう夢のツールとも言えるよ。
「K8s」はKubernetesの公式略称。エンジニアの会話や求人票にもよく出てくるから覚えておこう!
⚠️ よくある勘違い
→ DockerとKubernetesを「どちらか一方を選ぶもの」だと思っている人が多い
→ Dockerは「コンテナを作るツール」、Kubernetesは「そのコンテナをまとめて管理するシステム」。料理で例えると、Dockerが「料理を作るシェフ」、Kubernetesが「料理をどのテーブルに出すか管理するホールマネージャー」みたいなイメージで、2つはセットで使うものだよ
[toc]
Kubernetesとは?コンテナ管理の「司令塔」を理解しよう
まずは「コンテナ」の正体を知ろう
Kubernetesを理解するには、まず「コンテナ」を知る必要があるよ。コンテナっていうのは、アプリを動かすためのすべて——プログラムのコード・設定ファイル・必要なライブラリなど——をひとつの箱にまるっと詰め込んだものだよ。
身近な例で言うと、カップラーメンをイメージしてみて。カップラーメンは「麺・スープ・かやく」がぜんぶ入っていて、どこでも同じ味が作れるよね。コンテナも同じで、どのパソコンやサーバーでも「同じ環境で同じように動く」のが最大のメリットなんだ。
昔のアプリ開発では「自分のパソコンでは動いたのに、本番サーバーでは動かない!」という問題が山ほどあったんだよ。コンテナを使えばその問題がほとんどなくなるから、今や開発の現場では当たり前の存在になってるんだ。
コンテナが増えると起きる問題
コンテナが便利なのはわかった。でも実際のサービスは、コンテナ1個では動かないんだよ。
たとえばECサイト(ネットショッピングサイト)を考えてみよう。「商品を表示するコンテナ」「注文を処理するコンテナ」「決済をするコンテナ」「ユーザー情報を管理するコンテナ」…と機能ごとにコンテナが分かれていて、それが複数のサーバー上でたくさん動いてる、ということになるんだ。
これが数十、数百となったとき——
- 「どのコンテナがどのサーバーで動いているか」を把握する
- 「壊れたコンテナを見つけて再起動する」
- 「アクセスが集中したときにコンテナを自動で増やす」
- 「新しいバージョンに更新するときにサービスを止めないようにする」
これを全部人間が手動でやるのは不可能に近いよね。そこで登場するのがKubernetesなんだ。
Kubernetesはオーケストラの「指揮者」
Kubernetesは、たくさんのコンテナをまとめて管理する「オーケストレーター(つまり、全体を調整する司令塔)」だよ。オーケストラの指揮者みたいなイメージで、「あなたはこのサーバーで動いて」「アクセスが増えたから3個に増やして」「そのコンテナが落ちたから自動で再起動して」って指示を自動でやってくれるんだ。エンジニアはKubernetesに「こういう状態にしてほしい」と設定するだけで、あとはKubernetesが勝手にその状態を保ち続けてくれる。これを「宣言的な管理(つまり、手順じゃなくて目標状態を宣言する管理方法)」とも呼ぶよ。
Kubernetesの仕組み:重要な用語を整理しよう
クラスター:Kubernetes世界の「全体」
Kubernetesで管理される一番大きな単位が「クラスター」だよ。クラスターっていうのは、Kubernetesで管理されるサーバー群の全体のことを指すよ。学校全体みたいなイメージかな。
クラスターの中には2種類の役割を持つサーバーがあるんだ:
- コントロールプレーン(マスターノード):司令部。「どのサーバーにコンテナを配置するか」「今の状態が正常かどうか」を判断する頭脳役
- ワーカーノード:実際にコンテナが動く場所。工場の作業員みたいな存在で、コントロールプレーンの指示に従って動く
Podとは:Kubernetesが管理する最小単位
Kubernetesで一番よく聞く単語が「Pod(ポッド)」だよ。PodはKubernetesが管理する最小単位で、1個以上のコンテナをまとめたものなんだ。
「コンテナとPodって何が違うの?」って思うよね。基本的には「1Pod=1コンテナ」のケースが多いんだけど、密接に連携するコンテナをセットにして1つのPodとして扱うこともあるよ。たとえば「アプリ本体のコンテナ」と「ログを収集するサポートコンテナ(サイドカー)」をセットにするイメージ。Podが削除されると中のコンテナも全部なくなるし、Pod内のコンテナは同じネットワーク空間を共有してるから、お互いにlocalhostで通信できるんだ。
DeploymentとService:よく使うリソース
「Deployment(デプロイメント)」は、「このPodを何個動かして、どう管理するか」という設計書のことだよ。「Podを3個常に動かしてね」と設定しておけば、1個落ちたら自動で新しいPodを立ち上げてくれるんだ。
「Service(サービス)」は、複数のPodへの通信をまとめて受け付ける窓口のことだよ。Podは起動するたびにIPアドレスが変わるから、直接Podに通信するのは不便なんだ。Serviceという固定の窓口を作っておけば、裏でPodが入れ替わっても関係なく通信できるんだよ。
Kubernetesの3大メリット:なぜ世界中で使われているのか
①オートスケーリング:需要に合わせて自動でサイズ調整
「オートスケーリング(つまり、負荷に応じてコンテナの数を自動で増減する機能)」はKubernetesの目玉機能だよ。
例えば、ショッピングサイトを運営してたとして、普段は10個のコンテナで十分なのに、年末セールで突然アクセスが10倍になったとする。手動でサーバーを追加してたら間に合わないよね。Kubernetesは負荷を常に監視していて、「混んできた!」と判断したら自動でコンテナを増やしてくれるんだ。
逆に深夜でアクセスが少ないときは自動でコンテナを減らして、クラウドの費用(コスト)も節約してくれるよ。これを「スケールアウト(負荷が増えたときに横に広げる)」「スケールイン(負荷が減ったときに縮める)」と呼ぶんだ。
②セルフヒーリング:障害が起きても自動で立て直す
「セルフヒーリング(つまり、問題が起きたときに自動で自分を修復する機能)」も超重要な機能だよ。
コンテナが何かの原因でクラッシュ(落ちる)したとき、Kubernetesは自動でそのコンテナを再起動してくれるんだ。もしノード(サーバー)そのものが壊れたら、別のノードにコンテナを移動させて、サービスが止まらないように対処してくれる。
「サーバーが落ちた!」って深夜に起こされることがぐっと少なくなるのが、エンジニアにとって最高にうれしいポイントだよ。人間が気づく前にKubernetesが勝手に直してることも多いんだ。
③ローリングアップデート:止めずにバージョンアップ
新しいバージョンのアプリに更新するとき、「サービスを停止してアップデート」ってやると、その間ユーザーはサービスを使えないよね。Kubernetesの「ローリングアップデート」を使えば、古いコンテナを少しずつ新しいコンテナに入れ替えていくから、ダウンタイム(つまり、サービスが止まっている時間)ゼロで更新できるんだ。
しかも、新しいバージョンで不具合が起きたら「ロールバック(以前の安全なバージョンに戻すこと)」をコマンド1発でできるよ。「やっぱり元に戻して!」が簡単にできるのは本当に心強いよね。
DockerとKubernetesの違い:役割をきちんと理解しよう
Dockerは「コンテナを作るツール」
「Docker(ドッカー)」はコンテナを作って動かすためのツールだよ。「Dockerfile」というレシピを書いて、そこから「コンテナイメージ(つまり、コンテナの設計図)」を作り、その設計図からコンテナを起動する、という流れで使うんだ。
料理で例えると、Dockerは「レシピを書いて料理を作るシェフ」みたいな存在だね。料理(コンテナ)を作ることが専門なんだ。
Kubernetesは「コンテナをまとめて管理するシステム」
一方のKubernetesは、Dockerで作ったコンテナを「どのサーバーで動かすか」「何個動かすか」「壊れたらどうするか」を管理するシステムだよ。
同じ料理の例えで言うと、Kubernetesは「シェフが作った料理をどのテーブルに運ぶか管理して、注文が増えたら料理を増やす指示を出して、食材が切れたら補充を手配して…という全体を仕切るホールマネージャー」みたいなものだよ。2つは「作る役割」と「管理する役割」でキッチリ分かれてるんだ。
最近はDockerとKubernetesをセットで使うのが標準
「DockerかKubernetesか」という選択じゃなくて、「DockerでコンテナイメージをビルドしてKubernetesで動かす」というのが現代の標準的な構成だよ。ちなみに最近はDockerの代わりに「containerd(コンテナディー)」や「Podman(ポッドマン)」が使われるケースも増えてきたけど、Kubernetesと組み合わせて使うという考え方は同じだよ。
Kubernetesを実際に使うには?環境の選び方と基本コマンド
まずはローカルで試してみよう
「Kubernetesを試してみたい!」という場合は、自分のパソコン(ローカル環境)に構築できるツールがあるよ。
- Minikube(ミニキューブ):1台のパソコンの中にKubernetesのクラスターを作ってくれるツール。学習用に最適で、インストールも比較的簡単だよ
- kind(Kubernetes IN Docker):Dockerのコンテナの中にKubernetesを動かすツール。自動テスト(CI)でのテストにもよく使われるよ
- Docker Desktop:WindowsやMacで使えるDockerのGUIツールで、設定からKubernetesを有効にするだけで使えるから手軽だよ
本番環境ならマネージドKubernetesが現実的
実際のサービスで使うなら、クラウドが提供する「マネージドKubernetes(つまり、面倒なインフラ管理をクラウド側がやってくれるKubernetes)」を使うのが現実的だよ。
- GKE(Google Kubernetes Engine):Googleが提供。Kubernetesを作ったGoogleだけあって機能が豊富で、自動アップグレードなどの管理機能も充実してるよ
- EKS(Amazon Elastic Kubernetes Service):AWSが提供。AWSの他のサービスとの連携が強くて、AWS環境で開発している会社に人気だよ
- AKS(Azure Kubernetes Service):Microsoftが提供。Azure環境との親和性が高くて、Windowsコンテナにも対応してるよ
操作に使う「kubectl」コマンドを覚えよう
Kubernetesを操作するときに使うのが「kubectl(クーブシーティーエル、またはクーブクーティーエル)」というコマンドラインツールだよ。「kube control」の略で、KubernetesクラスターへのすべてのAPI呼び出しをこのツール経由で行うんだ。
よく使うコマンドをまとめるとこんな感じ:
kubectl get pods:動いているPodの一覧を表示するkubectl describe pod [Pod名]:特定のPodの詳細情報(エラーの原因など)を表示するkubectl apply -f manifest.yaml:設定ファイル(マニフェスト)を適用してリソースを作成・更新するkubectl rollout undo deployment [名前]:デプロイをロールバック(前のバージョンに戻す)するkubectl logs [Pod名]:Podのログ(動作記録)を確認する
最初はコマンドの多さに圧倒されるかもしれないけど、日常的によく使うのはこの10個くらいだから、実際に手を動かしながら少しずつ覚えていくのが一番の近道だよ。Minikubeで環境を作って、公式チュートリアルをひと通りやってみると一気に理解が深まるから、ぜひ試してみてね。
