クラウド時代の進展とともに、アプリケーションの開発とデプロイメント方法は大きく変化しています。この変化の中心にあるのが「Kubernetes」です。特に、Kubernetesの基本単位である「Pod」に焦点を当てて理解することは、クラウドネイティブなアプリケーション開発において重要です。
本記事では、KubernetesとPodの基本概念からPodとコンテナの違い、ノードやクラスターとの関係、Pod数の上限や役割などについて詳しく解説します。
目次
Kubernetes Podとは
Kubernetes内で作成・管理できるアプリケーションの最小単位であり、1つ以上のコンテナの集合体をKubernetes Podと呼びます。Kubernetes Podは、「コンテナを実行するための箱」とイメージをすると分かりやすいでしょう。
ここでは、その概要についてさらに詳しく解説します。
Kubernetesとは
Kubernetesは、もともとGoogleが社内で利用していたコンテナ管理ツールを、オープンソース化したものです。コンテナの運用管理と構築の自動化をサポートするためのツールとして利用されています。Kubernetesは一般的に「クバーネティス」や「クーベルネティス」と呼ばれています。
コンテナ技術が発展したことで、開発環境の効率化、リソースの節約が可能になりました。しかし、コンテナが増えすぎて管理が複雑になることや、運用に手間がかかるようになりました。
そこで、コンテナの運用の手間を減らすために作成されたサービスが「Kubernetes」です。クラウドやオンプレミスなど、場所を問わずコンテナを起動でき、高い可用性、スケーラビリティ、負荷分散を実現し、マイクロサービスや分散システムの管理を容易にします。
「Kubernetesとは何か」については、以下の記事で詳しく解説していますので、合わせてご覧ください。
Kubernetesとは?メリット・デメリットや使い方をわかりやすく解説
IT業界で話題のコンテナ技術を管理するためのツールが「Kubernetes」です。しかし、そもそも「Kubernetes」とは何かについて、理解されていない方もいらっしゃるのではないでしょうか。 この記事を読むことで、Kubernetesの基本的な概念から、実際の利用シーンでのメリットとデメリット、そして効果的な使い方までを理解できるようになります。システム管理者や開発者といったエンジニアだけでな…
Podとコンテナの違い
Podとコンテナは、どちらもKubernetesの構成要素で重要な概念であり、異なる役割を持ちます。アプリケーションと、ミドルウェア(そのアプリケーションの実行に必要なすべてのファイル、ライブラリ)をパッケージ化して分離する技術が「コンテナ」です。
一方、Podは一つ以上のコンテナをグループ化し、共有の実行環境を提供するKubernetesの最小単位です。Pod内のコンテナは同じネットワークとストレージを共有しながら動作します。
Podは、コンテナ間の通信とリソース管理を効率化するために設計されています。
ノード・クラスターとの関係
Kubernetesにおいて、Podは基本的な実行単位であり、ノードとクラスターはそれをサポートする構造です。以下は一般的なKubernetes全体の構成図です。
ノードは、Podを実行するための物理的または仮想的なマシンです。各ノードは、複数のPodを実行でき、リソース(CPU、メモリ、ストレージ)を共有します。
クラスターは、複数のノードを組み合わせたもので、Kubernetesに高い可用性と負荷分散機能を提供するために必要な要素です。Kubernetesがコンテナの配置や削除を行うときに直接指示を出すのがクラスターの役割です。
ノードあたりのPod数の上限
Kubernetesは、Pod単位でIPアドレスが割り当てられます。
クラウドサービス「Google Cloud」の中に、GKE(Google Kubernetes Engine)と呼ばれるKubernetesの管理サービスがあります。
GKE Standard クラスタ | GKE Autopilot クラスタ | |
---|---|---|
1クラスタあたりのノード数上限 | 15,000 | 5,000 |
1ノードあたりの Pod 数上限 | 256(デフォルトは110) | 32 |
1クラスタあたりの Pod 数上限 | 200,000 | 25,000 |
1クラスタあたりのコンテナ数上限 | 400,000 | 25,000 |
クラスタ、ノードを作成する際、1ノードあたりの Pod 数上限数を設定できますが、省略した場合は、デフォルトの110が設定されます。
GKE Autopilot クラスタとは、クラスタ構成を Google が管理してくれるサービスです。
3大クラウドサービスの一つ、AWSのKubernetesサービス「EKS(Amazon Elastic Kubernetes Service)」では、1ノードあたりの Pod 数上限が110に設定されています。上限緩和申請をすれば、さらに上限を増やすことも可能です。
また、3大クラウドサービスの一つであるAzureにも「AKS(Azure Kubernetes Service)」があります。AKSのノードあたりの最大Pod数は、250(デフォルトは110)となります。
Podの具体的な役割
Podの役割は以下のようになります。
- リソース共有
Pod内のコンテナ間でネットワークとストレージリソースを共有し、データや通信の効率を高めます。Pod 内に2つのコンテナがあれば、2つのコンテナでIPアドレスやストレージを共有します。 - 負荷分散とサービスディスカバリ
サービスを通じて外部トラフィックの負荷分散を行い、内部サービスディスカバリを容易にします。 - スケーラビリティ
Podを基準にアプリケーションの自動スケーリングを実現します。 - 自己修復機能
障害発生時にPodを自動的に再起動し、アプリケーションの可用性を維持します。
これらの役割により、PodはKubernetesクラスター内での最小単位として機能しています。
ReplicaSet・Deploymentとの違い
PodはKubernetes管理における最小単で、主に複数コンテナのリソースを共有する役割を持ちます。
ReplicaSetは、Kubernetesを冗長化させたいときに利用する機能です。あるコンテナ内で、適切な運用のためにPod数を3つ以上に保ちたいケースで利用します。何らかの操作でPod数が2以下となった場合に、Podを複製し3つ以上となるように自動的に配置しなおします。
Deploymentは、ローリングアップデート・ロールバックを行うための機能です。
たとえば、4つのPodで動いているアプリケーションがあると仮定します。定期アップデート中にアプリケーションが停止しないように、1つのPodのみ停止してアップデートをかけ配置しなおします。その後、2つ目のPodといった流れで、順番に1つずつアップデートしていきます。
デフォルトでは、Pod数の稼働割合が75%以上となるように設定されています。
KubernetesがPodを実行する理由
KubernetesがPodを実行する理由は、主に以下の5つです。
- コンテナのグループ化
関連するコンテナを一つのPod内にグループ化し、アプリケーションやコンテナの管理を簡易にするために実行します。 - リソース共有の最適化
Pod内のコンテナはネットワークとストレージリソースを共有し、効率的なリソース利用を行うために実行されます。 - ネットワークの単純化
Kubernetesでは、PodごとにIPアドレスが割り当てられます。コンテナ間のネットワーク設定が単純化されます。 - 負荷分散と自動修復
Podを通じてアプリケーションの負荷分散、自動修復、スケーリングを実現するために実行されます。 - セキュリティ境界の提供
Podはセキュリティの境界を形成し、コンテナ間の隔離を強化するために作成されます。 - アプリケーションのライフサイクル管理
Podを通じてアプリケーションの更新、デプロイメント、スケーリングの管理が可能になることが、Podが実行される理由の一つです。
上記のように複数のコンテナが効率的に協力し、統一された方法で管理するため、Kubernetes内でPodが実行されます。Podは、コンテナ技術を最大限に活用し、アプリケーションの開発と運用を容易にするための重要な要素となっています。
Podで複数コンテナを実行するメリット
Podで複数のコンテナを実行するメリットは以下の通りです。
- コンテナ同士の連携と通信が可能
Pod内のコンテナはネットワーク共有によって容易に相互通信できます - リソース共有の効率化
Pod内に複数コンテナを置くことで、ネットワークとストレージを共有し、データやリソースの効率化が可能です - Deploymentの簡素化
関連するコンテナを一つのPodとして扱うことで、Deployment管理が単純化されます - スケーリングが容易になる
Pod単位でのスケーリングにより、関連するコンテナ群を一緒にスケールアップ・ダウンできます - サイドカーコンテナで機能拡張が容易に
メインとなるコンテナに足りない機能を拡張、強化するためサブコンテナを動かすことがあります。このサブコンテナをサイドカーコンテナと呼びます。Podを利用することで、サイドカーコンテナの実装や機能の拡張が容易になります - メンテナンスの効率化
Pod内のコンテナを一括で管理・更新することで、メンテナンス作業が効率的になります
上記のメリットがあるため、Kubernetesでは複数のコンテナをPodでまとめて実行しています。
Kubernetes Podの管理・操作
ここまで、Kubernetes Podの概要や使用するメリットを解説してきました。ここからは、実際にKubernetes Podの管理や操作方法についてコマンドを紹介しながら解説していきます。
一般的なKubernetes管理サービスでは、kubectlを使用して Pod を操作します。今回は、kubectlでの操作方法を紹介します。
Podの作成
通常、Podの構成は、YAMLファイルで定義します。YAMLファイルで1つのPodに1つのコンテナを構築する場合は、以下のようにYAMLファイルを記述します。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort:
1つのPodに複数のコンテナを実装する場合は、以下のように記述します。
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: container1
image: nginx
- name: container2
image: ubuntu
コンテナを含んだPodをYAMLファイルで作成した後は、 Kubernetes クラスターの管理用システム上に保存します。
保存したYAMLファイルを、デプロイするためのコマンドは以下の通りです。
kubectl create --save-config -f [Pod定義ファイル]
または
kubectl apply -f [Pod定義ファイル]
例:kubectl apply -f /path/to/pod.yaml
Podのノード指定
特定のハードウェア要件やノードを作成してから、Podを追加したい場合にノード指定のコマンドを使います。KubernetesでPodを特定のノードにデプロイするには、YAMLファイル内でnodeNameを指定します。nodeNameを指定することで、指定したノード上でのみPodが実行されます。
例えば、以下のようにYAMLファイルを記述します。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
nodeName: specific-node-name
「specific-node-name」と記載されている部分を、デプロイしたいnodeNameに変更することで、特定のノード上にPodをデプロイできます。
また、「metadata」内の「name」で、Podの名前を指定できます。
Pod間の通信
Pod間の通信は、マイクロサービス間でのデータのやり取りに必要です。Podは独自のIPアドレスを持ち、これを使って他のPodと通信します。
以下のコマンドを入力し、Pod間の通信を行います。
Pod情報を確認し、通信させたいPodのIPアドレスを確認します。
kubectl get pod
以下のコマンドでコンテナに入ります。
kubectl exec -it [pod名] -- bash
コンテナ内で以下のコマンドを入力し、 curlをインストールします。
root@bastion:/# apt update && apt install -y curl
続けて次のコマンドを入力します。
root@bastion:/# curl <通信したいPodのアドレス>
実行されているPod数の確認
管理上、クラスター内で実行されているPodの数を知ることはとても重要です。Pod数の確認には、kubectl get podsコマンドを使います。このコマンドにより、現在動作中の全Podの一覧が表示されます。
kubectl get podsコマンドは、リソースの監視やトラブルシューティングに役立ちます。
kubectl get pods
実行されているPodの停止
稼働中のPodを停止させなければならないケースもあります。この場合は、kubectl delete pods コマンドを使います。それにより、指定したPodがクラスターから削除され、そのPod上で動作していたプロセスも停止します。
Podの停止は、アップデートやメンテナンス時によく行われます。
kubectl delete pod pod-name
コマンドラインからのPodの削除
アップデートやバージョン変更をして、特定のPodが不要になるケースがあります。また、テスト段階や検証で使用したPodを削除したい場合は、以下のコマンドを入力しPodの削除が可能です。
強制的にすぐ削除したい場合は、以下のコマンドを入力します。
kubectl delete pod [Pod名]
または
kubectl delete -f [作成時のPod定義ファイル]
強制的にすぐ削除したい場合は、以下のコマンドを入力します。
-grace-period 0 -force
まとめ
Kubernetesとは、社内でGoogleが利用していたコンテナ管理ツールを、オープンソース化したものです。コンテナの運用管理と構築の自動化をサポートするためのツールとして利用されています。クラウドやオンプレミスなど、場所を問わずコンテナを起動でき、高い可用性やスケーラビリティ、負荷分散を実現しています。さらに、マイクロサービスや分散システムの管理を容易にします。
Podとコンテナの違いは、どちらもKubernetesの構成要素で重要な概念ですが役割が異なります。コンテナは、アプリケーションと、ミドルウェア(そのアプリケーションの実行に必要なすべてのファイル、ライブラリ)をパッケージ化して分離する技術です。
一方、Podは一つ以上のコンテナをグループ化し、共有の実行環境を提供するKubernetesの最小単位です。Pod内のコンテナは同じネットワークとストレージを共有しながら動作します。Podの役割は、「リソース共有」「負荷分散とサービスディスカバリ」「スケーラビリティ」「自己修復機能」があります。これらの役割により、PodはKubernetesクラスター内での最小単位として機能しています。
コンテナ管理をこれから始めたいお客様に最適な、RancherでKubernetesを簡単に管理できるコンテナサービスと、サーバースペック 95パターン+ディスク容量 10パターンから選択できるクラウドサーバーを提供する国産クラウドプラットフォームです。