このトピックでは、データディスクに影響を与えずにノードプールを更新する方法について説明します。 システムは、ノードプールを更新する前に事前チェックを実行します。 事前チェックは、更新に影響を与える可能性のあるリスクを通知します。 ビジネス要件に基づいて、kubelet、オペレーティングシステム、およびコンテナーランタイムを任意の組み合わせで更新できます。
使用上の注意
ノードプールの更新機能を使用するには、ノードプールに少なくとも1つのノードが含まれていることを確認します。
システムがシステムディスクを交換してノードプールを更新すると、ノードプール内のノードがドレインされます。 システムは、ノードのドレイン中に指定されたPodDisruptionBudget (PDB) に基づいてポッドの削除を実行し、ポッドのグレースフルシャットダウン期間は30分です。 ノード上のポッドが30分以内に完全に追い出されない場合でも、ノードは更新されます。 詳細については、「PodDisruptionBudgets」をご参照ください。
ノードプールの更新中は、ノードプールのみをスケールアウトできます。 スケールインは許可されていません。
機能の概要
ノードプールの更新機能では、次のコンポーネントを任意の組み合わせで更新できます。
コンポーネント | 説明 | 更新手順 | 考慮事項 |
kubelet | コントロールプレーンが新しいkubeletバージョンを使用する場合、ノードプール内のすべてのノードのkubeletを新しいバージョンに更新できます。 ノードプールが使用できる新しいkubeletバージョンは、コントロールプレーンで使用されるkubeletバージョンによって異なります。 |
| kubeletの更新ノートの詳細については、「ACKクラスターの手動アップグレード」をご参照ください。 |
オペレーティングシステム | 以下の操作を実行できます。
| [オペレーティングシステムの変更] を選択し、システムディスクを交換してノードプール内のノードを更新できます。 [更新前にスナップショットを作成] を選択すると、ノードプール内のノードのスナップショットを作成できます。 | ノードプール内のノードのオペレーティングシステムを更新または変更するには、システムはノードプール内のノードのシステムディスクをバッチで置き換えます。 そのため, ノードプールを更新する前に, 重要なデータをシステムディスクに保存したり, バックアップしたりしないでください。 データディスクは更新の影響を受けません。 |
コンテナランタイム | 新しいコンテナランタイムのバージョンが利用可能な場合は、ノードプール内のノードのコンテナランタイムを新しいバージョンに更新できます。 | [Runtime Update] を選択します。
[更新前にスナップショットを作成] を選択すると、ノードプール内のノードのスナップショットを作成できます。 |
|
システムがノードプール内のノードのシステムディスクを置き換えると、システムはノードプール構成を使用してノードコンポーネントパラメーターをレンダリングします。 これにより、ノードコンポーネントとノードプールの構成が同じになります。
手順
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ノードプール ページで、更新するノードプールを見つけ、[操作] 列の [詳細] > アップグレード を選択します。アップグレード
更新項目 (ノードOS、コンテナランタイム、およびkubelet) を選択し、パラメーターを設定して、事前チェック をクリックします。 事前チェックが完了したら、[更新の開始] をクリックします。
次の内容では、一括更新ポリシーについて説明します。
更新方法
バッチあたりの最大ノード数: バッチ内で同時に更新できるノードの最大数を指定できます。 最大値: 10。 詳細については、「インプレース更新とシステムディスクの交換による更新」をご参照ください。
自動一時停止ポリシー: 更新を一時停止するか、一時停止の頻度を設定するかを指定します。 [自動] を選択すると、各バッチのヘルスステータスを監視できます。
バッチ間の間隔: 自動一時停止ポリシーが設定されていない場合、バッチ間の間隔を設定するかどうかを選択できます。 バッチ間の間隔は5〜120分に設定できます。
説明クラスターが事前チェックに合格しなかった場合、または事前チェックの結果に警告が含まれている場合は、クラスターの問題の解決方法に関する提案を参照して問題を解決するか、[詳細の表示] をクリックして [レポート] ページで詳細情報を表示します。
次のステップ
更新プロセス中に、[イベントローテーション] セクションで次の操作を実行できます。
更新を一時停止または再開する: 更新を一時停止または再開する場合は、[一時停止] または [続行] をクリックします。
ノードプールの更新を一時停止した後は、操作を実行しないでください。 さらに、できるだけ早く更新を再開して完了することをお勧めします。 更新が7日を超えて一時停止されると、システムは自動的に更新プロセスを終了します。 更新処理中に生成されたイベントおよびログデータも削除されます。
[一時停止] をクリックすると、kubeletとコンテナーのランタイムを更新後にロールバックできなくなります。 使用する元のOSイメージがノードプールでサポートされている場合は、更新後にOSイメージのみをロールバックできます。
更新をキャンセルする: 更新をキャンセルする場合は、[キャンセル] をクリックします。
[キャンセル] をクリックすると、更新がキャンセルされます。 ただし、この操作では、kubeletとコンテナランタイムを更新後にロールバックすることはできません。 使用する元のOSイメージがノードプールでサポートされている場合は、更新後にOSイメージのみをロールバックできます。
インプレース更新とシステムディスクの交換による更新
手順
次のセクションでは、インプレース更新とシステムディスクの交換による更新の手順について説明します。 バッチで同時に更新できるノードの最大数を指定できます。 サポートされる最大同時実行数は10です。 バッチごとに更新されるノードの数は、次の順序でバッチごとに増加します。1、2、4、8... 最大同時実行性に達した後、各バッチで更新されるノードの最大数は、最大同時実行性に等しくなります。 最大同時実行性を4に設定すると、最初のバッチで1つのノードが更新され、2番目のバッチで2つのノードが同時に更新され、3番目以降のバッチで4つのノードが同時に更新されます。
次の図は、最大同時実行数がNの場合のバッチ更新プロセスを示しています。バッチごとに更新されるノードの数は、1、2、4、8、... 、Nの順序でバッチごとに増加します。
インプレース更新をノードで実行する方法
更新の前に事前チェックを実行します。 コンテナにttrpc要求処理の失敗やコンテナプロセスが信号に応答しないなどの重大な問題がある場合、更新は一時停止されます。
現在のコンテナーとポッドのステータスをtmp一時ディレクトリに保存します。
containerd、crictl、および関連する構成ファイルをACKが提供する最新バージョンに更新し、containerdを再起動します (この操作は実行中のコンテナーには影響しません) 。 ノードで
/etc/containerd/config.toml
ファイルを変更した場合、この更新により変更内容が上書きされます。kubeletが通常どおり実行され、ノードの準備ができていることを確認します。
システムディスクの交換によるノードの更新方法
ノードはドレインされます。 ノードがドレインされると、スケジュール不可に設定されます。
Elastic Compute Service (ECS) インスタンスが停止しています。
システムディスクが交換され、ディスクIDが変更されます。 システムディスクのカテゴリ、ECSインスタンスのIPアドレス、およびECSインスタンスにバインドされているelastic network Interface (ENI) のMACアドレスは変更されません。
ノードは再初期化される。
ノードが再起動され、準備が整いました。 ノードの準備が整うと、ノードはスケジューリング可能に設定される。
よくある質問
ノードプールを更新した後、ノードプールをロールバックできますか?
kubeletとコンテナーランタイムは、更新後にロールバックできません。 使用する元のOSイメージがノードプールでサポートされている場合は、更新後にOSイメージのみをロールバックできます。
更新中にアプリケーションは影響を受けますか?
インプレース更新: ポッドは再起動されず、アプリケーションは影響を受けません。
システムディスクを交換して更新する: ノードは更新中にドレインされます。 アプリケーションが複数のノードにまたがる複数のポッドで実行され、そのポッドに対してグレースフルシャットダウンが有効になっている場合、アプリケーションは影響を受けません。 グレースフルシャットダウンの詳細については、「Kubernetesでのグレースフルシャットダウンとゼロダウンタイムのデプロイ」をご参照ください。 アプリケーションのポッドを実行するすべてのノードが同じバッチで更新されないようにするには、最大同時実行性をアプリケーションが実行されるポッドの数よりも少ない値に設定することをお勧めします。
バッチでノードを更新するにはどのくらいの時間が必要ですか?
インプレース更新: 5分以内。
システムディスクを交換して更新: スナップショットが作成されていない場合は8分以内。 [更新前にスナップショットを作成] を選択した場合、スナップショットの作成後にACKがノードの更新を開始します。 スナップショット作成のタイムアウト時間は40分です。 スナップショットの作成がタイムアウトすると、ノードの更新が開始されません。 システムディスクにビジネスデータが保存されていない場合は、更新前にスナップショットの作成をクリアすることを推奨します。
ノードの更新時にデータ損失が発生しますか?
システムディスクを交換して実行時の更新を行う場合は、ノードプールを更新する前に、重要なデータをシステムディスクに保存したり、バックアップしたりしないでください。 データディスクは更新の影響を受けません。
ノードのシステムディスクが交換された後、ノードのIPアドレスは変更されますか?
システムディスクが交換された後、ディスクIDは変更されますが、システムディスクのカテゴリ、ECSインスタンスのIPアドレス、およびECSインスタンスにバインドされているENIのMACアドレスは変更されません。 詳細については、「インスタンスのオペレーティングシステムの置き換え」をご参照ください。
空きノードを更新する方法?
ノードプールに追加されないノードは、フリーノードと呼ばれます。 フリーノードは、ノードプール機能がリリースされる前に作成されたクラスターに存在します。 空きノードを更新するには、ノードをノードプールに追加してから、ノードプールを更新します。 ノードプールに空きノードを追加する方法の詳細については、「ノードプールに空きノードを追加する」をご参照ください。
ノードのコンテナランタイムをDockerからcontainerdに変更した後、Dockerディレクトリがまだ存在し、ディスク領域を占有している場合はどうすればよいですか?
クラスター関連のコンテナー、イメージ、およびログに加えて、作成したファイルパスもDockerディレクトリに含まれます。 Dockerディレクトリのデータが不要になった場合は、手動でディレクトリを削除できます。
スナップショットからデータを復元するにはどうすればよいですか?
ノードプールを更新するときに、ノードプール内のノードのスナップショットを作成できます。 デフォルトでは、スナップショットは30日間保持されます。 スナップショットは、保存期間が終了する前に手動で削除できます。 ノードプールの更新後にデータが失われた場合は、次の方法を使用してデータを復元できます。
一括更新を実行してkubeletのみを更新する場合は、スナップショットを使用してディスクをロールバックできます。 詳細については、「スナップショットを使用したディスクのロールバック」をご参照ください。
ノードプール内のノードのシステムディスクを置き換えることによってオペレーティングシステムまたはコンテナランタイムが更新された場合、スナップショットからディスクを作成できます。 詳細については、「スナップショットからのディスクの作成」をご参照ください。