1.15. ゲートウェイ移行
ネットワーク管理者として Ingress ゲートウェイと Egress ゲートウェイをデプロイする場合、Deployment
リソースでゲートウェイインジェクションを使用する方法が推奨されます。
1.15.1. ゲートウェイ移行について
Red Hat OpenShift Service Mesh 2.x では、Service Mesh Operator はデフォルトでコントロールプレーンの namespace に Ingress ゲートウェイと Egress ゲートウェイを作成します。ServiceMeshControlPlane
リソースで追加のゲートウェイを定義できます。
ゲートウェイインジェクションを使用して Deployment
リソースで Ingress ゲートウェイと Egress ゲートウェイをデプロイすると、柔軟性と制御性が向上します。このデプロイ方法は、コントロールプレーンリソースで管理するのではなく、対応するアプリケーションと一緒にゲートウェイを管理できるため、より優れた方法です。したがって、デフォルトゲートウェイを無効にし、Service Mesh Control Plane での宣言から移行して、ゲートウェイインジェクションの使用を開始することを推奨します。
1.15.2. SMCP 定義のゲートウェイからゲートウェイインジェクションへの移行
この手順では、ServiceMeshControlPlane
リソースで定義されているゲートウェイから、ゲートウェイインジェクションを使用して管理するゲートウェイに、ダウンタイムなしで移行する方法を説明します。この移行は、既存のゲートウェイの Service
オブジェクトを使用して、ゲートウェイインジェクションを使用して作成した新しいゲートウェイデプロイメントをターゲットにすることで実現します。
前提条件
-
OpenShift Container Platform Web コンソールに
cluster-admin
としてログインしている。 - Red Hat OpenShift Service Mesh Operator がインストールされている。
-
ServiceMeshControlPlane
リソースをデプロイ済みであり、設定に Ingress ゲートウェイが存在する。
手順
新しい Ingress ゲートウェイを作成し、ゲートウェイインジェクションを使用するように設定します。
注記この手順では、
ServiceMeshControlPlane
リソースで定義されているデフォルトの Ingress ゲートウェイデプロイメントからゲートウェイインジェクションに移行します。SMCP で設定された追加の Ingress ゲートウェイから移行する場合は、手順が変わる場合があります。ゲートウェイインジェクションを使用した Ingress ゲートウェイリソースの例
apiVersion: apps/v1 kind: Deployment metadata: name: istio-ingressgateway-canary namespace: istio-system 1 spec: selector: matchLabels: app: istio-ingressgateway istio: ingressgateway template: metadata: annotations: inject.istio.io/templates: gateway labels: 2 app: istio-ingressgateway istio: ingressgateway sidecar.istio.io/inject: "true" spec: containers: - name: istio-proxy image: auto serviceAccountName: istio-ingressgateway --- apiVersion: v1 kind: ServiceAccount metadata: name: istio-ingressgateway namespace: istio-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: secret-reader namespace: istio-system rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: istio-ingressgateway-secret-reader namespace: istio-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: secret-reader subjects: - kind: ServiceAccount name: istio-ingressgateway --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy 3 metadata: name: gatewayingress namespace: istio-system spec: podSelector: matchLabels: istio: ingressgateway ingress: - {} policyTypes: - Ingress
- 1
- ゲートウェイインジェクションのデプロイメントとすべてのサポートリソースは、SMCP 定義ゲートウェイと同じ namespace にデプロイする必要があります。
- 2
- Pod テンプレートで指定されているラベルに、既存の SMCP 定義ゲートウェイに関連する
Service
オブジェクトで指定されているすべてのラベルセレクターが含まれていることを確認します。 - 3
- クラスターの外部から新しいゲートウェイへのアクセスを許可します。このアクセスは、
ServiceMeshControlPlane
リソースのspec.security.manageNetworkPolicy
がtrue
(デフォルト設定) に設定されている場合に必要です。
新しいゲートウェイデプロイメントが要求を正常に処理していることを確認します。
ServiceMeshControlPlane
リソースでアクセスロギングが設定されている場合は、新しいゲートウェイデプロイメントのアクセスログを表示して動作を確認します。古いデプロイメントをスケールダウンし、新しいデプロイメントをスケールアップします。
次の手順を実行して、古いゲートウェイデプロイメントから新しいゲートウェイデプロイメントにトラフィックを徐々に移行します。
次のコマンドを実行して、新しいゲートウェイデプロイメントのレプリカの数を増やします。
$ oc scale -n istio-system deployment/<new_gateway_deployment> --replicas <new_number_of_replicas>
次のコマンドを実行して、古いゲートウェイデプロイメントのレプリカの数を減らします。
$ oc scale -n istio-system deployment/<old_gateway_deployment> --replicas <new_number_of_replicas>
-
前の 2 つのコマンドを繰り返し実行します。毎回、新しいゲートウェイデプロイメントのレプリカの数を増やし、古いゲートウェイデプロイメントのレプリカの数を減らします。新しいゲートウェイデプロイメントによって、ゲートウェイの
Service
オブジェクトへのトラフィックがすべて処理されるまで繰り返します。
次のコマンドを実行して、ゲートウェイの
Service
オブジェクトからapp.kubernetes.io/managed-by
ラベルを削除します。$ oc label service -n istio-system istio-ingressgateway app.kubernetes.io/managed-by-
ラベルを削除すると、
ServiceMeshControlPlane
リソースでゲートウェイが無効にされたときにサービスが削除されなくなります。次のコマンドを実行して、ゲートウェイの
Service
オブジェクトからownerReferences
オブジェクトを削除します。$ oc patch service -n istio-system istio-ingressgateway --type='json' -p='[{"op": "remove", "path": "/metadata/ownerReferences"}]'
このオブジェクトを削除すると、
ServiceMeshControlPlane
リソースが削除されたときにサービスがガベージコレクションされなくなります。次のコマンドを実行して、
ServiceMeshControlPlane
リソースによって管理されていた古いゲートウェイデプロイメントを無効にします。$ oc patch smcp -n istio-system <smcp_name> --type='json' -p='[{"op": "replace", "path": "/spec/gateways/ingress/enabled", "value": false}]'
注記古い Ingress ゲートウェイの
Service
オブジェクトを無効にしても、このオブジェクトは削除されません。このService
オブジェクトをファイルに保存し、新しいゲートウェイインジェクションリソースと一緒に管理できます。