Kubernetes における Pod と ノードの違いと役割


Kubernetes（K8s）では、**Pod** と **ノード（Node）** はコンテナの管理やスケーリングにおいて重要な概念です。それぞれの役割と違いを詳しく解説します。

---

## **1. Podとは？**
### ✅ **概要**
- **Pod は Kubernetes の最小デプロイ単位**。
- **1つ以上のコンテナを内包**し、ストレージやネットワークを共有する。
- **同じ Pod 内のコンテナはローカル通信が可能**（`localhost` で接続）。
- **Pod は基本的にノード内で動作する**。

### ✅ **Podの構成**
| **構成要素** | **説明** |
|-------------|----------|
| **コンテナ** | Pod 内で動作するアプリケーション（通常はDockerコンテナ） |
| **ストレージ (Volume)** | Pod 内でデータを永続化するためのストレージ |
| **ネットワーク** | Podごとに1つのIPアドレスを持つ |
| **メタデータ** | Pod の名前やラベル、アノテーションなど |

### ✅ **Podの特徴**
1. **単一コンテナのPod**  
   - 1つのコンテナのみを持つ → **一般的な構成**。
   ```yaml
   apiVersion: v1
   kind: Pod
   metadata:
     name: single-container-pod
   spec:
     containers:
       - name: my-app
         image: nginx
   ```

2. **マルチコンテナのPod**  
   - **複数のコンテナが1つのPod内で連携**（例: Webサーバー + サイドカー）。
   ```yaml
   apiVersion: v1
   kind: Pod
   metadata:
     name: multi-container-pod
   spec:
     containers:
       - name: web-server
         image: nginx
       - name: sidecar
         image: redis
   ```

---

## **2. ノード（Node）とは？**
### ✅ **概要**
- **Kubernetes クラスタを構成する物理 or 仮想マシン**。
- **Pod をスケジュールし、実行する役割**を持つ。
- **Master（コントロールプレーン）と Worker（ワーカーノード） に分かれる**。

### ✅ **ノードの種類**
| **ノードの種類** | **役割** |
|----------------|----------|
| **マスターノード（Control Plane）** | クラスター全体の管理・スケジューリングを行う |
| **ワーカーノード（Worker Node）** | Pod を実行するマシン |

### ✅ **ノードの構成**
| **コンポーネント** | **説明** |
|------------------|----------|
| **Kubelet** | ノード上で動作し、Pod の作成・管理を担うエージェント |
| **Kube Proxy** | ノード間のネットワークを管理 |
| **Container Runtime** | コンテナを実行する環境（Docker, containerd） |

✅ **ノードの確認コマンド**
```bash
kubectl get nodes
```

---

## **3. Pod と ノード の関係**
- **ノードは Pod をホストする（1つのノードに複数のPodが存在可能）**。
- **Pod はノード内でスケジューリングされ、ノードのリソースを使用して動作する**。
- **ノードがダウンすると、そのノード上のPodは別のノードに再スケジュールされる**（冗長性確保）。

✅ **関係性のイメージ**
```
+------------------- Kubernetes Cluster -------------------+
|  +----------------+      +----------------+      +----------------+  |
|  |   Node 1       |      |   Node 2       |      |   Node 3       |  |
|  | +-----------+  |      | +-----------+  |      | +-----------+  |  |
|  | |  Pod A    |  |      | |  Pod C    |  |      | |  Pod E    |  |  |
|  | +-----------+  |      | +-----------+  |      | +-----------+  |  |
|  | |  Pod B    |  |      | |  Pod D    |  |      | |  Pod F    |  |  |
|  | +-----------+  |      | +-----------+  |      | +-----------+  |  |
|  +----------------+      +----------------+      +----------------+  |
+-----------------------------------------------------------------------+
```

✅ **Pod のノード割り当てを確認**
```bash
kubectl get pod -o wide
```

---

## **4. Pod と ノード のスケーリング**
### ✅ **Pod のスケール（HPA）**
```bash
kubectl scale deployment my-app --replicas=5
```

### ✅ **ノードのスケール（Cluster Autoscaler）**
```bash
gcloud container clusters update my-cluster --enable-autoscaling --min-nodes=1 --max-nodes=10 --node-pool my-node-pool
```

---

## **5. まとめ**
| **要素** | **役割** | **スケーリング方法** |
|---------|---------|----------------|
| **Pod** | 最小デプロイ単位、コンテナをホスト | HPA（Horizontal Pod Autoscaler） |
| **ノード** | Podを実行するマシン | Cluster Autoscaler |

Pod は **Kubernetes の基本単位** であり、ノードは **Pod を実行するためのリソース** を提供します。これらを適切に管理することで、スケーラブルなアプリケーションを構築できます！