Helm を使用したアップグレード
このガイドに従って、Helm を使用したアンビエントモードインストールのアップグレードと構成を実行します。このガイドでは、以前のバージョンの Istio でHelm を使用したアンビエントモードインストール を既に実行済みであることを前提としています。
アンビエントモードアップグレードの理解
すべての Istio アップグレードには、コントロールプレーン、データプレーン、および Istio CRD のアップグレードが含まれます。アンビエントデータプレーンは2つのコンポーネント、ztunnel とゲートウェイ(ウェイポイントを含む)に分割されているため、アップグレードにはこれらのコンポーネントに対する個別のステップが含まれます。コントロールプレーンと CRD のアップグレードについては、ここでは簡単に説明しますが、サイドカーモードでのこれらのコンポーネントのアップグレードプロセス とほぼ同じです。
サイドカーモードと同様に、ゲートウェイはリビジョンタグを利用して、ウェイポイントを含む(ゲートウェイ)のアップグレードをきめ細かく制御できます。任意の時点で以前のバージョンのIstioコントロールプレーンにロールバックするための簡単な制御も含まれます。ただし、サイドカーモードとは異なり、ztunnelはDaemonSet(ノードごとのプロキシ)として実行されるため、ztunnelのアップグレードは、最低でも一度にノード全体に影響を与えます。多くの場合、これは許容できるかもしれませんが、長期間存続するTCP接続を持つアプリケーションは中断される可能性があります。このような場合は、特定のノードのztunnelをアップグレードする前に、ノードのコーディングとドレインを使用することをお勧めします。簡潔にするために、このドキュメントでは、短時間のダウンタイムを伴う可能性のあるztunnelのインプレースアップグレードを示します。
前提条件
アップグレードの準備
Istioをアップグレードする前に、新しいバージョンのistioctlをダウンロードし、istioctl x precheck
を実行して、アップグレードが環境と互換性があることを確認することをお勧めします。出力は次のようになります。
$ istioctl x precheck
✔ No issues found when checking the cluster. Istio is safe to install or upgrade!
To get started, check out <https://istio.dokyumento.jp/latest/docs/setup/getting-started/>
次に、Helmリポジトリを更新します。
$ helm repo update istio
タグとリビジョンの整理
制御された方法でアンビエントモードのメッシュをアップグレードするには、ゲートウェイと名前空間でistio.io/rev
ラベルを使用してリビジョンタグを指定し、ワークロードのトラフィック管理に使用するゲートウェイとコントロールプレーンのバージョンを制御することをお勧めします。アップグレードを整理するために、本番クラスタを複数のタグに分割することをお勧めします。特定のタグのすべてのメンバーは同時にアップグレードされるため、リスクが最も低いアプリケーションからアップグレードを開始することが賢明です。大量のプロキシが誤ってアップグレードされる可能性があり、セグメント化が困難になるため、ラベル経由でリビジョンを直接参照してアップグレードすることはお勧めしません。クラスタで使用しているタグとリビジョンを確認するには、タグのアップグレードに関するセクションを参照してください。
リビジョン名の選択
リビジョンはIstioコントロールプレーンの固有のインスタンスを識別するため、単一のメッシュ内でコントロールプレーンの複数の異なるバージョンを同時に実行できます。
リビジョンは不変のままであることをお勧めします。つまり、特定のリビジョン名でコントロールプレーンがインストールされた後は、インストールを変更せず、リビジョン名を再利用しないでください。一方、タグはリビジョンへの変更可能なポインタです。これにより、クラスタオペレータは、ワークロードラベルを調整する必要なく、タグをあるリビジョンから次のリビジョンに移動するだけで、データプレーンアップグレードを実行できます。すべてのデータプレーンは、istio.io/rev
ラベル(リビジョンまたはタグのいずれかを指す)で指定された、またはistio.io/rev
ラベルが存在しない場合はデフォルトのリビジョンにのみ接続します。データプレーンのアップグレードは、ラベルの変更またはタグの編集によって指すコントロールプレーンを変更するだけです。
リビジョンは不変であることを目的としているため、インストールしているIstioのバージョンに対応するリビジョン名(例:1-22-1
)を選択することをお勧めします。新しいリビジョン名を選択することに加えて、現在のリビジョン名に注意する必要があります。これは、次を実行して確認できます。
$ kubectl get mutatingwebhookconfigurations -l 'istio.io/rev,!istio.io/tag' -L istio\.io/rev
$ # Store your revision and new revision in variables:
$ export REVISION=istio-1-22-1
$ export OLD_REVISION=istio-1-21-2
コントロールプレーンのアップグレード
基本コンポーネント
クラスタ全体のCustom Resource Definitions(CRD)は、新しいバージョンコントロールプレーンのデプロイの前にアップグレードする必要があります。
$ helm upgrade istio-base istio/base -n istio-system
istiod コントロールプレーン
Istiodコントロールプレーンは、メッシュ内のトラフィックをルーティングするプロキシを管理および構成します。次のコマンドは、現在のものと並行してコントロールプレーンの新しいインスタンスをインストールしますが、新しいゲートウェイプロキシやウェイポイントを導入したり、既存のもののコントロールを引き継いだりすることはありません。
istiodのインストールをカスタマイズした場合は、以前のアップグレードまたはインストールからのvalues.yaml
ファイルを使用して、コントロールプレーンの一貫性を維持できます。
$ helm upgrade istiod istio/istiod -n istio-system --wait
$ helm install istiod-"$REVISION" istio/istiod -n istio-system --set revision="$REVISION" --set profile=ambient --wait
CNI ノードエージェント
Istio CNIノードエージェントは、アンビエントメッシュに追加されたポッドを検出し、追加されたポッド内にプロキシポートを確立する必要があることをztunnelに通知し、ポッドネットワーク名前空間内のトラフィックリダイレクトを構成する役割を担っています。データプレーンまたはコントロールプレーンの一部ではありません。
バージョン1.xのCNIは、バージョン1.x+1および1.xのコントロールプレーンと互換性があります。これは、バージョン間の違いがマイナーバージョン1つ以内であれば、コントロールプレーンをIstio CNIよりも先にアップグレードする必要があることを意味します。
$ helm upgrade istio-cni istio/cni -n istio-system
データプレーンのアップグレード
ztunnel DaemonSet
ztunnel DaemonSetはノードプロキシコンポーネントです。バージョン1.xのztunnelは、バージョン1.x+1および1.xのコントロールプレーンと互換性があります。これは、バージョン間の違いがマイナーバージョン1つ以内であれば、コントロールプレーンをztunnelよりも先にアップグレードする必要があることを意味します。以前にztunnelのインストールをカスタマイズした場合は、以前のアップグレードまたはインストールからのvalues.yaml
ファイルを使用して、データプレーンの一貫性を維持できます。
$ helm upgrade ztunnel istio/ztunnel -n istio-system --wait
$ helm upgrade ztunnel istio/ztunnel -n istio-system --set revision="$REVISION" --wait
手動でデプロイされたゲートウェイチャートのアップグレード(オプション)
手動でデプロイされたGateway
は、Helmを使用して個別にアップグレードする必要があります。
$ helm upgrade istio-ingress istio/gateway -n istio-ingress
タグを使用したウェイポイントとゲートウェイのアップグレード
ベストプラクティスに従った場合、すべてのゲートウェイ、ワークロード、および名前空間は、デフォルトのリビジョン(効果的にdefault
という名前のタグ)またはistio.io/rev
ラベル(値がタグ名に設定されている)のいずれかを使用します。これで、これらのタグを新しいバージョンを指すように移動することによって、これらをIstioデータプレーンの新しいバージョンに1つずつアップグレードできます。クラスタ内のすべてのタグを一覧表示するには、次のコマンドを実行します。
$ kubectl get mutatingwebhookconfigurations -l 'istio.io/tag' -L istio\.io/tag,istio\.io/rev
各タグについて、$MYTAG
をタグ名に、$REVISION
をリビジョン名に置き換えて、次のコマンドを実行することにより、タグをアップグレードできます。
$ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{$MYTAG}" --set revision="$REVISION" -n istio-system | kubectl apply -f -
これにより、手動ゲートウェイデプロイモードを使用しているもの(以下で説明します)と、アンビエントモードでは使用されないサイドカーを除く、そのタグを参照しているすべてのオブジェクトがアップグレードされます。
次のタグをアップグレードする前に、アップグレードされたデータプレーンを使用するアプリケーションの正常性を綿密に監視することをお勧めします。問題を検出した場合は、タグをロールバックして、古いリビジョンの名前に戻すことができます。
$ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{$MYTAG}" --set revision="$OLD_REVISION" -n istio-system | kubectl apply -f -
手動でデプロイされたゲートウェイのアップグレード(オプション)
手動でデプロイされたGateway
は、Helmを使用して個別にアップグレードする必要があります。
$ helm upgrade istio-ingress istio/gateway -n istio-ingress
以前のコントロールプレーンのアンインストール
Istioコントロールプレーンの新しいリビジョンを使用するようにすべてのデータプレーンコンポーネントをアップグレードし、ロールバックする必要がないことを確認したら、次のコマンドを実行して、コントロールプレーンの以前のリビジョンを削除できます。
$ helm delete istiod-"$REVISION" -n istio-system