アップグレードは名札を付け替えること
一言でいうと
リビジョン(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回練習します。最後に旧リビジョンを消します。