etcdをv3.5からv3.6にアップグレード
通常、etcd v3.5からv3.6へのアップグレードは、停止時間なしのローリングアップグレードで実行できます。
- etcd v3.5のプロセスを1つずつ停止し、etcd v3.6のプロセスに置き換えます。
- すべてのプロセスがv3.6で稼働すると、クラスターでv3.6の新機能を利用できます。
アップグレードを開始する 前に、このガイドの残りを読んで準備してください。
アップグレードのチェックリスト
3.5の更新
3.6にアップグレードする前に、すべての3.5メンバーが3.5.32以降に更新されている
ことを確認してください。パッチリリース3.5.24から3.5.26では、アップグレードを妨げる可能性のある問題がいくつか修正されています。3.5.32
では--v2-deprecation=write-only-skip-checkが追加され、etcdutl check v2storeが拡張されてv2スナップショットに加えてWALレコードも検査するようになりました。
V2ストア
--enable-v2フラグを設定していない、またはfalseに設定している場合、追加の作業は不要です。
--enable-v2を設定している場合は、etcdutl check v2storeコマンドを実行し、v2storeにメンバー構成以外の(カスタム)データが含まれていないか確認してください。カスタムデータがなければ、このフラグを安全に削除できます。含まれている場合は、v2移行ガイド
で詳細を確認してください。
追加されたフラグ
削除されたフラグ
非推奨になったフラグ
etcd --experimental-bootstrap-defrag-threshold-megabytesフラグは非推奨になりました。
etcd --experimental-compaction-batch-limitフラグは非推奨になりました。
etcd --experimental-compact-hash-check-timeフラグは非推奨になりました。
etcd --experimental-compaction-sleep-intervalフラグは非推奨になりました。
etcd --experimental-corrupt-check-timeフラグは非推奨になりました。
etcd --experimental-enable-distributed-tracingフラグは非推奨になりました。
etcd --experimental-distributed-tracing-addressフラグは非推奨になりました。
etcd --experimental-distributed-tracing-instance-idフラグは非推奨になりました。
etcd --experimental-distributed-tracing-sampling-rateフラグは非推奨になりました。
etcd --experimental-distributed-tracing-service-nameフラグは非推奨になりました。
etcd --experimental-downgrade-check-timeフラグは非推奨になりました。
etcd --experimental-max-learnersフラグは非推奨になりました。
etcd --experimental-memory-mlockフラグは非推奨になりました。
etcd --experimental-peer-skip-client-san-verificationフラグは非推奨になりました。
etcd --experimental-snapshot-catchup-entriesフラグは非推奨になりました。
etcd --experimental-warning-apply-durationフラグは非推奨になりました。
etcd --experimental-warning-unary-request-durationフラグは非推奨になりました。
etcd --experimental-watch-progress-notify-intervalフラグは非推奨になりました。
v3.5の実験的フラグからフィーチャーゲートへの移行
etcd --experimental-compact-hash-check-enabled=trueに対応するフィーチャーゲート
etcd --experimental-initial-corrupt-check=trueに対応するフィーチャーゲート
etcd --experimental-enable-lease-checkpoint=trueに対応するフィーチャーゲート
etcd --experimental-enable-lease-checkpoint-persist=trueに対応するフィーチャーゲート
etcd --experimental-stop-grpc-service-on-defrag=trueに対応するフィーチャーゲート
etcd --experimental-txn-mode-write-with-shared-buffer=falseに対応するフィーチャーゲート
デフォルト値が変更されたフラグ
以前のデフォルトフラグetcd --snapshot-count=100000
以前のデフォルトフラグetcd --v2-deprecation='not-yet'
以前のデフォルトフラグetcd --discovery-fallback='proxy'
Prometheusメトリクスの違い
サーバーアップグレードのチェックリスト
アップグレードの要件
既存のetcd環境をv3.6にアップグレードするには、稼働中のクラスターがv3.5以降でなければなりません。v3.5より前の場合は、v3.6にアップグレードする前にv3.5にアップグレード してください。
また、ローリングアップグレードを円滑に進めるには、稼働中のクラスターが正常でなければなりません。作業を進める前に、etcdctl endpoint healthコマンドでクラスターの正常性を確認してください。
準備
etcdをアップグレードする際は、必ず本番環境に適用する前に、etcdに依存するサービスをステージング環境でテストしてください。
作業を始める前に、スナップショットバックアップをダウンロード
してください。アップグレードで問題が発生した場合は、このバックアップを使用して元のetcdバージョンにロールバック
できます。snapshotコマンドでバックアップされるのはv3データのみであることに注意してください。
バージョンの混在
アップグレード中のetcdクラスターでは、異なるバージョンのetcdメンバーの混在がサポートされ、全メンバーに共通する最も低いバージョンのプロトコルで動作します。すべてのメンバーがバージョンv3.6にアップグレードされて初めて、クラスターのアップグレードが完了したと見なされます。内部では、etcdメンバーが相互にネゴシエーションを行ってクラスター全体のバージョンを決定し、そのバージョンによって報告されるバージョンとサポートされる機能が決まります。
ロールバック
etcdクラスターをアップグレードする前に、クラスターのスナップショットバックアップを作成してダウンロード してください。このスナップショットを使えば、必要に応じてクラスターをアップグレード前の状態にリストアできます。アップグレード中に問題が発生した場合は、まず根本原因を特定して解決することをお勧めします。少なくとも1つのメンバーがv3.5のままで、クラスターのバージョンがまだ混在している場合は、バイナリまたはイメージを以前のv3.5のものに置き換えるか、スナップショットを使用してクラスターを直接リストアできます。この混在状態ではクラスターはv3.5クラスターとして動作し続けるため、正式なダウングレード手順を踏まずにロールバックできます。
ただし、すべてのメンバーをv3.6にアップグレードすると、クラスターのアップグレードは完了したと見なされ、バイナリを置き換えるだけでは正しくロールバックできません。リカバリーするには、アップグレード前に取得したスナップショットからリストアするか、公式のダウングレードガイドに従って元のバージョンに戻し、一貫性を確保してデータ破損を防ぐ方法があります。
アップグレード手順
この例では、ローカルマシンで稼働する3メンバー構成のv3.5 etcdクラスターをアップグレードする方法を説明します。
手順1:アップグレード要件の確認
クラスターは正常で、v3.5.xで稼働していますか。
手順2:リーダーからスナップショットバックアップをダウンロード
問題が発生した場合にダウングレードできるよう、スナップショットバックアップをダウンロード してください。
etcdのリーダーには最新のアプリケーションデータがあることが保証されているため、リーダーからスナップショットを取得します。
手順3:既存のetcdサーバーを1つ停止
各etcdプロセスを停止すると、他のクラスターメンバーに想定どおりのエラーが記録されます。クラスターメンバーへの接続が(一時的に)切断されたためであり、正常な動作です。
手順4:同じ設定でetcdサーバーを再起動
同じ設定で、新しいetcdバイナリを使用してetcdサーバーを再起動します。
新しいv3.6のetcdは、自身の情報をクラスターに公開します。この時点では、クラスターは引き続き全メンバーに共通する最も低いバージョンであるv3.5のプロトコルで動作します。
{"level":"info","ts":"2025-03-01T04:40:36.828+0530","caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.889+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"bf9071f4639c75cc","from":"3.0","to":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.828+0530","caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.894+0530","caller":"etcdserver/server.go:1686","msg":"published local member to cluster through raft","local-member-id":"bf9071f4639c75cc","local-member-attributes":"{Name:node1 ClientURLs:[http://127.0.0.1:2379]}","cluster-id":"59a05384c9b79ee","publish-timeout":"7s"}
新しいv3.6のetcdバイナリで、各メンバー、続いてクラスター全体が正常になることを確認してください。
クラスター全体のアップグレードが完了するまでは、未アップグレードのメンバーに次のような警告が記録されます。
これは想定された動作で、すべてのetcdクラスターメンバーをv3.6にアップグレードすると表示されなくなります。
手順5:残りのメンバーで手順3と手順4を繰り返す
すべてのメンバーのアップグレードが完了すると、クラスターはv3.6へのアップグレードが成功したことを報告します。
メンバー1:
{"level":"info","ts":"2025-03-01T04:58:32.375+0530","caller":"etcdserver/server.go:2149","msg":"updating cluster version using v3 API","from":"3.5","to":"3.6"}{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"etcdserver/server.go:2164","msg":"cluster version is updated","cluster-version":"3.6"}
メンバー2:
{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"91bc3c398fb3c146","from":"3.5","to":"3.6"}
メンバー3:
{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"fd422379fda50e48","from":"3.5","to":"3.6"}