Kubernetes(k8s)についてまとめ
こんにちは!
インフラを勉強していると、Kubernetesやk8sという単語をよく見かけます。
Dockerのコンテナを管理しているオーケストレーションシステムということは知っていたのですが、正直「Dockerだけでシステム運用できるのでは?」と思っていました。
そこで今回は、これを機にKubernetesについて調べてみました。
Kubernetesの概要
Kubernetesとは一言でいうと、大量のコンテナを自動で管理・制御するプラットフォーム です。
開発者は1台のサーバーにコンテナを立ち上げるだけでなく、複数のサーバー(ノード)にまたがって動くアプリケーションを扱う必要があります。
Kubernetesは、これを自動的に配置・監視・復旧・スケールしてくれます。
dockerだけではダメなの?なぜ必要?
Docker単体でもアプリをコンテナ化し、環境差をなくして動作させることはできます。
しかし、実際の運用環境では次のような課題があります。
1. コンテナの数が増えると管理が煩雑
複数のサーバー上で動くコンテナを手動で管理するのは困難です。
障害が起きた際に、どのノードにどのコンテナが動いているかを把握するのも大変です。
2. 自動復旧ができない
Docker単体では、コンテナが落ちたときに自動的に復旧させる機構がありません。
そのため、運用担当者が手動で再起動する必要があります。
3. 負荷分散が難しい
コンテナが複数ある場合、トラフィックをうまく分散させるには別途ロードバランサーを構築する必要があります。
4. アップデート時にダウンタイムが発生
Dockerコンテナを新しいバージョンに入れ替える際、サービスを止めない工夫をするのは簡単ではありません。
Kubernetesが解決すること
Kubernetesはこれらの問題を自動化・宣言化によって解決します。
自動復旧(Self-Healing)
Pod(コンテナの単位)が落ちた場合でも、Kubernetesが自動的に再スケジュールして復元します。
「3つのPodを常に稼働させたい」とYAMLで宣言すれば、Kubernetesは常にその状態を維持します。
もし1つのPodが落ちても、自動的に再生成してくれます。
負荷分散(Service)
Serviceリソースを利用することで、複数のPodに自動的にトラフィックを分配します。
これにより、ユーザーから見ると1つのIPにアクセスするだけで、裏側では複数のコンテナに均等に負荷が振り分けられます。
ローリングアップデート
Kubernetesはアプリの新バージョンを停止なしで少しずつ置き換えることができます。
これにより、ユーザーへの影響を最小限にしたリリースが可能です。
自動スケーリング
負荷が高くなった場合、Kubernetesは自動的にPod数を増やし、負荷が下がると自動的に減らすことも可能です。
これは Horizontal Pod Autoscaler(HPA) という仕組みで実現されています。
Kubernetesの構成要素
| コンポーネント | 役割 |
|---|---|
| Pod | コンテナの実行単位(1つまたは複数のコンテナを含む) |
| Node | コンテナが動作する物理または仮想マシン |
| Deployment | Podのデプロイ・スケーリングを管理 |
| Service | Pod間通信や外部公開を制御 |
| Ingress | HTTP/HTTPSルーティングを制御 |
| Namespace | 複数のアプリや環境を論理的に分離 |
| ConfigMap / Secret | 設定情報や機密情報を管理 |
まとめ
ここまでまとめて、複数のコンテナを紐つけてくれたり、ロードバランスや復旧を自動で調整してくれているんだなーというイメージをもてました!
が、正直使ってみなきゃなんともなので、今度触ってみようかなと思います!