<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Etcd on AI2CORE - AI技術ブログ</title>
    <link>https://www.ai2core.com/tags/etcd/</link>
    <description>Recent content in Etcd on AI2CORE - AI技術ブログ</description>
    <generator>Hugo -- 0.164.0</generator>
    <language>ja-JP</language>
    <lastBuildDate>Mon, 10 Aug 2026 11:43:47 +0000</lastBuildDate>
    <atom:link href="https://www.ai2core.com/tags/etcd/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>etcd v3.7.0のRangeStreamを実務で理解する：Kubernetes運用者のための導入・設計・注意点</title>
      <link>https://www.ai2core.com/posts/2026-08-10-etcd-3-7-rangestream-kubernetes/</link>
      <pubDate>Mon, 10 Aug 2026 11:43:47 +0000</pubDate>
      <guid>https://www.ai2core.com/posts/2026-08-10-etcd-3-7-rangestream-kubernetes/</guid>
      <description>etcd v3.7.0で追加されたRangeStream RPC、keys-only Rangeの最適化、レガシーv2storeの削除について、Kubernetes運用者の視点で公式発表の内容を整理し、導入判断と注意点をまとめます。</description>
      <content:encoded><![CDATA[<h2 id="はじめに">はじめに</h2>
<p>Kubernetesクラスタの安定性は、その裏側で動くetcdの挙動に大きく依存します。APIサーバーが遅い、リストリクエストでメモリが跳ねる、コントロールプレーンのCPUが慢性的に高い——こうした症状を追いかけていくと、最終的にetcdの読み取り経路にたどり着くことは珍しくありません。</p>
<p>2026年7月8日、SIG etcdからetcd v3.7.0のリリースが発表されました。今回のリリースは、単なるバージョン更新ではなく、大きな結果セットの扱い方そのものを変える機能が入っている点が特徴です。</p>
<p>この記事では、公式アナウンス（Kubernetes Blog）で明示されている内容を軸に、etcd v3.7.0の主要な変更点と、Kubernetes運用者が実務で何を気にすべきかを整理します。なお、公式ページで確認できなかった項目については、推測で補わず「未確認」と明記します。</p>
<h2 id="etcd-v370の目玉rangestream-rpc">etcd v3.7.0の目玉：RangeStream RPC</h2>
<p>今回のリリースで最も注目されているのが、新しいRPCである <strong>RangeStream</strong> です。</p>
<p>公式アナウンスでは、従来の課題が次のように説明されています。</p>
<blockquote>
<p>In etcd v3.6 and earlier, it is challenging to work with requests that return large result sets. The database would buffer the full result set before sending, leading to unpredictable latency and memory usage, both on the server and the client.</p>
</blockquote>
<p>つまり、v3.6以前は大きな結果セットを返すリクエストにおいて、<strong>データベース側が結果セット全体をバッファしてから送信していた</strong>ため、サーバー・クライアント双方でレイテンシとメモリ使用量が予測しづらくなっていた、ということです。</p>
<p><img alt="バッファリング方式とストリーミング方式の違い。左側は全データをまとめて送るためメモリに大きな山ができる様子、右側はチャンク単位で送るためメモリが平準化される様子" loading="lazy" src="/images/2026-08-10-etcd-rangestream-diagram.png#center"></p>
<p>RangeStreamは、この結果セットを<strong>チャンク単位で受け取れるようにするRPC</strong>です。呼び出し側のアプリケーションが分割して結果を受け取れるため、レイテンシが下がり、バッファに使うメモリ量も予測しやすくなります。</p>
<h3 id="実務上の意味">実務上の意味</h3>
<p>Kubernetesの文脈で考えると、影響が出やすいのは次のようなケースです。</p>
<ul>
<li>大量のPodやSecret、ConfigMapを抱えるNamespaceに対する全件リスト</li>
<li>コントローラーやオペレーターの初期同期（初回List）</li>
<li>監視・バックアップ系ツールによる広範囲なキー走査</li>
</ul>
<p>これらは「一発のリクエストで巨大なレスポンスが返る」という共通点があります。バッファリング方式ではこのタイミングでメモリのスパイクが起きますが、ストリーミングであれば、そのピークをならせる可能性があります。</p>
<p>具体的な使い方については、公式ドキュメントにgRPC呼び出し向けの解説（<code>learning/api</code> の RangeStream セクション）と、<code>etcdctl</code> 向けの解説（<code>dev-guide/interacting_v3</code> の Read keys セクション）が用意されています。本記事執筆時点で、これらのページ内の具体的なコマンド例やオプション名までは筆者が確認できていないため、<strong>詳細な構文は未確認</strong>とします。実際に試す際は必ず公式ドキュメントを参照してください。</p>
<h3 id="kubernetes側の対応状況">Kubernetes側の対応状況</h3>
<p>公式アナウンスによると、RangeStreamはKubernetes v1.37において <code>EtcdRangeStream</code> というフィーチャーゲート経由で利用可能になる予定とされています。</p>
<p>ここで押さえておきたいのは、<strong>etcdをv3.7.0に上げただけではKubernetes APIサーバーが自動的にRangeStreamを使い始めるわけではない</strong>という点です。あくまでフィーチャーゲートによる制御であり、有効化の判断はクラスタ管理者側に委ねられます。フィーチャーゲートの既定値（デフォルトで有効か無効か）やアルファ・ベータの段階については、本記事では未確認です。</p>
<h2 id="パフォーマンス改善keys-only-rangeの最適化">パフォーマンス改善：keys-only Rangeの最適化</h2>
<p>もう一つ、運用者にとって効き目が大きいのが <strong>keys-only Rangeの最適化</strong>（PR #21791）です。</p>
<p>公式アナウンスの説明は次の通りです。</p>
<blockquote>
<p>When processing a keys_only Range request or <code>etcdctl get --keys-only</code>, etcd reads solely from its in-memory index. It returns the matched keys without loading all serialized values from bbolt as it did previously.</p>
</blockquote>
<p><code>keys_only</code> を指定したRangeリクエスト、あるいは <code>etcdctl get --keys-only</code> の処理において、etcdは<strong>インメモリインデックスのみを読む</strong>ようになりました。以前のようにbboltからシリアライズされた値をすべて読み込むことはしません。これにより、不要なバックエンド読み取りとメモリ使用量が削減されます。</p>
<p>ただし例外があり、<code>SortTarget</code> に VALUE が指定されている場合は、従来通りbboltからの読み込みが発生します。値でソートする以上、値を読まざるを得ないためです。</p>
<p>期待される効果として、公式アナウンスは次のように述べています。</p>
<blockquote>
<p>Kubernetes users should see a significant decrease in overall CPU usage by the etcd members, compared with v3.6.</p>
</blockquote>
<p>v3.6と比較して、etcdメンバー全体のCPU使用率が大きく下がることが見込まれる、という記述です。これは「Kubernetesユーザー」と明示されている点が重要で、Kubernetesのワークロード特性（keys-onlyに近い走査が多い）に合致した改善だと読めます。</p>
<p>なお、<strong>具体的に何パーセント削減されるかという数値は公式アナウンス上では示されていません</strong>。自環境での効果は、実測して判断する必要があります。</p>
<h2 id="その他の変更点">その他の変更点</h2>
<p>公式アナウンスで確認できた変更点を整理します。</p>
<h3 id="レガシーv2storeの削除">レガシーv2storeの削除</h3>
<p>etcd v3.7では、起動が完全にv3storeベースになり、<strong>レガシーなv2 storeへの長年の依存が解消</strong>されました。これはコードベースの整理という意味合いが強い変更ですが、v2 API時代の資産を何らかの形で残している環境では、事前確認が必要になる可能性があります。v2store削除に伴う具体的な非互換や移行手順については未確認です。</p>
<h3 id="protobufの刷新">Protobufの刷新</h3>
<p>古くなっていたprotobufライブラリを、現在もサポートされているライブラリへ置き換える「modernization」が完了したと記載されています。</p>
<h3 id="リースの改善">リースの改善</h3>
<p>「faster and more reliable leases（より高速で信頼性の高いリース）」が挙げられていますが、筆者が確認できた範囲では詳細が示されていません。リースはKubernetesのリーダー選出やノードのハートビートに関わる要素であるため、<strong>具体的な変更内容は変更履歴（CHANGELOG-3.7.md）で確認することを推奨</strong>します。この記事の時点では未確認です。</p>
<h3 id="依存ライブラリの更新">依存ライブラリの更新</h3>
<ul>
<li>bbolt v1.5.1（ストレージエンジン）</li>
<li>raft v3.7.0（合意アルゴリズムライブラリ）</li>
</ul>
<p>いずれもetcdの中核を成すコンポーネントであり、バージョンが上がっています。</p>
<h2 id="導入アップグレード時の注意点">導入・アップグレード時の注意点</h2>
<p>ここからは、実際に本番クラスタへ適用する際に踏まえておきたい点をまとめます。</p>
<h3 id="1-アップグレード手順は必ず公式を確認する">1. アップグレード手順は必ず公式を確認する</h3>
<p>etcdのマイナーバージョンアップは、<strong>一段ずつ順に上げる</strong>（例：3.5 → 3.6 → 3.7）ことが原則とされてきました。ただし、v3.7における最小要件・許容されるスキップ可否・ロールバック手順については、本記事では未確認です。公式のアップグレードドキュメントとCHANGELOG-3.7.mdを必ず参照してください。</p>
<h3 id="2-バックアップとリストア訓練を先に済ませる">2. バックアップとリストア訓練を先に済ませる</h3>
<p>v2store削除やprotobuf刷新といった内部構造に関わる変更が含まれるため、アップグレード前のスナップショット取得は必須です。加えて、<strong>取得したスナップショットから実際にリストアできることを事前に検証</strong>しておくべきです。バックアップは「取れていること」ではなく「戻せること」が価値です。</p>
<h3 id="3-効果測定の指標を先に決める">3. 効果測定の指標を先に決める</h3>
<p>keys-only最適化によるCPU削減を評価するなら、アップグレード前に以下を記録しておきます。</p>
<ul>
<li>etcdメンバーごとのCPU使用率（プロセス単位）</li>
<li><code>etcd_disk_backend_commit_duration_seconds</code> などのディスク系メトリクス</li>
<li>APIサーバー側のリクエストレイテンシ（特にLIST操作）</li>
<li>メモリのピーク値（RSS）</li>
</ul>
<p>前後比較ができなければ、「効果があったかどうか」を議論できません。</p>
<h3 id="4-rangestreamは段階的に有効化する">4. RangeStreamは段階的に有効化する</h3>
<p>RangeStreamはetcd側の機能ですが、Kubernetesから使う場合はフィーチャーゲートを介します。フィーチャーゲートで制御できるということは、<strong>問題があれば無効化して切り戻せる</strong>ということでもあります。まず開発・ステージング環境で有効化し、メモリとレイテンシの挙動を観測してから本番に展開する流れが安全です。</p>
<h3 id="5-クライアント側の対応状況を確認する">5. クライアント側の対応状況を確認する</h3>
<p>RangeStreamは新しいRPCであるため、etcdを直接叩いているツール（バックアップツール、監視エージェント、自作のオペレーターなど）が自動的に恩恵を受けるわけではありません。クライアントライブラリ側の対応が必要です。手元のツールチェーンがどのetcdクライアントバージョンを使っているかを棚卸ししておくとよいでしょう。</p>
<h2 id="まとめ">まとめ</h2>
<p>etcd v3.7.0の要点を整理します。</p>
<ul>
<li><strong>RangeStream RPC</strong> が追加され、大きな結果セットをチャンク単位で受け取れるようになりました。これによりレイテンシとメモリ使用量の予測可能性が向上します。Kubernetesではv1.37の <code>EtcdRangeStream</code> フィーチャーゲート経由で利用可能になる予定です。</li>
<li><strong>keys-only Rangeの最適化</strong> により、<code>keys_only</code> なリクエストはインメモリインデックスのみを参照するようになりました。公式は、v3.6比でetcdメンバーのCPU使用率が大きく下がることを見込んでいます（ただし <code>SortTarget</code> が VALUE の場合は例外）。</li>
<li><strong>レガシーv2storeが削除</strong>され、起動が完全にv3storeベースになりました。protobufの刷新、bbolt v1.5.1およびraft v3.7.0への更新も含まれます。</li>
<li>リースの改善は挙げられているものの、<strong>詳細は本記事では未確認</strong>です。アップグレード手順の詳細、フィーチャーゲートの既定値、RangeStreamの具体的な構文も同様に未確認であり、公式ドキュメントとCHANGELOGでの確認が必要です。</li>
</ul>
<p>大量のオブジェクトを抱えるクラスタや、コントロールプレーンのCPU・メモリが慢性的に厳しい環境では、検討する価値の高いリリースだと言えます。一方で、内部構造に踏み込んだ変更が含まれる以上、バックアップ検証と段階的な展開という基本を省略しないことが、結果的に一番の近道になります。</p>
<h2 id="参考資料">参考資料</h2>
<ul>
<li><a href="https://kubernetes.io/blog/2026/07/08/announcing-etcd-3.7/">Announcing etcd v3.7.0 - Kubernetes Blog</a></li>
<li><a href="https://etcd.io/docs/v3.7/learning/api/#rangestream">RangeStream - etcd API ドキュメント (v3.7)</a></li>
<li><a href="https://etcd.io/docs/v3.7/dev-guide/interacting_v3/#read-keys">Read keys - etcd Interacting with etcd v3 (v3.7)</a></li>
<li><a href="https://github.com/etcd-io/etcd/pull/21791">PR #21791 - keys-only Range optimization (etcd-io/etcd)</a></li>
<li><a href="https://github.com/etcd-io/etcd/releases/tag/v3.7.0">etcd v3.7.0 リリースページ (GitHub)</a></li>
<li><a href="https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.7.md">CHANGELOG-3.7.md (etcd-io/etcd)</a></li>
<li><a href="https://etcd.io/docs/v3.7/install/">etcd インストールドキュメント (v3.7)</a></li>
</ul>
]]></content:encoded>
      <category>Kubernetes</category>
      <category>インフラ</category>
      <category>etcd</category>
      <category>Kubernetes</category>
      <category>RangeStream</category>
      <category>分散システム</category>
      <category>運用</category>
    </item>
  </channel>
</rss>
