Kubernetes ノードをより安全にアップグレードする方法

Kubernetes ノードをより安全にアップグレードする方法

クラスターを新しい Kubernetes バージョンにアップグレードすることに不安を感じていますか?アップグレードを促す理由はいくつかあります。おそらく、次のいずれかを実行したいでしょう。

  • 新しいベータAPIの使用
  • Kubernetes のバージョン更新を必要とする最新機能
  • ソフトウェアを最新の状態に保つためのベストプラクティスに従う

理由が何であれ、アップグレード中のダウンタイム (および不安) を最小限に抑えるために、アップグレード プロセスを見直す価値はあります。

どのコンポーネントをアップグレードする必要がありますか?

Kubernetes クラスターは、一連のノードとコントロール プレーンで構成されます。ワーカーノードは、コンテナ化されたアプリケーションを実行するポッドをホストします。コントロール プレーンは、クラスター内のワーカー ノードとポッドを管理します。

Kubernetes クラスターのコンポーネント (kubernetes.io より)

Kubernetes クラスターをアップグレードするには、次の順序でこれら 2 つのコンポーネントをアップグレードします。

  • コントロールプレーンのアップグレード
  • ワーカーノードのアップグレード

セルフホスト型クラスターとマネージド型クラスターの両方において、コントロール プレーンのアップグレードは非常に簡単です。この投稿では、ワーカー ノードのアップグレードのダウンタイムを最小限に抑えることに焦点を当てます。

ワーカーノードのアップグレード

ワーカーノード上の Kubernetes バージョンをアップグレードするには、次の 2 つの戦略があります。

  • インプレース アップグレード (ローリング アップデートとも呼ばれる)
  • リモートアップグレード

インプレース アップグレードの場合、ノードは 1 つずつドレインされ、ブロックされるため、ノードに新しいポッドがスケジュールされることはありません。次に、ノードを削除し、更新された Kubernetes バージョンで再作成します。新しいノードが起動して実行されると、次のノードが更新されます。この戦略は、次の視覚化アニメーションのようになります。

Kubernetes クラスター内のノードのインプレース アップグレードを示すアニメーション

インプレース アップグレードの利点は、追加のコンピューティング リソース (単一の追加ノード) が最小限で済むことです。この戦略の欠点は、ノードが 1 つずつドレインされ、アップグレードされるため、かなり長い時間がかかる可能性があることです。さらに、ノードのドレイン中にポッドがシャッフルされるため、ポッドを複数回移動する必要がある場合があります。

地理的アップグレードの場合は、新しい Kubernetes バージョンで新しいノード プールを作成します。すべての新しいノードが実行されると、古いノード プールをブロックし、古いノードを 1 つずつドレインしてから、古いノード プールを削除できます。この戦略は以下のアニメーションで視覚化されています。

Kubernetes クラスター内のノードのアウトオブプレース アップグレードを示すアニメーション

オフサイト アップグレードでは、アップグレード期間を短縮する代わりに、コンピューティング リソースを一時的に 2 倍にする必要があります。アップグレード期間の短縮は、新しくアップグレードされたノードの起動時間の並列化とポッドの移動の最小化によるものです。この戦略では、ポッドは古いノードから新しくアップグレードされたノードに移動されます。

コンピューティング リソースの使用率が一時的に増加しても問題ない場合は、オフサイト アップグレード戦略を使用して処理を高速化することをお勧めします。

K8sリソースを構成する

どのワーカー ノードのアップグレード戦略を選択した場合でも、元のノードからアップグレードされたノードにポッドをシャッフルすることになります。リソースが正しく構成されていない場合、ダウンタイムが発生する可能性があります。潜在的な落とし穴をいくつか見てみましょう。

独立ポッド

Pod は、Kubernetes でデプロイ可能な最小のオブジェクトです。これは、クラスター内で実行されているアプリケーションの単一インスタンスを表します。ポッドは一時的なものです。ポッドがノードから削除された場合、ポッドはそれ自体を置き換えません。 Pod は自己修復機能がないため、単一の Pod を直接作成することはお勧めしません。代わりに、Deployment などのコントローラーを使用して、Pod を作成および管理します。

ダウンタイムを最小限に抑えるには、すべてのポッドが ReplicaSet、Deployment、StatefulSet または同様のものによって管理されていることを確認してください。アップグレード後には、個々のポッドを手動で再スケジュールする必要がある場合があります。

展開

クラスター内のポッドのほとんどは、デプロイメントによって制御される可能性があります。デプロイメントは、一意の ID を持たない同一のポッドのグループを表します。デプロイメントでは、アプリケーションの複数のコピーを管理し、いずれかのインスタンスに障害が発生した場合に代替品をデプロイすることで、可用性が向上します。

ダウンタイムをなくすには、アプリケーションに PodDisruptionBudget (PDB) があることを確認してください。 PDB は、同時にシャットダウンできる複製されたアプリケーションのポッドの数を制限することで、より高い可用性を実現します。

たとえば、次の PDB では、停止中 (アップグレードなど) にフロントエンド ラベルを持つポッドの 80% が利用可能である必要があると規定されています。これにより、負荷を処理するレプリカの数が、レプリカの合計数の特定の割合を下回ることがなくなります。

 apiバージョン: ポリシー/ v1
種類: PodDisruptionBudget
メタデータ:
名前: デモ
仕様:
最小利用可能数: 80 %
セレクター:
マッチラベル:
名前: フロントエンド

ノードをアップグレードできるようにするには、複数のレプリカ (少なくともアップグレード中は一時的に) があることを確認する必要があることに注意してください。

デーモンセット

DaemonSet は、すべての (または一部の) ノードがポッドのコピーを実行することを保証します。デーモン セットは通常、ノード監視またはログ収集に使用され、通常はトラフィックを処理しません。これらのユースケースでは、ワーカー ノードのアップグレード中にデータに小さなギャップが生じても通常は許容されます。

ステートフルセット

StatefulSet は、データベースやメッセージ キューなどのステートフル アプリケーションを管理するために使用される Kubernetes コントローラーの一種です。 StatefulSets のアップグレードには、Deployment のアップグレードよりも多くの考慮が必要です。

ダウンタイムをなくすには、次の設定がされていることを確認してください。

  • PodDisruptionBudget を追加します (「デプロイメント」セクションの手順を参照)。クォーラムベースのアプリケーションの場合、実行中のレプリカの数がクォーラムに必要な数 (たとえば、minAvailable: 51%) を下回らないようにします。
  • 複数のコピーがあることを確認してください (少なくともアップグレード中は一時的に)。
  • すべての PersistentVolume を必ず保存してください。
  • 選択ベースのアプリケーションの場合は、準備プローブが構成されていることを確認します。

StatefulSet 潜在的イベント-1

StatefulSet をアップグレードする際の PodDisruptionBudget (PDB) の重要性を説明するために、分散メッセージング システム STAN を使用するサンプル クラスターを考えてみましょう。

STAN は Raft のクォーラムコンセンサスに依存しており、決定にはサーバーの過半数 (> 50%) の同意が必要です。このクラスターの STAN StatefulSet には 5 つのレプリカがあります。レプリカの 2 つに障害が発生しても、STAN は引き続き動作します。ただし、2 つ以上のレプリカに障害が発生すると、STAN はクォーラムを失い、動作を停止します。

サンプル クラスターの STAN StatefulSet には PDB がありません。この構成では、アップグレード中に次の理由でクォーラムが失われる可能性があります。

PDB がないため、制御計画では任意の数の STAN ポッドが中断される可能性があることを示しています。

  • つまり、ノード プールのアップグレードにより、STAN ポッドの 50% 以上が同時に中断される可能性があります。この場合、最初のノードがドレインされると、5 つの STAN ポッドのうち 3 つが直ちに削除されます。
  • 残りの 2 つの STAN ポッドはクォーラムを維持できず、回復不能なデータ損失が発生します。
  • この障害モードは、以下のアニメーションで視覚化されています。 5 つの正方形は 5 つの STAN ポッドを表します。

アップグレード中にクォーラムを失う Raft アプリケーションのアニメーション。 StatefulSet に PDB がありません

この場合、minAvailable: 51% で構成された PDB は、少なくとも 51% の Pod がドレイン ノードから直ちに排除されるようにすることで、クォーラム損失を防ぐことができます。

StatefulSet 潜在的イベント 2

StatefulSet をアップグレードする際の準備状況プローブの重要性を説明するために、同じサンプル クラスターを考えてみましょう。

サンプル クラスターの STAN StatefulSet は、PDB (minAvailable: 51%) とライブネス プローブで構成されていますが、準備プローブがありません。この構成では、アップグレード中に次の理由でクォーラムが失われる可能性があります。

  • コントローラは PDB に従い、特定の時間にダウンしている STAN ノードが半分未満であることを確認します。最初は、ドレイン ノードから 2 つの STAN ポッドのみが削除されます。
  • ただし、準備プローブがないため、中断された STAN ポッドがスケジュールされてアクティブ化されると、コントローラーはさらに多くのポッドを中断できます。
  • 活性チェックは実行中のコンテナを示すことを目的としているため、STAN は Raft ログの読み取りを開始する前 (または終了する前) に自身をアクティブとしてマークします。
  • ただし、2 つの STAN ポッドはまだ Raft ログの読み取りを完了していないため、トラフィックを受け入れる準備ができていません。
  • コントローラーがさらに多くの STAN ポッドに割り込むと、アクティブな STAN ポッドが 50% 以上あるときに、STAN ポッドの 50% 未満が準備完了になる可能性があります (つまり、一部のポッドは Raft ログから状態を回復するのに忙しい)。
  • 残りの 2 つの STAN ポッドはクォーラムを維持できず、回復不能なデータ損失が発生します。

この障害モードは、以下のアニメーションで視覚化されています。 5 つの正方形は 5 つの STAN ポッドを表します。赤い四角は、ポッドがまだアクティブではないことを示します。黄色の四角は、ポッドがまだ準備ができていないことを示します。

アップグレード中にクォーラムを失う Raft アプリケーションのアニメーション。 StatefulSet に準備プローブがありません。

この場合、準備プローブは、新しく作成された STAN ポッドの準備が整うまで、それ以上の STAN ポッドが中断されるのを防ぎます。準備プローブは、/streaming/serverz 監視エンドポイントに HTTP GET リクエストを送信するように構成できます。このエンドポイントは、STAN サーバーの準備が整うまでリクエストに応答しません。

要約する

Kubernetes クラスターのアップグレードは神経を使う作業です。ただし、アップグレード プロセスの基本を理解し、さまざまな Kubernetes リソースを簡単に検討することで、次回のアップグレード時のダウンタイムを最小限に抑えることができるはずです。

<<:  コンテナ技術: クラウドコンピューティングの主要技術

>>:  「リフト アンド シフト」クラウド移行戦略はあなたのビジネスに適していますか?

推薦する

ftpit-$5/KVM/768m メモリ/2 コア/35g ハードディスク/2T トラフィック/incero Dallas

ftpit は、主に VPS 事業を行っている小規模な民間企業です。各 VPS には、Intel S...

racknerd: 米国製大型ハードディスクサーバー、月額 599 ドル、Ryzen7-3700X/32G メモリ/120gSSD+192T HDD

Racknerd は現在、ユタ州のデータ センターで大容量ハード ドライブ サーバー (ストレージ ...

ニュースソースを使用してウェブサイトを最適化する際に避けるべき問題の簡単な分析

ウェブサイトの外部リンクの最適化がますます困難になるにつれて、低コストで高品質の外部リンクを取得する...

企業ネットワークマーケティングのさまざまな側面についての個人的な実践の概要について話す

企業ネットワークマーケティングのさまざまな側面についての個人的な実践の概要について話す序文: どのよ...

タイトルが「放浪者」を引き付けた後、視聴者を維持するにはどうすればよいでしょうか?

顧客がタイトルに惹かれて記事やウェブサイトにアクセスした場合、訪問者を維持するために何を利用すればよ...

アーキテクチャの成長への道: 分散システムの設計方法、Elasticsearch の仕組みをご覧ください

[[269842]]分散システムにはさまざまな種類があり、非常に広範囲にわたります。システムの種類に...

デスクトップ仮想化: 集中型か分散型か?

[[216241]]仮想デスクトップが必要な理由は何ですか? 10 年以上前、デスクトップ仮想化技...

最初のライブストリーミングストック、Inke

データによると、オンラインライブストリーミングのユーザー数は6億3800万人に達し、インターネットユ...

Red Hat、人工知能開発の障害を取り除くOpenShift 4.10をリリース

オープンソース ソリューションの世界的大手プロバイダーである Red Hat は最近、ハイブリッド ...

Weiboマーケティングの見方

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス1. まず、Weiboや...

江新鵬:百度アルゴリズムの概要

Baiduのアルゴリズムについては多くの憶測が飛び交っています。最近、Baiduのアルゴリズム計画の...

電子商取引企業の在庫管理における3つの大きな問題

「私にとって最も辛いのは、廃棄される在庫1000万相当の契約を自らの手で締結したことだ」と、すでに破...

「Lee on line」第1話:外部リンクを拒否するツールとGreen Radishアルゴリズムに関するQ&A

3月12日のウェブマスターネットワーク(www.admin5.com)によると、2月下旬、百度はウェ...