Deschedulerやあれこれを調べた

### **Deschedulerやあれこれを調べた**

### 目次
- [1. はじめに](#1-はじめに)
  - [1.1 Deschedulerの概要](#11-deschedulerの概要)
  - [1.2 Kubernetesの基礎知識](#12-kubernetesの基礎知識)
- [2. Kubernetesの基礎概念](#2-kubernetesの基礎概念)
  - [2.1 Pod](#21-pod)
  - [2.2 Node](#22-node)
  - [2.3 Replica](#23-replica)
  - [2.4 Node Pool](#24-node-pool)
- [3. Deschedulerの重要性](#3-deschedulerの重要性)
  - [3.1 リソースの最適化](#31-リソースの最適化)
  - [3.2 クラスタのパフォーマンス向上](#32-クラスタのパフォーマンス向上)
  - [3.3 アプリケーションの可用性向上](#33-アプリケーションの可用性向上)
- [4. PodDisruptionBudget（PDB）](#4-poddisruptionbudget（pdb）)
  - [4.1 PDBの概要と設定](#41-pdbの概要と設定)
  - [4.2 PDBの制約](#42-pdbの制約)
  - [4.3 厳しいPDB設定の影響](#43-厳しいpdb設定の影響)
- [5. ノードのドレイン](#5-ノードのドレイン)
  - [5.1 ドレインの概要](#51-ドレインの概要)
  - [5.2 ドレインのプロセス](#52-ドレインのプロセス)
  - [5.3 ドレイン時の問題点](#53-ドレイン時の問題点)
- [6. RollingUpdate戦略](#6-rollingupdate戦略)
  - [6.1 RollingUpdateの概要](#61-rollingupdateの概要)
  - [6.2 RollingUpdateのプロセス](#62-rollingupdateのプロセス)
  - [6.3 RollingUpdateとPDB](#63-rollingupdateとpdb)
- [7. スケジューリングと「ピン止め」](#7-スケジューリングと「ピン止め」)
  - [7.1 ノードのピン止め](#71-ノードのピン止め)
  - [7.2 スケジューリングの制約](#72-スケジューリングの制約)
  - [7.3 スケジューリングの最適化](#73-スケジューリングの最適化)
- [8. ユースケース](#8-ユースケース)
  - [8.1 大規模クラスタ](#81-大規模クラスタ)
  - [8.2 高負荷アプリケーション](#82-高負荷アプリケーション)
  - [8.3 リソースの制約がある環境](#83-リソースの制約がある環境)
- [9. 結論](#9-結論)
  - [9.1 Deschedulerの利点](#91-deschedulerの利点)
  - [9.2 適切な使用ケース](#92-適切な使用ケース)
  - [9.3 最後の考慮事項](#93-最後の考慮事項)
- [10. 参考資料](#10-参考資料)

### 1. はじめに
#### 1.1 Deschedulerの概要
Deschedulerは、Kubernetesクラスタ内で動作するPodのスケジューリング最適化を支援するツールです。クラスタ内のリソース使用を効率的に行うために、定期的にPodを適切なノードに再スケジューリングします。これにより、リソースの適切な分散とクラスタの安定性が向上します。

#### 1.2 Kubernetesの基礎知識
Kubernetes（K8s）は、コンテナオーケストレーションプラットフォームです。K8sでは、Podと呼ばれる単位でアプリケーションがデプロイされます。また、Nodeとは、Podが実行されるワーカーマシンを指します。これらの基礎知識は、Deschedulerの動作や重要性を理解する上で不可欠です。

### 2. Kubernetesの基礎概念
#### 2.1 Pod
Podは、

Kubernetesでの最小実行単位で、一つまたは複数のコンテナから構成されます。Podは、Node上にスケジューリングされ、実行されます。

#### 2.2 Node
Nodeは、Kubernetesクラスタに参加するワーカーマシンです。各Nodeには、複数のPodが配置されます。

#### 2.3 Replica
Replicaは、Podのコピーを複数起動することで、アプリケーションの可用性を向上させます。K8sでは、ReplicaSetを用いてReplicaの数を管理できます。

#### 2.4 Node Pool
Node Poolは、同じ設定のNodeのグループです。異なるリソース要件やユースケースに対応するために、クラスタ内に複数のNode Poolを持つことができます。

### 3. Deschedulerの重要性
#### 3.1 リソースの最適化
Deschedulerは、Podの配置を最適化することで、リソースの使用効率を向上させます。これにより、無駄なリソース使用を減少させ、コストの節約が期待できます。

#### 3.2 クラスタのパフォーマンス向上
Podの適切な配置により、ノード間の負荷のバランスが保たれ、クラスタ全体のパフォーマンスが向上します。

#### 3.3 アプリケーションの可用性向上
Deschedulerは、クラスタのリソースを適切にバランスさせることで、アプリケーションのダウンタイムを減少させます。これにより、アプリケーションの可用性が向上します。

### 4. PodDisruptionBudget（PDB）
#### 4.1 PDBの概要と設定
PodDisruptionBudget（PDB）は、Podのダウンタイムを制御するためのポリシーです。PDBを設定することで、同時にダウンするPodの最大数や割合を定義できます。

```yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: example-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: example-app
```

#### 4.2 PDBの制約
PDBには、設定によってPodの再スケジューリングを防ぐ可能性があります。これは、特にDeschedulerのようなツールを使用する際に注意が必要です。

#### 4.3 厳しいPDB設定の影響
厳しいPDB設定は、ノードのドレインや、RollingUpdate時に問題を引き起こす可能性があります。適切なPDB設定を行うことで、これらの問題を回避できます。

### 5. ノードのドレイン
#### 5.1 ドレインの概要
ノードのドレインは、ノードから全てのPodを安全に削除するプロセスです。このプロセスには、Podの再スケジューリングと再起動が含まれます。

```sh
kubectl drain <node-name>
```

#### 5.2 ドレインのプロセス
ドレインプロセスでは、まず対象ノードを「不可用」にマークし、新しいPodのスケジューリングを防ぎます。次に、ノード上のPodを他のノードに再スケジューリングします。

#### 5.3 ドレイン時の問題点
ドレイン時には、PDBやその他の制約により、Podの削除が遅れるか、またはブロックされる可能性があります。これを解決するためには、PDBの調整や制約の見直しが必要です。

### 6. RollingUpdate戦略
#### 6.1 RollingUpdateの概要
RollingUpdateは、アプリケーションの新バージョンを段階的にデプロ

イする方法です。これにより、ダウンタイムを最小限に抑えながらアップデートを適用できます。

#### 6.2 RollingUpdateのプロセス
RollingUpdateプロセスでは、新しいPodのインスタンスが作成され、古いインスタンスが削除されます。このプロセスは、全てのインスタンスが更新されるまで続きます。

#### 6.3 RollingUpdateとPDB
PDBは、RollingUpdate中にも適用されます。したがって、PDBの設定はRollingUpdateの速度や成功に影響を与えます。

### 7. スケジューリングと「ピン止め」
#### 7.1 ノードのピン止め
ノードのピン止めは、Podを特定のノードに「固定」するプロセスです。これにより、特定のPodが特定のノードでのみ実行されるようになります。

#### 7.2 スケジューリングの制約
スケジューリング制約は、Podがスケジュールされるノードを制限するルールです。これには、Node AffinityやTaints&Tolerationsなどが含まれます。

#### 7.3 スケジューリングの最適化
Deschedulerは、これらの制約を尊重しながら、Podの再スケジューリングを行います。これにより、クラスタの全体的なリソース利用の最適化が実現されます。

### 8. ユースケース
#### 8.1 大規模クラスタ
大規模なKubernetesクラスタでは、リソースの不均衡が生じやすいです。Deschedulerは、大規模クラスタの管理を助け、リソース利用の最適化を実現します。

#### 8.2 高負荷アプリケーション
高負荷アプリケーションでは、リソースの需要が大きく変動する可能性があります。Deschedulerは、これらの変動に柔軟に対応し、パフォーマンスの最適化をサポートします。

#### 8.3 リソースの制約がある環境
リソースの制約がある環境では、リソースの有効利用が重要です。Deschedulerは、リソースの制約がある環境でのリソース使用の最適化を実現します。

### 9. 結論
#### 9.1 Deschedulerの利点
Deschedulerは、Podの再スケジューリングを通じて、クラスタのリソース使用の最適化、パフォーマンスの向上、そしてアプリケーションの可用性の向上を実現します。

#### 9.2 適切な使用ケース
大規模クラスタ、高負荷アプリケーション、リソースの制約がある環境など、様々なユースケースでDeschedulerの利用が検討されます。

#### 9.3 最後の考慮事項
PDBやスケジューリング制約など、Deschedulerの動作に影響を与える要素を適切に設定し、管理することが重要です。

### 10. 参考資料
- [Descheduler GitHub](https://github.com/kubernetes-sigs/descheduler)
- [Kubernetes公式ドキュメント](https://kubernetes.io/docs/concepts/)