Google CloudがGKEの障害の原因を紹介

Google CloudがGKEの障害の原因を紹介、カーネル修正をGKE 1.33.5以降で提供

公開:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

GKEのKCP VMで、パケットの順序の乱れやEnvoyのhalf-close、Linuxカーネルの不具合が重なり、接続障害が起きました。新しい接続はi/o timeoutで失敗し、3つのうちLinuxカーネルの修正はGKE 1.33.5以降で提供されています。[1]

この記事では、3つの要因が重なって接続の失敗につながった流れと、修正の提供範囲を解説します。i/o timeoutで接続が完了しない症状を調べる場合に、複数の層を見比べる確認方針も編集部が整理しました。

目次
  1. GKE KCP VMの障害で交差した3つの要因
  2. GKE KCP VMで3つの要因が重なる流れ
  3. 障害調査で原因特定につながった確認項目
  4. GKE KCP VMの障害に対する3層の対応
  5. 接続が完了しないi/o timeoutの確認点

GKE KCP VMの障害で交差した3つの要因

正常なTCPスタックはFINを処理してACKを返し、接続を閉じます。障害当時のGKE KCP VMはこの処理を行えず、half-open接続がFIN_WAIT_2の状態で2分を超えて残りました。[1]

PIGvやEnvoy、カーネル6.1の3つの事象

図1 PIGvやEnvoy、カーネル6.1の3つの事象

2分を超える残留は、Private Service ConnectのNAT層がポートを再利用できる長さでした。障害の原因は1つのバグではなく、3つの別々の要因が最悪のタイミングで交差したものです。

3つの要因のうち、Envoyのhalf-closeは不具合ではなく正しい動作です。この動作は、FINが処理されない場合にだけ問題化します。

PIGvでのパケット順序の乱れ

KCP VMのホストNICでは、パケットは順序どおりに届いていました。USPSを通ってPIGv(VMから見た仮想NIC)に現れた時点では、順序が少し入れ替わっていました。

miss-threadでのパケット処理の順序

図2 miss-threadでのパケット処理の順序

順序の乱れの原因は、Private Service Connectのmiss-thread処理です。遅い経路ではproxy protocolヘッダーを追加し、閉じる途中のフローのFINやRSTは、後続のACKと順序が少し前後する場合があります。

KCP VMが実際に受信した並びでは、順序が入れ替わり、クライアントのACKが先に届いてFINが続きました。サーバーは自身のFINを送ってFIN_WAIT_1に入り、その後に現れた古いFINへACKを返すべきでしたが、返しませんでした。

障害当時のKCP VMが受信した順序

図3 障害当時のKCP VMが受信した順序

並びに2回現れるFINのうち古いFINを見ると、順序の入れ替わりにより、クライアントのFINは、サーバーが自身のFINを送った後に届きました。サーバーはFIN_WAIT_1の後にFIN_WAIT_2へ進みましたが、サーバーのカーネルは届いたFINを無視しました。

Envoyのhalf-closeの影響

障害当時、孤立ソケットに限り適用されるtcp_fin_timeoutは、FIN_WAIT_2のソケットが強制的に閉じられるまでの待ち時間を決めるLinuxカーネルのパラメータです。KCP VMでは60秒に設定されていました。

tcp_fin_timeoutの適用の違い

図4 tcp_fin_timeoutの適用の違い

孤立ソケットは、どのプロセスも開いていないソケットです。障害当時のKCP VMでは、Envoyが開いたままのソケットは対象外でした。

Envoyは、KCP VMでkube-apiserverの前段に置かれたプロキシです。shutdown(SHUT_WR)で書き込み側を閉じ、受信のためにソケットを開いたままにするhalf-closeを行っていました。

half-close自体は正当なTCPの動作です。ただし、Envoyが保持する間はカーネルが孤立ソケットと見なさず、ソケットは正しく処理できないFINを待ち続けました。


Python研修一覧はこちら

目的に合うPython研修を一覧形式から探したい方は、ぜひご利用ください。

Python研修を比較する

Java研修一覧はこちら

目的に合うJava研修を一覧形式から探したい方は、ぜひご利用ください。

Java研修を比較する

PHP研修一覧はこちら

目的に合うPHP研修を一覧形式から探したい方は、ぜひご利用ください。

PHP研修を比較する

新入社員研修

目的に合う新入社員研修を一覧形式から探したい方は、ぜひご利用ください。

新入社員研修を比較する

全ての研修からも探したい方はこちら

Linuxカーネル6.1でのFIN破棄

順序が入れ替わったFINでも、健全なカーネルならFIN_WAIT_2で受信したFINを処理してTIME_WAITへ進むはずです。ソケットはいずれ閉じるはずですが、KCP VMでは閉じませんでした。

健全なカーネルのFIN処理の流れ

図5 健全なカーネルのFIN処理の流れ

Linuxカーネル6.1には、RFC 5961の許容範囲内にある古いACKを受けると、tcp_ack()がゼロを返すコード経路がありました。FIN_WAIT_2では、呼び出し元が有効な受信FINを処理しないまま破棄し、接続が無期限に残りました。

この不具合はカーネル6.1から存在し、カーネル6.9.7では修正済みでした。KCP VMはContainer-Optimized OS(COS)の6.1系と6.6系のビルドで動いていたため、バックポートとCOSイメージの更新が必要でした。

不具合を修正したLinuxカーネルのコミットは、upstreamにある795a7dfbc3d9です。作者はEric Dumazet氏です。

GKE KCP VMで3つの要因が重なる流れ

3つの要因は単独では今回の規模の障害にならず、3つが同時に作用して初めて障害が起きたとGoogle Cloudは評価しています。単独と同時の違いは、以下の通りです。[1]

順序の乱れのみ:カーネルは通常FINを処理し、後始末が遅れる程度/half-closeのみ:Envoyの動作は正しく、FINが処理されない場合に問題化/カーネル不具合のみ:一部の接続が残る/カーネル不具合の影響:Private Service Connect NATのポート再利用の圧力がなければ限定的/3つが同時:ソケットがFIN_WAIT_2に無期限に残り接続が失敗

FIN_WAIT_2に残ったソケットのポートは、Private Service Connect NATに再利用されました。challenge ACKが送られてもUSPSの修正で破棄され、接続が失敗しました。

障害調査で原因特定につながった確認項目

i/o timeoutの症状は、Private Service Connectの層やカーネルのTCP状態機械、Envoyの接続管理のどれを見ても同じでした。各層にもっともらしい説明があり、どの説明も不完全だったとGoogle Cloudは振り返っています。[1]

原因の特定に使った調査

図6 原因の特定に使った調査

経路上の複数地点での同時パケットキャプチャが、原因の特定につながりました。キャプチャとUSPSの指標の照合や、ラボ環境での再現も欠かせなかったと、Google Cloudは評価しています。

Google Cloudは、パケットの順序の入れ替わりとhalf-closeのソケット、善意のセキュリティパッチを同時に存在させるべきではないと総括しています。利用者は本番環境に戻り、Linuxカーネルにはより良い修正が入りました。

次のコードは、新しい接続の直前にnetstatで取得したカーネルのソケット状態です。「2 minutes later」以降は、後続の経過の説明です。

Proto  Local Address         Foreign Address       State
tcp    10.128.0.5:443        10.0.13.77:53426      FIN_WAIT_2
# This socket has been in FIN_WAIT_2 for > 120 seconds.
# tcp_fin_timeout=60 has not fired because the socket is not orphaned.
# Envoy holds it open with SHUT_WR.

# 2 minutes later, Private Service Connect NAT reuses port 53426 for a new pod connection.
# The kernel sees the new SYN on this 5-tuple and sends a challenge ACK.
# USPS drops the challenge ACK. → i/o timeout.

公式資料からの抜粋:When the Kubernetes API went silent: A three-layer networking mystery(Part three: Three bugs, one crime scene / Bug #2: Envoy's half-close and the frozen timer)。対象版・範囲:障害当時のGKE KCP VM。

上記のコードでは、ソケットをEnvoyが保持して孤立ソケットではないため、tcp_fin_timeout=60が働かず、120秒を超えてFIN_WAIT_2に残っています。「2 minutes later」以降は、ポート53426の新しいpod接続への再利用と、challenge ACK破棄によるi/o timeoutを示します。


Python基礎・実践(Django)

企業・法人向けのPython研修では、基礎から応用まで体系的に学べます。

Python研修の詳細

DX社員研修

企業・法人向けのDX研修では、実務に繋がるリスキリングでITレベルを向上させます。

DX研修の詳細

Javaエンジニア育成研修

企業・法人向けのJavaエンジニア育成研修では、Javaの基礎から応用まで確実に習得できます。

Java研修の詳細

新卒・新入社員向け研修

企業・法人に新入社員・新卒社員に向けたプログラミング研修を提供しています。

新入社員研修の詳細

コードキャンプのIT研修を全て見る

GKE KCP VMの障害に対する3層の対応

修正は3つの層にまたがり、複数のチームが数週間かけて調整しました。Linuxカーネルのパッチは、Linux 6.9.7にマージされ、6.6.yと6.1.yのLTSブランチへバックポートされ、GKE 1.33.5以降で提供されます。[1]

Linuxカーネル修正の提供範囲

図7 Linuxカーネル修正の提供範囲

このパッチを含むCOSイメージを実行するすべてのGKEの版で、不具合はOSレベルで解消しています。本事例は、匿名化した顧客サポート案件と社内のバグ情報に基づく内容です。

3つの層の対応は、以下の通りです。

修正の段階 対象の層 内容
緊急の緩和策(2026年2月) USPS 変更をロールバックし、challenge ACKの転送に戻す
正しい動作への修正 Private Service Connectのproxy protocol層 challenge ACKの場面を適切に処理する置き換えの変更
根本原因の修正 Linuxカーネル net: tcp: accept old ack during closingのパッチ

緊急の緩和策の後、利用者のクラスターは3月上旬までに回復しました。正しい動作への修正では、回帰を防ぐPacketDrillテストも追加されました。

本件には2週間で7〜8分野の技術者が関わり、一人では全体を把握できませんでした。ケースノートや共有バグトラッカー、綿密に収集したpcapsが分散したチームを一体にしたとGoogle Cloudは評価しています。

接続が完了しないi/o timeoutの確認点

i/o timeoutで接続が完了しない症状を調べる場合は、1つの層の説明で止めず、複数の層を見比べる方法が考えられます。確認点を編集部が次の図に整理しました。

調べる対象ごとの確認点(編集部の整理)

図8 調べる対象ごとの確認点(編集部の整理)

FIN_WAIT_2に残るソケットを見つけた場合は、ソケットを開いたままのプロセスの有無も確かめます。障害当時のGKE KCP VMでは、tcp_fin_timeoutの対象は孤立ソケットに限られていました。[1]

パケットの順序を調べる場合は、キャプチャを取得できる地点で同時に取得し、地点ごとの順序を比べます。今回は、ホストNICやPIGv、コンテナ内部での同時キャプチャがなければ順序の乱れは見えなかったと、Google Cloudは振り返っています。

修正状況を確かめたい場合、クラスターの回復と根本原因の修正は別の段階の確認対象です。2026年2月の緩和策はUSPSの変更を戻し、GKE 1.33.5以降で提供されるパッチはLinuxカーネル自体を修正します。

緩和策と根本原因の修正の違い

図9 緩和策と根本原因の修正の違い

Linuxカーネルの修正を確かめる場合は、GKE 1.33.5以降かどうかとCOSイメージを確認します。対象は、パッチを含むCOSイメージを実行する版です。

出典

  1. ^ Google Cloud. 「When the Kubernetes API went silent: A three-layer networking mystery」. https://cloud.google.com/blog/products/networking/the-three-layer-gke-network-mystery, (参照 26-10-30).

※本記事は公式の一次情報を基に編集しています。内容はAIで確認していますが、誤りや最新情報との差異がある場合は、以下フォームよりご報告ください。

修正・削除・掲載などの依頼はこちら
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

企業・法人向けのIT・プログラミング・生成AI研修を探す、比較する - IT・プログラミングを知って学べるコネクトメディア CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 3.5日の研修で、年間1,600時間の削減効果が見込まれる。東京きらぼしフィナンシャルグループのDX人材育成事例 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

What's New

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する