run? apply? どう違うの?

## kubectl run と kubectl apply の違い


`kubectl run` と `kubectl apply` は、Kubernetes クラスターにリソースを作成および管理するためのコマンドですが、それぞれの用途や動作が異なります。以下では、その違いを詳細に解説します。

---

### **概要**

- **`kubectl run`**
  - 主に Pod を素早く作成するために使用されます。
  - コマンドライン引数で指定した最小限の設定で Pod を生成します。
  - 手軽に試験環境を作成したいときに便利です。

- **`kubectl apply`**
  - Kubernetes マニフェスト（YAML または JSON ファイル）を使ってリソースを宣言的に作成・更新するために使用されます。
  - 既存リソースの状態をマニフェストに基づいて変更できます。
  - 本番環境では主にこの方法が推奨されます。

---

### **用途の違い**

#### **`kubectl run` の用途**

- 主に開発やデバッグのために使用されます。
- 簡単にコンテナを実行したい場合に便利です。
- 例:
  ```bash
  kubectl run nginx --image=nginx
  ```
  このコマンドは、指定したイメージ（nginx）を基に Pod を作成します。

#### **`kubectl apply` の用途**

- 宣言的にリソースを管理します。
- 一度に複数のリソースを作成・更新できます。
- バージョン管理システムと連携しやすいです。
- 例:
  ```bash
  kubectl apply -f deployment.yaml
  ```
  このコマンドは、マニフェスト（deployment.yaml）に基づいてリソースを作成または更新します。

---

### **使用方法の詳細**

#### **`kubectl run` の詳細**

- コマンド:
  ```bash
  kubectl run <name> --image=<image> [--port=<port>] [--env=<env-vars>] [options]
  ```
- 主な特徴:
  - デフォルトで作成されるのは Pod。
  - Deployment を作成することはできません。
  - 基本的な引数を指定するだけで実行可能です。
- 使用例:
  ```bash
  kubectl run myapp --image=myapp:1.0 --port=8080
  ```
  このコマンドは、`myapp:1.0` イメージを使用してポート 8080 で動作する Pod を作成します。

#### **`kubectl apply` の詳細**

- コマンド:
  ```bash
  kubectl apply -f <manifest-file> [options]
  ```
- 主な特徴:
  - マニフェストに記述されたリソースを作成・更新します。
  - `kubectl diff` コマンドと組み合わせることで変更を事前に確認可能です。
  - 既存リソースがあれば更新、なければ作成する仕組みです。
- 使用例:
  ```bash
  kubectl apply -f pod.yaml
  ```
  `pod.yaml` に定義されたリソースを適用します。

---

### **宣言的管理と命令的管理**

Kubernetes では、リソース管理方法として以下の 2 種類があります。

- **命令的管理（Imperative Management）**:
  - 手動でコマンドを実行してリソースを作成・更新します。
  - 例: `kubectl run`, `kubectl create`, `kubectl delete`。
  - メリット:
    - 手軽で簡単。
    - 少量の変更に適している。
  - デメリット:
    - 設定が履歴管理されない。
    - チームでの作業では非効率。

- **宣言的管理（Declarative Management）**:
  - リソースの状態をマニフェストファイルに記述して管理します。
  - 例: `kubectl apply`。
  - メリット:
    - 設定をコードとしてバージョン管理可能。
    - クラスターの状態を常に一定に保つことができる。
  - デメリット:
    - 初期設定に手間がかかる。

`kubectl run` は命令的管理に分類され、`kubectl apply` は宣言的管理に分類されます。

---

### **サポートの違い**

- Kubernetes のバージョンが上がるにつれ、`kubectl run` の用途は制限されてきました。
  - 以前は Deployment を作成する機能がありましたが、現在は Pod 作成専用になっています。
- `kubectl apply` は現在も積極的に使用されており、Kubernetes の公式ドキュメントでも推奨されています。

---

### **実例・比較**

#### **Pod を作成する例**

- **`kubectl run`**:
  ```bash
  kubectl run nginx --image=nginx
  ```
  - 即座に Pod を作成します。
  - 設定内容はコマンドの引数に依存します。

- **`kubectl apply`**:
  ```yaml
  # pod.yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: nginx
  spec:
    containers:
    - name: nginx
      image: nginx
  ```
  ```bash
  kubectl apply -f pod.yaml
  ```
  - マニフェストに記述された設定に基づいて Pod を作成します。
  - 設定が明確で再利用可能です。

#### **状態の更新**

- **`kubectl run`**:
  - 一度作成したリソースに対しては適用できません。

- **`kubectl apply`**:
  - マニフェストを変更し、再度 `kubectl apply` を実行することでリソースの状態を更新します。

---

### **場面に応じた使用**

#### **`kubectl run` を使用すべき場面**
- 試験的にコンテナをすばやく実行したい場合。
- 複雑な設定が不要な場合。

#### **`kubectl apply` を使用すべき場面**
- 本番環境のリソースを管理する場合。
- 複数のリソースを一括で管理・更新したい場合。
- バージョン管理やチームでの作業が必要な場合。

---

### **結論**

`kubectl run` と `kubectl apply` は、それぞれ異なるユースケースに適したコマンドです。`kubectl run` は単純な Pod 作成に向いており、開発やデバッグで役立ちます。一方、`kubectl apply` は宣言的管理に基づいており、リソースのライフサイクル全体を通して一貫性を保つのに適しています。


### **おわり**

現在、「つくって、壊して、直して学ぶ Kubernetes入門」を読みながら学習を進めてます。頑張ります。

https://www.shoeisha.co.jp/book/detail/9784798183961