【Kubernetes】Non Graceful Node Shutdownを理解する

# 【Kubernetes】Non Graceful Node Shutdownを理解する

## 目次
- [1. はじめに](#1-はじめに)
  - [1.1 Kubernetesとは](#11-kubernetesとは)
  - [1.2 Non Graceful Node Shutdownの重要性](#12-non-graceful-node-shutdownの重要性)
- [2. Kubernetesの基礎](#2-kubernetesの基礎)
  - [2.1 ノードとは](#21-ノードとは)
  - [2.2 Podとは](#22-podとは)
  - [2.3 TaintsとTolerationsとは](#23-taintsとtolerationsとは)
  - [2.4 スケジューリングと再スケジューリング](#24-スケジューリングと再スケジューリング)
- [3. Non Graceful Node Shutdownの詳細](#3-non-graceful-node-shutdownの詳細)
  - [3.1 定義と動作原理](#31-定義と動作原理)
  - [3.2 Kubernetes v1.26の新機能](#32-kubernetes-v126の新機能)
  - [3.3 NodeOutOfServiceVolumeDetach](#33-nodeoutofservicevolumedetach)
- [4. Non Graceful Node Shutdownの検証](#4-non-graceful-node-shutdownの検証)
  - [4.1 検証環境の構築](#41-検証環境の構築)
  - [4.2 検証プロセス](#42-検証プロセス)
  - [4.3 検証結果](#43-検証結果)
- [5. 復旧プロセス](#5-復旧プロセス)
  - [5.1 手動でのTaintの設定](#51-手動でのtaintの設定)
  - [5.2 シャットダウンの正確な判断](#52-シャットダウンの正確な判断)
  - [5.3 復旧の自動化の難しさ](#53-復旧の自動化の難しさ)
  - [5.4 管理者の役割](#54-管理者の役割)
- [6. まとめ](#6-まとめ)
  - [6.1 Non Graceful Node Shutdownの利点](#61-non-graceful-node-shutdownの利点)
  - [6.2 オペレーションのベストプラクティス](#62-オペレーションのベストプラクティス)
- [7. 参考文献](#7-参考文献)

## 1. はじめに
この記事は私が[こちらの記事](https://qiita.com/ysakashita/items/1a7fdf1688819a0a4580)を理解するために調べた内容をまとめた内容になります。
引用ベースにならないように注意しています。

### 1.1 Kubernetesとは
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、および運用を自動化するためのオープンソースプラットフォームです。多数のノード（物理または仮想マシン）からなるクラスタを構築し、その上でアプリケーションのコンテナを動作させることで、高可用性とスケーラビリティを提供します。

### 1.2 Non Graceful Node Shutdownの重要性
Kubernetesクラスタ内でノードが非正常にシャットダウンすることは、運用上避けられないリスクです。Non Graceful Node Shutdownは、このような状況でのリカバリを助ける機能であり、Kubernetes v1.26でベータ版として導入されました。この機能により、ノードが正常にシャットダウンされなかった場合でも、障害発生時に素早く復旧する手段が提供されます。

## 2. Kubernetesの基礎
### 2.1 ノードとは
ノードは、Kubernetesにおいて、Podが動作するサーバーです。これは物理マシンまたは仮想マシンである可能性があります。

### 2.2 Podと

は
Podは、Kubernetesにおける最小のデプロイ単位で、1つまたは複数のコンテナから構成されます。Podは、同じノード上で動作する複数のコンテナが密接に連携して動作する場合に利用されます。

### 2.3 TaintsとTolerationsとは
TaintsとTolerationsは、Kubernetesにおいて、Podのスケジューリングをコントロールするためのメカニズムです。Taintはノードに設定され、特定のPodをそのノードから排除することができます。TolerationはPodに設定され、特定のTaintが設定されたノードにスケジュールされることを許可します。

### 2.4 スケジューリングと再スケジューリング
Kubernetesのスケジューラーは、新しくデプロイされるPodに対して、リソース要件や他の制約を考慮して、最適なノードを選択します。ノードがダウンした場合、そのノード上で動作していたPodは、他の利用可能なノードに再スケジュールされます。

## 3. Non Graceful Node Shutdownの詳細
### 3.1 定義と動作原理
Non Graceful Node Shutdownは、ノードが非正常にシャットダウンした際に、そのノード上で動作していたPodを他のノードに迅速に再スケジュールする機能です。この機能は、Kubernetes v1.26からベータ版として利用可能です。

### 3.2 Kubernetes v1.26の新機能
Kubernetes v1.26では、NodeOutOfServiceVolumeDetachというFeature Gateが導入されました。これにより、ノードがダウンしても、そのノードに接続されていたボリュームは適切にデタッチされ、他のノードで再アタッチされます。

### 3.3 NodeOutOfServiceVolumeDetach
NodeOutOfServiceVolumeDetachは、Non Graceful Node Shutdownの際に、ボリュームのデタッチと再アタッチを行う機能を制御します。

-- 以下補足 --
Feature Gatesは、Kubernetesの機能を有効または無効にするためのキーです。Kubernetesでは、新しい機能や実験的な機能が追加される際、これらの機能はFeature Gatesを通じて制御されることがあります。Feature Gatesによって、特定の機能の有効化、無効化、または変更ができます。これにより、ユーザーは安定していない、または変更が予定されている機能を試すことができます。

### 使い方
Feature Gatesは、Kubernetesコンポーネント（例えばkube-apiserver、kube-scheduler、kubeletなど）の起動時に、コマンドラインフラグまたは設定ファイルを通じて設定されます。

例えば、kubeletを起動する際に、特定のFeature Gateを有効にするには、以下のようにコマンドラインフラグを設定します。

```sh
kubelet --feature-gates=FeatureName=true
```

ここで`FeatureName`は有効にしたいFeature Gateの名前です。また、`=true`を`=false`に変更することで、特定のFeature Gateを無効にすることもできます。

-- 補足終了 --

### ステージング
Feature Gatesの機能は、通常、以下のステージング・フェーズを経ます。

1. **Alpha**: これは、デフォルトで無効になっている機能です。バグが含まれている可能性があり、テストとフィードバックの収集が目的です。
2. **Beta**: 機能はデフォルトで有効になりますが、まだバグが存在する可能性があります。このステージでは、広範なテストとフィードバックが求められます。
3. **GA (General Availability)**: これは、機能が安定版に達したことを意味します。デフォルトで有効であり、Feature Gateのフラグを使用せずとも利用できます。

### 注意点
Feature Gatesは、通常、特定のKubernetesのバージョンでのみ利用可能です。Kubernetesのバージョンがアップグレードされると、一部のFeature Gatesは変更され、削除され、またはGAに昇格します。したがって、クラスターをアップグレードする際は、利用しているFeature Gatesとそのステータスを確認することが重要です。

## 4. Non Graceful Node Shutdownの検証
### 4.1 検証環境の構築
実際にNon Graceful Node Shutdownの動作を確認するためには、検証環境の構築が必要です。Kubernetesクラスタをセットアップし、複数のノードとPodをデプロイして、検証プロセスを実行します。

### 4.2 検証プロセス
1. 一部のノードでOS panicを起こし、そのノードをシャットダウンします。
2. シャットダウンしたノード上のPodがterminating状態になることを確認します。
3. tolerationを持たない既存のPodに対して、taintを設定し、node内のpodを強制的にterminating状態にします。

### 4.3 検証結果
Non Graceful Node Shutdownが有効である場合、nodeのシャットダウンが安全に行われ、別のnodeでpodがスケジュールされることが確認できます。これにより、障害が発生した場合でも、クラスタ内のサービスが迅速に復旧されることが期待されます。

## 5. 復旧プロセス
### 5.1 手動でのTaintの設定
ノードがダウンした際に、管理者が手動でtaintを設定することで、該当ノード内のpodを強制的にterminating状態にすることができます。

### 5.2 シャットダウンの正確な判断
ノードがシャットダウンしたかどうかを正確に判断することは、復旧プロセスにおいて重要です。シャットダウンが正確に判断されることで、復旧プロセスがスムーズに進行し、サービスのダウンタイムを最小限に抑えることができます。

### 5.3 復旧の自動化の難しさ
復旧プロセスの自動化は、多くの場合、複雑なプロセスです。管理者は、非正常なノードの状態を正確に判断し、適切な復旧手段を選択する必要があります。

### 5.4 管理者の役割
Kubernetesクラスタの管理者は、Non Graceful Node Shutdownの機能を理解し、障害が発生した際に迅速に対応できるよう、適切な知識とスキルを身につける必要があります。

## 6. まとめ
### 6.1 Non Graceful Node Shutdownの利点
Non Graceful Node Shutdownは、ノードが非正常にシャットダウンした際に、クラスタの復旧を助ける重要な機能です。この機能により、サービスの可用性が向上し、ダウンタイム

が最小限に抑えられます。

### 6.2 オペレーションのベストプラクティス
Kubernetesクラスタの運用者は、この機能を活用して、障害時の復旧を迅速かつ効率的に行う必要があります。また、Non Graceful Node Shutdownの検証やテストを定期的に行い、復旧プロセスを最適化することが重要です。

## 7. 参考文献
- [Kubernetes公式ドキュメント](https://kubernetes.io/docs/)
- [Kubernetes v1.26 リリースノート](https://kubernetes.io/blog/2022/12/07/kubernetes-1-26-release-announcement/)
- [Kubernetes: Non Graceful Node Shutdownの動作検証](https://qiita.com/ysakashita/items/1a7fdf1688819a0a4580)