1.6. RevisionBased ストラテジーについて
RevisionBased ストラテジーでは、アップグレード中にコントロールプレーンの 2 つのリビジョンが実行されます。このアプローチでは、古いコントロールプレーンから新しいコントロールプレーンへの段階的なワークロード移行がサポートされており、カナリアアップグレードが可能です。また、複数のマイナーバージョンをまたぐアップグレードもサポートされています。
RevisionBased ストラテジーでは、spec.version フィールドの変更ごとに新しい Istio コントロールプレーンインスタンスが作成されます。すべてのワークロードが新しいインスタンスに移行するまで、既存のコントロールプレーンのアクティブ状態が維持されます。istio.io/rev ラベルを更新するか、IstioRevisionTag リソースを使用して再起動することで、ワークロードを新しいコントロールプレーンに移動できます。
RevisionBased ストラテジーでは追加のステップが必要で、アップグレード中に複数のコントロールプレーンインスタンスを同時に実行する必要もありますが、ワークロードを段階的に移行できます。このアプローチにより、残りのワークロードを移行する前に、更新されたコントロールプレーンを一部のワークロードで検証できるため、ミッションクリティカルなワークロードが含まれる大規模なメッシュに役立ちます。
1.6.1. RevisionBased ストラテジーの選択 リンクのコピーリンクがクリップボードにコピーされました!
RevisionBased ストラテジーを使用して Istio をデプロイするには、次の spec.updateStrategy 値を使用して Istio リソースを作成します。
RevisionBased ストラテジーを選択する仕様の例
kind: Istio
spec:
version: v1.24.4
updateStrategy:
type: RevisionBased
Istio リソースのストラテジーを選択すると、Operator は <istio_resource_name>-<version> という名前の新しい IstioRevision リソースを作成します。
1.6.2. RevisionBased ストラテジーによる Istio のインストール リンクのコピーリンクがクリップボードにコピーされました!
RevisionBased 更新ストラテジーを使用して、Istio コントロールプレーン、Istio CNI、および Bookinfo デモアプリケーションをインストールできます。
更新プロセスについては、次のセクションを参照してください。クラスターにすでに Istio デプロイメントが含まれている場合は、このインストールをスキップできます。
手順
次のコマンドを実行して、
istio-systemnamespace を作成します。$ oc create ns istio-systemRevisionBased更新ストラテジーを使用して Istio コントロールプレーンをデプロイします。次の設定例では、istio-systemnamespace にdefaultという名前のIstioリソースを作成します。設定例
apiVersion: sailoperator.io/v1 kind: Istio metadata: name: default spec: namespace: istio-system version: v1.24.3 updateStrategy: type: RevisionBased必要なバージョンの Istio CNI プラグインをインストールします。次の設定例では、
istio-cninamespace にdefaultという名前のIstioCNIリソースを作成します。設定例
apiVersion: sailoperator.io/v1 kind: IstioCNI metadata: name: default spec: version: v1.24.3 namespace: istio-cni次のコマンドを実行して、
IstioRevision名を取得します。$ oc get istiorevision -n istio-system出力例
NAME TYPE READY STATUS IN USE VERSION AGE default-v1-24-3 Local True Healthy False v1.24.3 3m4sIstioRevision名の形式は<istio_resource_name>-<version>です。クラスターで実行するアプリケーションワークロードを設定します。次の例では、
bookinfonamespace にinfoアプリケーションをデプロイします。次のコマンドを実行して、
infonamespace を作成します。$ oc create ns info次のコマンドを実行して、
infonamespace にラベルを付け、サイドカーインジェクションを有効にします。$ oc label namespace info istio.io/rev=<revision_name>次のコマンドを実行して、
bookinfonamespace にinfoPod をインストールします。$ oc apply -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/info/platform/kube/bookinfo.yaml -n bookinfo
次のコマンドを実行して
Istioリソースを確認します。$ oc get istio -n istio-system出力例
NAME REVISIONS READY IN USE ACTIVE REVISION STATUS VERSION AGE default 1 1 1 default-v1-24-3 Healthy v1.24.3 5m13sアプリケーションをデプロイすると、
IN USEフィールドに1が表示されます。次のコマンドを実行して、プロキシーのバージョンがコントロールプレーンのバージョンと一致していることを確認します。
$ istioctl proxy-statusVERSION列は、コントロールプレーンのバージョンと一致する必要があります。出力例
NAME TYPE READY STATUS IN USE VERSION AGE default-v1-24-3 Local True Healthy True v1.24.3 5m31s
1.6.3. RevisionBased ストラテジーによる Istio コントロールプレーンの更新 リンクのコピーリンクがクリップボードにコピーされました!
RevisionBased ストラテジーを使用して Istio を更新する場合、一度に複数バージョン上のマイナーバージョンにアップグレードできます。Red Hat OpenShift Service Mesh Operator は、.spec.version フィールドを変更するたびに新しい IstioRevision リソースを作成し、対応するコントロールプレーンインスタンスをデプロイします。ワークロードを新しいコントロールプレーンに移行するには、namespace の istio.io/rev ラベルを IstioRevision リソースの名前と一致するように設定し、ワークロードを再起動します。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。 -
Red Hat OpenShift Service Mesh Operator 3 をインストールし、
RevisionBasedストラテジーを使用して Istio をデプロイした。この例では、defaultという名前のIstioリソースがistio-systemnamespace にデプロイされます。 -
必要なバージョンの Istio CNI プラグインをインストールした。この例では、
defaultという名前のIstioCNIリソースがistio-cninamespace にデプロイされます。 -
サイドカーインジェクションを有効にするために、
infonamespace にラベルを付けた。 -
クラスター内でアプリケーションワークロードが実行されている。この例では、
infoアプリケーションがbookinfonamespace にデプロイされます。 -
ローカルマシンに
istioctlをインストールした。
手順
Istioリソースのバージョンを変更します。たとえば、Istio1.24.4に更新するには、次のコマンドを実行してspec.versionフィールドをv1.24.4に設定します。$ oc patch istio default --type='merge' -p '{"spec":{"version":"v1.24.4"}}'Istio CR のバージョン更新
kind: Istio spec: version: v1.24.4 updateStrategy: type: RevisionBasedService Mesh Operator は、コントロールプレーンの古いバージョンと並行して、コントロールプレーンの新しいバージョンをデプロイします。サイドカーは、古いコントロールプレーンに接続されたままになります。
IstioとIstioRevisionの両方のリソースが、新しいリビジョンで準備ができていることを確認します。次のコマンドを実行して、
Istioリソースの準備ができていることを確認します。$ oc get istio出力例
NAME REVISIONS READY IN USE ACTIVE REVISION STATUS VERSION AGE default 2 2 1 default-v1-2-4 Healthy v1.24.4 9m23s次のコマンドを実行して、
IstioRevisionリソースの準備ができていることを確認します。$ oc get istiorevision出力例
NAME TYPE READY STATUS IN USE VERSION AGE default-v1-24-3 Local True Healthy True v1.24.3 10m default-v1-24-4 Local True Healthy False v1.24.4 66s
次のコマンドを実行して、リビジョンごとに 1 つずつ、合計 2 つのコントロールプレーン Pod が実行されていることを確認します。
$ oc get pods -n istio-system出力例
NAME READY STATUS RESTARTS AGE istiod-default-v1-24-3-c98fd9675-r7bfw 1/1 Running 0 10m istiod-default-v1-24-4-7495cdc7bf-v8t4g 1/1 Running 0 113s次のコマンドを実行して、ワークロードサイドカーが以前のコントロールプレーンにまだ接続されていることを確認します。
$ istioctl proxy-status出力例
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION details-v1-7d775cb4f6-5t9zm.info Kubernetes SYNCED (2m25s) SYNCED (2m25s) SYNCED (2m17s) SYNCED (2m25s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 productpage-v1-7c4b6b857-mxrw6.info Kubernetes SYNCED (2m35s) SYNCED (2m35s) SYNCED (2m17s) SYNCED (2m35s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 ratings-v1-5b896f8544-r552l.info Kubernetes SYNCED (2m21s) SYNCED (2m21s) SYNCED (2m17s) SYNCED (2m21s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v1-746f96c9d4-9pw8k.info Kubernetes SYNCED (2m17s) SYNCED (2m17s) SYNCED (2m17s) SYNCED (2m17s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v2-97bdf5876-4mzx5.info Kubernetes SYNCED (2m35s) SYNCED (2m35s) SYNCED (2m17s) SYNCED (2m35s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v3-77d9db6844-djgjk.info Kubernetes SYNCED (2m19s) SYNCED (2m19s) SYNCED (2m17s) SYNCED (2m19s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3VERSION列は、古いコントロールプレーンのバージョンと一致する必要があります。アプリケーションの namespace または Pod の
istio.io/revラベルをリビジョン名に更新して、ワークロードを新しいコントロールプレーンに移動します。たとえば、次のコマンドを実行して、namespace 全体のラベルを更新します。$ oc label namespace info istio.io/rev=<new_revision_name> --overwrite新しいバージョンのサイドカーが注入されるように、次のコマンドを入力してアプリケーションのワークロードを再起動します。
$ oc rollout restart deployment -n info
検証
次のコマンドを入力して、サイドカーの新しいバージョンが実行されていることを確認します。
$ istioctl proxy-statusVERSION列は、新しいコントロールプレーンのバージョンと一致する必要があります。古いコントロールプレーン、
Istio、IstioRevisionリソースが削除されていることを確認します。次のコマンドを実行して、古いコントロールプレーンが削除されたことを確認します。
$ oc get pods -n istio-system次のコマンドを実行して、
Istioリソースが削除されたことを確認します。$ oc get istio次のコマンドを実行して、
IstioRevisionリソースが削除されたことを確認します。$ oc get istiorevision
OpenShift Service Mesh Operator は、spec.updateStrategy.inactiveRevisionDeletionGracePeriodSeconds フィールドで定義された猶予期間が経過すると、古い IstioRevision リソースおよび関連付けられたコントロールプレーンを削除します。デフォルトの猶予期間は 30 秒です。
猶予期間を長くして、以前のリビジョンを削除する前に新しいコントロールプレーンをテストするための十分な時間を確保できます。完全に移行する前にワークロードの安定性を確保できるよう、カナリアアップグレード中に高い値を設定します。
1.6.4. RevisionBased ストラテジーと IstioRevisionTag を使用して Istio をインストールする リンクのコピーリンクがクリップボードにコピーされました!
RevisionBased 更新ストラテジーを使用して、Istio コントロールプレーン、IstioRevisionTag リソース、Istio CNI、および Bookinfo デモアプリケーションをインストールできます。
更新プロセスについては、次のセクションを参照してください。クラスターにすでに Istio デプロイメントが含まれている場合は、このインストールをスキップできます。
手順
次のコマンドを実行して、
istio-systemnamespace を作成します。$ oc create ns istio-systemRevisionBased更新ストラテジーを使用して Istio コントロールプレーンをデプロイします。次の設定例では、istio-systemnamespace にdefaultという名前のIstioリソースを作成します。設定例
apiVersion: sailoperator.io/v1 kind: Istio metadata: name: default spec: namespace: istio-system updateStrategy: type: RevisionBased version: v1.24.3IstioRevisionTagリソースを作成します。次の設定例では、defaultという名前のIstioRevisionTagリソースを作成します。設定例
apiVersion: sailoperator.io/v1 kind: IstioRevisionTag metadata: name: default spec: targetRef: kind: Istio name: defaulttargetRefフィールドが目的のIstioリソースを指していることを確認します。上記の例では、IstioRevisionTagはdefaultという名前のIstioリソースを参照します。次のコマンドを実行して、
istio-cninamespace を作成します。$ oc create ns istion-cni必要なバージョンの Istio CNI プラグインをインストールします。次の設定例では、
istio-cninamespace にdefaultという名前のIstioCNIリソースを作成します。設定例
apiVersion: sailoperator.io/v1 kind: IstioCNI metadata: name: default spec: version: v1.24.3 namespace: istio-cniクラスターで実行するアプリケーションワークロードを設定します。次の例では、
bookinfonamespace にinfoアプリケーションをデプロイします。次のコマンドを実行して、
infonamespace を作成します。$ oc create ns info次のコマンドを実行して、
infonamespace にラベルを付け、サイドカーインジェクションを有効にします。$ oc label namespace info istio-injection=enabled次のコマンドを実行して、
bookinfonamespace にinfoPod をインストールします。$ oc apply -f https://raw.githubusercontent.com/openshift-service-mesh/istio/release-1.24/samples/info/platform/kube/bookinfo.yaml -n bookinfo
次のコマンドを実行して、
IstioRevisionTagリソースを確認します。$ oc get istiorevisiontag出力例
NAME STATUS IN USE REVISION AGE default Healthy True default-v1-24-3 2m46sアクティブなワークロードと
infonamespace の両方がタグを参照するようになったため、IN USEフィールドにはTrueが表示されます。次のコマンドを実行して、プロキシーのバージョンがコントロールプレーンのバージョンと一致していることを確認します。
$ istioctl proxy-statusVERSION列は、コントロールプレーンのバージョンと一致する必要があります。出力例
NAME TYPE READY STATUS IN USE VERSION AGE default-v1-24-3 Local True Healthy True v1.24.3 5m31s
1.6.5. RevisionBased ストラテジーと IstioRevisionTag を使用して Istio コントロールプレーンを更新する リンクのコピーリンクがクリップボードにコピーされました!
RevisionBased ストラテジーを使用して Istio を更新する場合、特定の IstioRevision リソースにタグを付ける IstioRevisionTag リソースを作成できます。IstioRevisionTag リソースを使用すると、namespace または Pod の istio.io/rev ラベルを変更せずに、特定の IstioRevision リソースにワークロードを割り当てることができます。
前提条件
-
cluster-adminロールを持つユーザーとして OpenShift Container Platform にログインしている。 -
Red Hat OpenShift Service Mesh Operator 3 をインストールし、
RevisionBasedストラテジーを使用して Istio をデプロイした。この例では、defaultという名前のIstioリソースがistio-systemnamespace にデプロイされます。 -
IstioRevisionTagリソースを作成し、targetRefフィールドは目的のIstioリソースを参照している。 - 必要なバージョンの Istio CNI プラグインをインストールした。
-
サイドカーインジェクションを有効にするために、
infonamespace にラベルを付けた。 -
クラスター内でアプリケーションワークロードが実行されている。この例では、
infoアプリケーションがbookinfonamespace にデプロイされます。 -
ローカルマシンに
istioctlをインストールした。 -
IstioRevisionTagリソースのInUseフィールドがtrueに設定されていることを確認した。
手順
Istioリソースのバージョンを変更します。たとえば、Istio1.24.4に更新するには、次のコマンドを実行してspec.versionフィールドをv1.24.4に設定します。$ oc patch istio default --type='merge' -p '{"spec":{"version":"v1.24.4"}}'Istio CR のバージョン更新
kind: Istio spec: version: v1.24.4 updateStrategy: type: RevisionBasedService Mesh Operator は、コントロールプレーンの古いバージョンと並行して、コントロールプレーンの新しいバージョンをデプロイします。サイドカーは、古いコントロールプレーンに接続されたままになります。
Istio、IstioRevision、およびIstioRevisionTagリソースが、新しいリビジョンで準備できていることを確認します。次のコマンドを実行して、
Istioリソースの準備ができていることを確認します。$ oc get istio出力例
NAME REVISIONS READY IN USE ACTIVE REVISION STATUS VERSION AGE default 2 2 1 default-v1-24-3 Healthy v1.24.3 9m23s次のコマンドを実行して、
IstioRevisionリソースの準備ができていることを確認します。$ oc get istiorevision出力例
NAME TYPE READY STATUS IN USE VERSION AGE default-v1-24-3 Local True Healthy True v1.24.3 10m default-v1-24-4 Local True Healthy True v1.24.4 66s次のコマンドを実行して、
IstioRevisionTagリソースの準備ができていることを確認します。$ oc get istiorevisiontag出力例
NAME STATUS IN USE REVISION AGE default Healthy True default-v1-24-4 10m44s
次のコマンドを実行して、各リビジョンに対して 2 つのコントロールプレーン Pod の準備ができていることを確認します。
$ oc get pods -n istio-system出力例
NAME READY STATUS RESTARTS AGE istiod-default-v1-24-3-c98fd9675-r7bfw 1/1 Running 0 10m istiod-default-v1-24-4-7495cdc7bf-v8t4g 1/1 Running 0 113s次のコマンドを実行して、プロキシーサイドカーのバージョンが同じであることを確認します。
$ istioctl proxy-status出力例
NAME CLUSTER CDS LDS EDS RDS ECDS ISTIOD VERSION details-v1-7d775cb4f6-5t9zm.info Kubernetes SYNCED (2m25s) SYNCED (2m25s) SYNCED (2m17s) SYNCED (2m25s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 productpage-v1-7c4b6b857-mxrw6.info Kubernetes SYNCED (2m35s) SYNCED (2m35s) SYNCED (2m17s) SYNCED (2m35s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 ratings-v1-5b896f8544-r552l.info Kubernetes SYNCED (2m21s) SYNCED (2m21s) SYNCED (2m17s) SYNCED (2m21s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v1-746f96c9d4-9pw8k.info Kubernetes SYNCED (2m17s) SYNCED (2m17s) SYNCED (2m17s) SYNCED (2m17s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v2-97bdf5876-4mzx5.info Kubernetes SYNCED (2m35s) SYNCED (2m35s) SYNCED (2m17s) SYNCED (2m35s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3 reviews-v3-77d9db6844-djgjk.info Kubernetes SYNCED (2m19s) SYNCED (2m19s) SYNCED (2m17s) SYNCED (2m19s) IGNORED istiod-default-v1-24-3-c98fd9675-r7bfw 1.24.3VERSION列は、古いコントロールプレーンのバージョンと一致する必要があります。新しいバージョンのサイドカーが注入されるように、次のコマンドを入力してアプリケーションのワークロードを再起動します。
$ oc rollout restart deployment -n info
検証
次のコマンドを入力して、サイドカーの新しいバージョンが実行されていることを確認します。
$ istioctl proxy-statusVERSION列は、新しいコントロールプレーンのバージョンと一致する必要があります。古いコントロールプレーン、
Istio、IstioRevisionリソースが削除されていることを確認します。次のコマンドを実行して、古いコントロールプレーンが削除されたことを確認します。
$ oc get pods -n istio-system次のコマンドを実行して、
Istioリソースが削除されたことを確認します。$ oc get istio次のコマンドを実行して、
IstioRevisionリソースが削除されたことを確認します。$ oc get istiorevision
OpenShift Service Mesh Operator は、spec.updateStrategy.inactiveRevisionDeletionGracePeriodSeconds フィールドで定義された猶予期間が経過すると、古い IstioRevision リソースおよび関連付けられたコントロールプレーンを削除します。デフォルトの猶予期間は 30 秒です。
猶予期間を長くして、以前のリビジョンを削除する前に新しいコントロールプレーンをテストするための十分な時間を確保できます。完全に移行する前にワークロードの安定性を確保できるよう、カナリアアップグレード中に高い値を設定します。