カナリアアップグレード
Istioのアップグレードは、まず新しいコントロールプレーンのカナリアデプロイメントを実行することで行うことができます。これにより、すべてのトラフィックを新しいバージョンに移行する前に、少数のワークロードでアップグレードの影響を監視できます。これはインプレースアップグレード5を行うよりもはるかに安全であり、推奨されるアップグレード方法です。
Istioをインストールする際、revision
インストール設定を使用して、複数の独立したコントロールプレーンを同時にデプロイできます。新しいIstioバージョンのコントロールプレーンを、異なるrevision
設定を使用して古いコントロールプレーンの隣にインストールすることで、アップグレードのカナリアバージョンを開始できます。各リビジョンは、独自のDeployment
、Service
などを持つ、完全なIstioコントロールプレーンの実装です。
アップグレード前
Istioをアップグレードする前に、istioctl x precheck
コマンドを実行して、アップグレードが環境と互換性があることを確認することをお勧めします。
コントロールプレーン
canary
という新しいリビジョンをインストールするには、revision
フィールドを次のように設定します。
コマンドを実行すると、2つのコントロールプレーンのデプロイメントとサービスが並行して実行されます。
また、新しいリビジョンを含む2つのサイドカーインジェクター構成があることも確認できます。
データプレーン
Istioゲートウェイのリビジョン固有のインスタンスを実行する方法を理解するには、ゲートウェイカナリアアップグレードを参照してください。この例では、default
Istioプロファイルを使用しているため、Istioゲートウェイはリビジョン固有のインスタンスを実行しませんが、代わりに新しいコントロールプレーンリビジョンを使用するようにインプレースアップグレードされます。istio-ingress
ゲートウェイがcanary
リビジョンを使用していることを確認するには、次のコマンドを実行します。
ただし、新しいリビジョンをインストールするだけでは、既存のサイドカープロキシには影響しません。これらをアップグレードするには、新しいistiod-canary
コントロールプレーンを指すように構成する必要があります。これは、名前空間ラベルistio.io/rev
に基づいてサイドカーインジェクション中に制御されます。
istio-injection
が有効になっている名前空間test-ns
を作成します。test-ns
名前空間に、サンプルのcurlポッドをデプロイします。
名前空間
test-ns
を作成します。istio-injection
ラベルを使用して名前空間にラベルを付けます。test-ns
名前空間にサンプルのcurlポッドを起動します。
名前空間test-ns
をアップグレードするには、istio-injection
ラベルを削除し、canary
リビジョンを指すようにistio.io/rev
ラベルを追加します。istio-injection
ラベルは、下位互換性のためにistio.io/rev
ラベルよりも優先されるため、削除する必要があります。
名前空間を更新した後、ポッドを再起動して再インジェクションをトリガーする必要があります。名前空間test-ns
内のすべてのポッドを再起動する1つの方法は、次を使用することです。
ポッドが再インジェクションされると、istiod-canary
コントロールプレーンを指すように構成されます。istioctl proxy-status
を使用してこれを確認できます。
出力には、カナリアリビジョンを使用している名前空間下のすべてのポッドが表示されます。
安定版リビジョンラベル
新しいリビジョンに移動するときに名前空間を手動で再ラベル付けすると、手間がかかり、エラーが発生しやすくなります。リビジョンのタグはこの問題を解決します。リビジョンのタグは、リビジョンを指す安定した識別子であり、名前空間の再ラベル付けを回避するために使用できます。メッシュオペレーターは、名前空間の再ラベル付けを行う代わりに、タグを新しいリビジョンを指すように変更するだけで済みます。そのタグでラベル付けされたすべての名前空間は、同時に更新されます。使用法
1-23-1
と1-24-0
の2つのリビジョンがインストールされたクラスターを考えます。クラスターオペレーターは、古い安定した1-23-1
バージョンを指すリビジョンタグprod-stable
と、新しい1-24-0
リビジョンを指すリビジョンタグprod-canary
を作成します。この状態は、次のコマンドで到達できます。コントロールプレーンの2つのリビジョンをインストールします。
stable
およびcanary
リビジョンタグを作成し、それぞれののリビジョンに関連付けます。アプリケーション名前空間にラベルを付けて、それぞれののリビジョンタグにマップします。
各名前空間でサンプルのcurlポッドを起動します。
istioctl proxy-status
コマンドを使用して、アプリケーションとコントロールプレーンのマッピングを確認します。
リビジョン、タグ、名前空間間の結果のマッピングを以下に示します。
クラスターオペレーターは、istioctl tag list
コマンドを使用して、タグ付けされた名前空間に加えてこのマッピングを表示できます。
クラスターオペレーターがprod-canary
でタグ付けされたコントロールプレーンの安定性に満足したら、istio.io/rev=prod-stable
でラベル付けされた名前空間は、prod-stable
リビジョンタグを新しい1-24-0
リビジョンを指すように変更することで、1つのアクションで更新できます。
これで、リビジョン、タグ、名前空間間の更新されたマッピングは以下のようになります。
prod-stable
とマークされた名前空間でインジェクションされたワークロードを再起動すると、これらのワークロードは1-24-0
コントロールプレーンを使用するようになります。ワークロードを新しいリビジョンに移行するために名前空間の再ラベル付けは必要なかったことに注意してください。
istioctl proxy-status
コマンドを使用して、アプリケーションとコントロールプレーンのマッピングを確認します。
デフォルトタグ
タグdefault
によって指されるリビジョンは、デフォルトリビジョンと見なされ、追加の意味的な意味を持ちます。デフォルトリビジョンは、次の機能を実行します。
istio-injection=enabled
の名前空間セレクター、sidecar.istio.io/inject=true
オブジェクトセレクター、およびistio.io/rev=default
セレクターのサイドカーをインジェクションします。- Istioリソースを検証します。
- デフォルト以外のリビジョンからリーダロックを奪い、シングルトンメッシュの役割(リソースステータスの更新など)を実行します。
リビジョン1-24-0
をデフォルトにするには、次を実行します。
default
タグを使用する場合、古いMutatingWebhookConfiguration
(通常はistio-sidecar-injector
と呼ばれます)を削除して、古いコントロールプレーンと新しいコントロールプレーンの両方がインジェクションを試行しないようにすることをお勧めします。古いコントロールプレーンのアンインストール
コントロールプレーンとデータプレーンの両方をアップグレードしたら、古いコントロールプレーンをアンインストールできます。たとえば、次のコマンドはリビジョン1-23-1
のコントロールプレーンをアンインストールします。
古いコントロールプレーンにリビジョンラベルがない場合は、元のインストールオプションを使用してアンインストールします。例:
古いコントロールプレーンが削除され、新しいコントロールプレーンのみがクラスターに存在することを確認します。
上記の指示では、指定されたコントロールプレーンリビジョンのリソースのみが削除され、他のコントロールプレーンと共有されるクラスターレベルのリソースは削除されないことに注意してください。Istioを完全にアンインストールするには、アンインストールガイドを参照してください。
カナリアコントロールプレーンのアンインストール
カナリアアップグレードを完了する代わりに、古いコントロールプレーンにロールバックする場合は、次のコマンドを使用してカナリアリビジョンをアンインストールできます。
ただし、この場合は、以前にインプレースアップグレードされたゲートウェイを、アンインストールコマンドでは自動的に元に戻らないため、最初に手動で再インストールする必要があります。
クリーンアップ
作成したリビジョンのタグをクリーンアップします。
リビジョンラベルの例を使用して、カナリアアップグレードに使用した名前空間をクリーンアップします。
リビジョンタグの例を使用して、カナリアアップグレードに使用した名前空間をクリーンアップします。