1日で分かる！Kubernetesの基本と実装テクニック①

# はじめに

Kubernetes（クバネティス）は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのプラットフォームです。
このチュートリアルでは、Kubernetesの基本的な概念から、ローカル環境でのセットアップ、シンプルなアプリケーションのデプロイまでを解説します。

## 前提条件

- **OS**: Windows, macOS, または Linux
- **仮想化ソフトウェア**: VirtualBox, VMware, または他のサポートされた仮想化ツール（Minikubeを使用する場合）
- **基本的なコマンドライン操作の知識**

## Kubernetesとは

Kubernetesは、コンテナ化されたアプリケーションの自動デプロイ、スケーリング、管理を行うオープンソースのプラットフォームです。
Googleによって開発され、現在はCloud Native Computing Foundation（CNCF）によって管理されています。
Kubernetesは、複数のホスト上で動作するコンテナを効率的に管理し、高い可用性とスケーラビリティを提供します。

### 主な特徴

- **自動デプロイとロールバック**
- **サービスディスカバリとロードバランシング**
- **ストレージオーケストレーション**
- **自動スケーリング**
- **自己修復機能**
- **シークレットと構成管理**

### Kubernetesアーキテクチャ

Kubernetesのアーキテクチャは、マスターコンポーネントとノードコンポーネントで構成されています。
以下の図は、Kubernetesクラスタの基本的な構成を示しています。

```mermaid
graph TD
    subgraph Kubernetes Cluster
        Master(Master Node)
        API(API Server)
        Controller(Controller Manager)
        Scheduler(Scheduler)
        etcd(etcd)
        
        Worker1(Worker Node 1)
        Worker2(Worker Node 2)
        Worker3(Worker Node 3)
        
        Master --> API
        Master --> Controller
        Master --> Scheduler
        Master --> etcd
        API --> Worker1
        API --> Worker2
        API --> Worker3
    end
```

## ローカル環境へのセットアップ

このチュートリアルでは、ローカルマシンにKubernetesクラスタをセットアップするためにMinikubeを使用します。
Minikubeは、ローカル開発環境でKubernetesを実行するためのツールです。

### Minikubeのインストール

1. **仮想化ソフトウェアのインストール**

   Minikubeは仮想マシン上でKubernetesを実行するため、仮想化ソフトウェアが必要です。
   ここではVirtualBoxを例にします。

   - [VirtualBoxのダウンロード](https://www.virtualbox.org/wiki/Downloads)からインストーラーをダウンロードし、インストールします。

2. **Minikubeのインストール**

   - **macOS**:

     ```bash
     brew install minikube
     ```

   - **Windows**:

     ```powershell
     choco install minikube
     ```

   - **Linux**:

     ```bash
     curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
     sudo install minikube-linux-amd64 /usr/local/bin/minikube
     ```

### kubectlのインストール

`kubectl`はKubernetesクラスタを操作するためのコマンドラインツールです。

- **macOS**:

  ```bash
  brew install kubectl
  ```

- **Windows**:

  ```powershell
  choco install kubernetes-cli
  ```

- **Linux**:

  ```bash
  curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  chmod +x kubectl
  sudo mv kubectl /usr/local/bin/
  ```

### Minikubeの起動

Minikubeを起動してKubernetesクラスタを作成します。
※このときに、Dockerを起動しておいてください。

```bash
minikube start
```

起動が完了すると、`kubectl`を使用してクラスタを操作できるようになります。

```bash
kubectl cluster-info
```

## 基本的な概念

Kubernetesを理解するためには、以下の基本的な概念を押さえておくことが重要です。

### クラスタとノード

- **クラスタ**: Kubernetesの実行環境。複数のノード（物理または仮想マシン）で構成されます。
- **ノード**: クラスタ内の単一のマシン。各ノードはKubernetesのコンポーネント（kubelet、コンテナランタイムなど）を実行します。

```mermaid
graph LR
    Cluster[Kubernetes Cluster]
    Node1[Node 1]
    Node2[Node 2]
    Node3[Node 3]
    
    Cluster --> Node1
    Cluster --> Node2
    Cluster --> Node3
```

### Pod

PodはKubernetesにおける最小のデプロイメント単位で、1つ以上のコンテナを含みます。
コンテナは同じネットワーク名前空間とストレージを共有します。

```mermaid
graph TB
    Pod[Pod]
    Container1[Container 1]
    Container2[Container 2]
    
    Pod --> Container1
    Pod --> Container2
```

### Deployment

DeploymentはPodの宣言的な更新を管理します。
アプリケーションのバージョンアップやスケーリングを簡単に行うことができます。

```mermaid
graph LR
    Deployment[Deployment]
    ReplicaSet[ReplicaSet]
    Pod1[Pod 1]
    Pod2[Pod 2]
    
    Deployment --> ReplicaSet
    ReplicaSet --> Pod1
    ReplicaSet --> Pod2
```

### Service

ServiceはPodへの安定したネットワークアクセスを提供します。
ロードバランシングやサービスディスカバリの機能を持っています。

```mermaid
graph LR
    Service[Service]
    Pod1[Pod 1]
    Pod2[Pod 2]
    
    Service --> Pod1
    Service --> Pod2
```

### Kubernetesリソースの関係

以下の図は、クラスタ内でのKubernetesリソース間の関係を示しています。

```mermaid
graph TD
    Cluster[Kubernetes Cluster]
    Deployment[Deployment]
    ReplicaSet[ReplicaSet]
    Pod[Pod]
    Service[Service]
    
    Cluster --> Deployment
    Deployment --> ReplicaSet
    ReplicaSet --> Pod
    Service --> Pod
```

## シンプルなアプリケーションのデプロイ

ここでは、シンプルな「Hello World」アプリケーションをKubernetesクラスタにデプロイします。

### Hello Worldアプリの作成

まず、簡単なウェブサーバーアプリケーションを用意します。ここでは既存のDockerイメージを使用します。

```yaml
# hello-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello-container
        image: hashicorp/http-echo
        args:
        - "-text=Hello, Kubernetes!"
        ports:
        - containerPort: 5678
```

### Deploymentの作成

上記のYAMLファイルを適用してDeploymentを作成します。

```bash
kubectl apply -f hello-deployment.yaml
```

Deploymentのステータスを確認します。

```bash
kubectl get deployments
kubectl get pods
```

### Serviceの作成とアクセス

次に、Deploymentで作成されたPodにアクセスするためのServiceを作成します。

```yaml
# hello-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-service
spec:
  type: NodePort
  selector:
    app: hello
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5678
      nodePort: 30007
```

Serviceを適用します。

```bash
kubectl apply -f hello-service.yaml
```

Serviceの詳細を確認します。

```bash
kubectl get services
```

Minikubeを使用している場合、以下のコマンドでサービスにアクセスできます。

```bash
minikube service hello-service
```

ブラウザが開き、「Hello, Kubernetes!」と表示されるはずです。

```mermaid
graph LR
    User[ユーザー]
    Service[Service: hello-service]
    Pod1[Pod 1: hello-deployment-xxxx]
    Pod2[Pod 2: hello-deployment-yyyy]
    
    User --> Service
    Service --> Pod1
    Service --> Pod2
```

## アプリケーションのスケーリング

Deploymentを使用すると、簡単にPodの数を増減させることができます。

例えば、Podの数を4にスケールアップするには以下のコマンドを実行します。

```bash
kubectl scale deployment hello-deployment --replicas=4
```

スケーリングの状態を確認します。

```bash
kubectl get deployments
kubectl get pods
```

```mermaid
graph LR
    Deployment[Deployment: hello-deployment]
    ReplicaSet[ReplicaSet]
    Pod1[Pod 1]
    Pod2[Pod 2]
    Pod3[Pod 3]
    Pod4[Pod 4]
    
    Deployment --> ReplicaSet
    ReplicaSet --> Pod1
    ReplicaSet --> Pod2
    ReplicaSet --> Pod3
    ReplicaSet --> Pod4
```

## アプリケーションの更新

Deploymentを使用すると、アプリケーションの新しいバージョンへのローリングアップデートが容易です。

例えば、異なるメッセージを表示するように更新します。

1. `hello-deployment.yaml` を編集し、`args` のテキストを変更します。

   ```yaml
   args:
   - "-text=Hello, Kubernetes! Updated version."
   ```

2. 更新を適用します。

   ```bash
   kubectl apply -f hello-deployment.yaml
   ```

3. ローリングアップデートの進行状況を確認します。

   ```bash
   kubectl rollout status deployment hello-deployment
   ```

4. アプリケーションにアクセスし、メッセージが更新されたことを確認します。

```mermaid
sequenceDiagram
    participant User
    participant Service
    participant Pod1
    participant Pod2
    participant Pod3
    participant Pod4

    User->>Service: HTTPリクエスト
    Service->>Pod1: リクエスト転送
    Service->>Pod2: リクエスト転送
    Service->>Pod3: リクエスト転送
    Service->>Pod4: リクエスト転送
```

## クリーンアップ

ローカル環境のクラスタとリソースを削除してクリーンアップします。

```bash
kubectl delete -f hello-service.yaml
kubectl delete -f hello-deployment.yaml
minikube stop
minikube delete
```

## まとめ

このチュートリアルでは、Kubernetesの基本的な概念からローカル環境でのセットアップ、シンプルなアプリケーションのデプロイ、スケーリング、更新までを学びました。
Kubernetesは非常に強力で柔軟なプラットフォームであり、実際の運用環境ではさらに多くの機能やベストプラクティスがあります。

次のステップとして、Persistent Volumes、ConfigMaps、Secrets、Helmなどの高度な機能を学ぶことをお勧めします。

---

**参考資料**

- [公式Kubernetesドキュメント](https://kubernetes.io/ja/docs/)
- [Minikube公式サイト](https://minikube.sigs.k8s.io/docs/)
- [kubectl公式ドキュメント](https://kubernetes.io/docs/reference/kubectl/)

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/