TT Lab
はじめる
学ぶ 学習パス コース

Istio 実測ラボ

アップグレードは名札を付け替えること

TT Labで続きを見る

一言でいうと

リビジョン(revision)でインストールすると、新バージョンのコントロールプレーンが旧バージョンの隣に立ちます。ワークロードにはリビジョンのタグだけを知らせておけば、アップグレードは、タグが指す先を移してからワークロードを再起動する作業になります。旧バージョンを消すまでは、ロールバックはタグ1行で済みます。

なぜ必要なのか

Istioをインプレースでアップグレードすると、istiodが入れ替わる瞬間にメッシュ全体が新しいコントロールプレーンにつながります。新バージョンに問題があれば、すべてのワークロードが一度に影響を受け、戻すには旧バージョンを再インストールする必要があります。サイドカーはPodが作られるときに注入されるので、コントロールプレーンを変えた後、すべてのPodを再起動するまで、2つのバージョンのプロキシが混ざって動く時間も避けられません。

リビジョンは、その混ざる時間を統制された順序に変えます。新バージョンを別の名前(istiod-1-31-0)で立て、ネームスペースを1つずつ移して様子を見て、すべて移した後に旧バージョンを消します。

どう動くのか

リビジョンのインストール: istioctl install --set revision=1-31-0は、名前にリビジョンが付いたistiodと、インジェクションWebhook(istio-sidecar-injector-1-31-0)を作ります。旧リビジョンのものはそのまま残ります。

どのバージョンのサイドカーを受け取るかは、ネームスペースのラベルが決めます。

ラベル 意味
istio.io/rev=1-31-0 そのリビジョンのWebhookが注入します
istio.io/rev=prod-stable タグprod-stableが指すリビジョンが注入します
istio-injection=enabled defaultタグ(またはリビジョンなしのインストール)が注入します

タグはWebhook1つです。istioctl tag set prod-stable --revision 1-31-0は、istio-revision-tag-prod-stableというインジェクションWebhookが、1-31-0のistiodを呼ぶようにします。ワークロードのラベルがprod-stableを指していれば、タグを移すだけで次に作られるPodが新バージョンを受け取ります。すでに起動しているPodは、再起動して初めて変わります。

そのため、順序は次のとおりです。

1. precheck                    새 판이 이 클러스터에 올라가도 되는가
2. 새 리비전 설치               istiod-1-31-0 가 옆에 선다 (트래픽 변화 없음)
3. 카나리 네임스페이스 이동      라벨을 1-31-0 으로 + 재시작 → 섞인 상태에서 통신 확인
4. 태그 이동 + 나머지 재시작     prod-stable → 1-31-0
5. 되돌리기 연습               태그를 옛 리비전으로 옮겨 재시작 → 다시 앞으로
6. 옛 리비전 제거              모든 프록시가 옮긴 뒤 uninstall --revision 1-30-5

2つのバージョンのプロキシが混ざっている間も通信できるのは、公式ドキュメントが示す互換ルールのおかげです。データプレーン同士は現在、すべてのバージョン間で互換があり(将来変わる可能性があるという但し書きが付いています)、コントロールプレーンはデータプレーンより1バージョン先に進むことはできても、遅れることはできません。そのためドキュメントは、バージョン差そのものをなくすリビジョン方式を勧めており、移す順序も「コントロールプレーンが先、プロキシが後」です。

現場での姿

ラベルを変えたのにプロキシのバージョンがそのままの場合です。Podを再起動していません。注入はPodを作る時点の仕事です。

旧リビジョンを消したら、一部のPodが設定を受け取れなくなった場合です。再起動していないPodが旧istiodにつながっていました。消す前にistioctl proxy-statusで、旧リビジョンにつながっているプロキシがないかを見ます。

新しいリビジョンをインストールしたのに、既存のPodには何も変化がない場合です。正常です。リビジョンのインストールはトラフィックを変えません。起動しているPodは相変わらず旧istiodにつながっていて、新しいWebhookは、ラベルがそのリビジョンを指すネームスペースでPodが新しく作られるときにだけ呼ばれます。

タグを使わずに、ネームスペースごとにリビジョン名を書いておいた場合です。アップグレードのたびに、すべてのネームスペースのラベルを直す必要があります。タグは、その作業を1行に減らします。

公式ドキュメント: Canary Upgrades・Supported releases・istioctl tag・istioctl x precheck

次のラボですること

ラボの準備手順がリビジョン1-30-5だけでインストールしておいたメッシュでprecheckを実行し、1.31.0をリビジョン1-31-0として隣に立てます。canaryネームスペースだけを先に移し、2つのバージョンが混ざったまま通信できることを確認し、タグを移して残りを上げた後、ロールバックを1回練習します。最後に旧リビジョンを消します。