Share via


Open Service Mesh (OSM) 構成から Istio への移行ガイダンス

重要

この記事では、OSM 構成を識別して同等の Istio 構成に変換し、ワークロードを OSM から Istio に移行する方法について、簡単に理解できるように説明します。 これは、網羅的で詳細なガイドではありません。

この記事では、OSM によって管理されているマイクロサービスのデプロイを Istio による管理に移行できるよう、OSM ポリシーを Istio ポリシーにマッピングするための実用的なガイダンスを提供します。 OSM の Bookstore サンプル アプリケーションを、現行の OSM ユーザーにとってのベース リファレンスとして利用します。 次のチュートリアルでは、Bookstore アプリケーションをデプロイします。 同じ手順に従い、同等の Istio ポリシーを使用して OSM SMI トラフィック ポリシーを適用する方法について説明します。

OSM を使用しておらず、Istio を初めて使用する場合は、まず Istio のスタート ガイドを参照して、アプリケーションで Istio サービス メッシュを使用する方法を理解してください。 現在 OSM を使用している場合は、OSM でトラフィック ポリシーを構成する方法に関する OSM Bookstore サンプル アプリケーションのチュートリアルを理解していることを確認してください。 次のチュートリアルでは、現在のドキュメントと重複した説明はせず、必要に応じて特定のトピックを参照します。 先に進む前に、bookstore アプリケーションのアーキテクチャについて十分に理解しておくことをお勧めします。

前提条件

OSM サンプル Bookstore アプリケーションに必要な変更

Istio で OSM bookstore アプリケーションを管理できるようにするには、既存のマニフェストにいくつかの変更が必要です。 これらの変更は、bookstore および mysql サービスに関するものです。

Bookstore の変更

OSM Bookstore のチュートリアルでは、OSM でトラフィック シフトが提供されるしくみを説明するために、bookstore サービスが別の bookstore-v2 サービスと共にデプロイされます。 このデプロイされたサービスを使用すると、クライアント (bookbuyer) トラフィックを複数のサービス エンドポイント間で分割できます。 これは、Istio でトラフィック シフトと呼ばれているものを処理するしくみについて理解するための、最初の新しい概念です。

トラフィック シフトの OSM 実装は、SMI トラフィック分割仕様に基づいています。 SMI トラフィック分割仕様では、クライアントの要求をサービス間でシフトするためには、複数のトップレベル サービスが存在し、希望する重みメトリックを持つバックエンドとして追加されることが必要であると規定されています。 Istio では、仮想サービス宛先ルールの組み合わせを使用してトラフィック シフトを実現します。 仮想サービスと宛先ルールの両方の概念をよく理解することを強くお勧めします。

簡単に言うと、Istio 仮想サービスは、ホスト (サービス名) を要求するクライアントのルーティング規則を定義します。 仮想サービスを使用すると、デプロイの複数のバージョンを、クライアントがターゲットにする 1 つの仮想サービス ホスト名に関連付けることができます。 同じサービスに対して複数のデプロイにラベルを付けて、同じホスト名の背後にある異なったバージョンのアプリケーションを表すことができます。 その後、要求を特定のバージョンのサービスに重み付けするように Istio 仮想サービスを構成できます。 サービスの使用可能なバージョンは、subsets 属性を使用するように Istio 宛先ルールで構成されます。

Istio で bookstore のサービスとデプロイに変更を加えることで、明示的な 2 番目のサービスをターゲットにする必要がなくなります (SMI トラフィック分割ではこれが必要です)。 bookstore v2 サービス は bookstore サービスの配下に統合されるため、v2 サービス用に別のサービス アカウントを用意する必要ありません。 bookstore v1 と v2 の両方に対する、元の OSM traffic-access-v1.yaml マニフェストの Istio での変更は、この後の「ポッド、サービス、サービス アカウントを作成する」のセクションで示しています。 トラフィック分割 (後のチュートリアルではトラフィック シフトと呼びます) を行う方法を示します。

MySql の変更

mysql ステートフル セットの変更は、サービス構成でのみ必要です。 サービス仕様によると、OSM には targetPort および appProtocol 属性が必要でした。 Istio には、これらの属性は必要ありません。 mysqldb の更新されたサービスは次のようになります。

apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb

変更した Bookstore アプリケーションをデプロイする

OSM Bookstore チュートリアルと同様に、bookstore アプリケーションの新しいインストールから始めます。

名前空間を作成する

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse

Istio サイドカー インジェクションの名前空間ラベルを追加する

OSM では、コマンド osm namespace add <namespace> を使用して名前空間の注釈を作成しました。これは、OSM コントローラーで自動サイドカー インジェクションを追加するために必要なものです。 Istio では、名前空間にラベルを付けるだけで、Envoy サイドカー プロキシを自動的に挿入するように Istio コントローラーに指示できます。

kubectl label namespace bookstore istio-injection=enabled
kubectl label namespace bookbuyer istio-injection=enabled
kubectl label namespace bookthief istio-injection=enabled
kubectl label namespace bookwarehouse istio-injection=enabled

Bookstore 用の Istio 仮想サービスと宛先ルールをデプロイする

「Bookstore の変更」で既に説明したように、Istio では、チュートリアルでこれより後に構成する VirtualService 重み属性を使用してトラフィック シフトを処理します。 bookstore サービス用の仮想サービスと宛先ルールをデプロイします。 bookstore バージョン 2 がデプロイされている場合でも、bookstore バージョン 1 のみをデプロイします。 Istio 仮想サービスでは、bookstore のバージョン 1 へのルートのみを提供しています。 これは、OSM でトラフィック シフト (トラフィック分割) を処理するしくみとは異なります。OSM では、bookstore バージョン 2 アプリケーション用に別のサービスをデプロイしていました。 OSM では、TrafficSplit を使用してクライアント要求間でトラフィックを分割するように設定する必要がありました。 Istio でトラフィック シフトを使用する場合は、同じサービスに対してラベル付けされた複数の Kubernetes アプリケーション デプロイ (バージョン) へのトラフィックのシフトを参照できます。

このチュートリアルでは、両方の Bookstore バージョン (v1 および v2) のデプロイが同時にデプロイされます。 仮想サービスの構成により、バージョン 1 のみが到達可能です。 bookstore バージョン 2 用に別のサービスをデプロイする必要はありません。後で bookstore 仮想サービスを更新し、トラフィック シフトを行うために必要な重み属性を提供するときに、bookstore バージョン 2 へのルートを有効にします。

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
---
# Create bookstore destination rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookstore-destination
  namespace: bookstore
spec:
  host: bookstore
  subsets:
  - name: v1
    labels:
      app: bookstore
      version: v1
  - name: v2
    labels:
      app: bookstore
      version: v2
EOF

ポッド、サービス、サービス アカウントを作成する

チュートリアルでこれよりも前に説明した変更を含む 1 つのマニフェスト ファイルを使用して、bookbuyerbookthiefbookstorebookwarehousemysql の各アプリケーションをデプロイします。

kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookbuyer
  namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookbuyer
      version: v1
  template:
    metadata:
      labels:
        app: bookbuyer
        version: v1
    spec:
      serviceAccountName: bookbuyer
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookbuyer
          image: openservicemesh/bookbuyer:latest-main
          imagePullPolicy: Always
          command: ["/bookbuyer"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookthief
  namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookthief
  namespace: bookthief
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookthief
  template:
    metadata:
      labels:
        app: bookthief
        version: v1
    spec:
      serviceAccountName: bookthief
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookthief
          image: openservicemesh/bookthief:latest-main
          imagePullPolicy: Always
          command: ["/bookthief"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
            - name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
              value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
  name: bookstore
  namespace: bookstore
  labels:
    app: bookstore
spec:
  ports:
    - port: 14001
      name: bookstore-port
  selector:
    app: bookstore

---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookstore
  namespace: bookstore

---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v1
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v1
  template:
    metadata:
      labels:
        app: bookstore
        version: v1
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v1

---
# Create bookstore-v2 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v2
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v2
  template:
    metadata:
      labels:
        app: bookstore
        version: v2
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v2
---
##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
  labels:
    app: bookwarehouse
spec:
  ports:
  - port: 14001
    name: bookwarehouse-port
  selector:
    app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookwarehouse
  template:
    metadata:
      labels:
        app: bookwarehouse
        version: v1
    spec:
      serviceAccountName: bookwarehouse
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookwarehouse
          image: openservicemesh/bookwarehouse:latest-main
          imagePullPolicy: Always
          command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysql
  namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: bookwarehouse
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      serviceAccountName: mysql
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
        - name: MYSQL_DATABASE
          value: booksdemo
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /mysql-data
          name: data
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 10
      volumes:
        - name: data
          emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 250M
EOF

クラスター上のこれらのリソースを表示するには、次のコマンドを実行します。

kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief

kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse

アプリケーション UI を表示する

元の OSM チュートリアルと同様に、OSM リポジトリのクローンを作成済みの場合は、ポート転送スクリプトを利用して各アプリケーションの UI を表示できます (こちらを参照)。 ここでは、bookbuyerbookthief の UI のみを表示します。

cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF

ブラウザーで、次の URL を開きます。

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

Istio のトラフィック ポリシーを構成する

Istio への変換に関して、元の OSM Bookstore チュートリアルとの継続性を維持するために、OSM の制限のないトラフィック ポリシー モードについて説明します。 OSM の制限のないトラフィック ポリシー モードは、特定の SMI トラフィック アクセス制御ルールをデプロイせずに、メッシュ内のトラフィックを許可または拒否するという概念でした。 制限のないトラフィック モードの構成は、メッシュ内のアプリケーションに通信を許可する明示的なルールを必要とせずに、mTLS 暗号化を使用しながらユーザーがアプリケーションをメッシュにオンボードできるように存在していました。 制限のないトラフィック モードの機能により、アプリケーションが OSM の管理下に入ってもすぐにアプリケーションの通信が中断することはなく、アプリケーションの通信が mTLS で暗号化されることは保証されたまま、独自のルールを定義するための時間が提供されていました。 この設定は、OSM の MeshConfig を使用して true または false に設定できます。

Istio では、mTLS の適用は異なる方法で処理されます。 OSM とは異なり、Istio の制限モードでは、mTLS を使用するようにサイドカー プロキシが自動的に構成されますが、サービスはプレーンテキストと mTLS の両方のトラフィックを受け入れることができます。 OSM の制限のないモードの構成と同じ動作を実現するには、Istio の PeerAuthentication 設定を利用します。 PeerAuthentication は名前空間単位で、またはメッシュ全体の単位で実行できます。 Istio による mTLS の適用の詳細については、Istio の相互 TLS 移行に関する記事を参照してください。

Bookstore 名前空間で Istio 厳格モードを適用する

重要な注意点として、OSM の制限のないモードと同様に、Istio の PeerAuthentication 構成は mTLS 適用の使用にのみ関連します。 OSM の HTTPRouteGroups で使用されるものと同様に、実際のレイヤー 7 ポリシーは、このチュートリアルで後から説明する Istio の AuthorizationPolicy 構成を使用して処理されます。

Istio の mTLS 厳密モードでは、bookbuyerbookthiefbookstorebookwarehouse 名前空間をきめ細かく配置します。

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookthief
  namespace: bookthief
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookstore
  namespace: bookstore
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  mtls:
    mode: STRICT
EOF

Istio アクセス制御ポリシーをデプロイする

OSM の SMI Traffic Target および SMI Traffic Specs リソースでは、アプリケーションで通信するためのアクセス制御とルーティング ポリシーを定義しますが、Istio では AuthorizationPolicy 構成を使用して、これらのリソースと同様のきめ細かな制御を実現します。

bookstore の TrafficTarget ポリシーを変換してみましょう。このポリシーは、具体的には、特定のレイヤー 7 パス、ヘッダー、メソッドのみを使用して bookbuyer が bookstore と通信することを許可するものです。 traffic-access-v1.yaml マニフェストの一部を次に示します。

kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
  name: bookstore
  namespace: bookstore
spec:
  destination:
    kind: ServiceAccount
    name: bookstore
    namespace: bookstore
  rules:
    - kind: HTTPRouteGroup
      name: bookstore-service-routes
      matches:
        - buy-a-book
        - books-bought
  sources:
    - kind: ServiceAccount
      name: bookbuyer
      namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

TrafficTarget ポリシーの spec では、宛先サービスと通信できるソース サービスを明示的に定義できます。 ソースの bookbuyer が宛先の bookstore と通信することを許可しています。 サービス間の認可を OSM の TrafficTarget 構成から Istio の AuthorizationPolicy に変換すると、次のようになります。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: bookstore
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]

Istio の AuthorizationPolicy では、OSM TrafficTarget ポリシーの宛先サービスを、セレクター ラベルの一致と、サービスが配置されている名前空間にマップしています。 ソース サービスは rules セクションの source/principles 属性に示されており、bookbuyer サービスのサービス アカウント名にマップします。

OSM では、TrafficTarget でソースと宛先を構成するだけでなく、HTTPRouteGroup を使用して、ソースがアクセスできるレイヤー 7 認可をさらに定義します。 次の HTTPRouteGroup の一部をご覧ください。 許可されるソース サービスに 2 つの matches があります。

apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

books-bought という名前の match では、GET メソッドとホット ヘッダーの user-agent および client-app の情報を使用してパス /books-bought にアクセスすることをソースに許可します。もう 1 つの buy-a-book という match では、.*a-book.*new を含むパスを正規表現で指定し、GET メソッドの使用も指定しています。

これらの OSM HTTPRouteGroup 構成は、次に示す Istio AuthorizationPolicy の rules セクションで定義できます。

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]

OSM から移行した traffic-access-v1.yaml マニフェストが、次のように Istio に変換され、デプロイできるようになりました。 bookthief の AuthorizationPolicy は存在しないため、bookthief UI は bookstore v1 からの本のインクリメントを停止します。

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

bookthief アプリケーションが bookstore にアクセスできるようにする

この時点では、bookthief が bookstore と通信することを許可する AuthorizationPolicy はありません。 次の AuthorizationPolicy をデプロイして、bookthief が bookstore と通信することを許可できます。 bookthief の認可を許可するルールが bookstore ポリシーに追加されていることがわかります。

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer", "cluster.local/ns/bookthief/sa/bookthief"]
        - source:
            namespaces: ["bookbuyer", "bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

bookthief UI で bookstore v1 から本をインクリメントするようになりました。

2 つのサービス バージョン間のトラフィック シフトを構成する

Kubernetes サービスの 2 つのバージョン間でトラフィックのバランスを取る方法について説明します。これは、Istio ではトラフィック シフトと呼ばれるものです。 前のセクションで説明したように、トラフィック シフトの OSM 実装には、2 つの異なるサービスをデプロイし、それらのサービス名を TrafficTarget ポリシーのバックエンド構成に追加することが必要でした。 このデプロイ アーキテクチャは、Istio でのトラフィック シフトの実装には必要ありません。 Istio では、サービス アプリケーションの各バージョンを表す複数のデプロイを作成し、Istio の virtualservice 構成を介してトラフィックをそれらの特定のバージョンにシフトすることができます。

次に示すように、現在デプロイされている virtualservice には、bookstore の v1 バージョンへのルート ルールのみがあります。

spec:
  hosts:
    - bookstore
  http:
    - route:
        - destination:
            host: bookstore
            subset: v1

virtualservice を更新して、重みの 100% を bookstore の v2 バージョンにシフトします。

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
      weight: 0
    - destination:
        host: bookstore
        subset: v2
      weight: 100
EOF

bookbuyer UI と bookthief UI の両方が、bookstore v2 サービスのみに対してインクリメントするようになったことがわかります。 weigth 属性を変更して、2 つの bookstore バージョン間でのトラフィックのシフトをさらに実験してみましょう。

まとめ

このチュートリアルで、現在の OSM ポリシーを Istio ポリシーに移行する方法について必要なガイダンスを提供できたことを願っています。 時間のある方は、Istio の概念を復習し、Istio のスタート ガイドを参照して、Istio サービス メッシュを使用してアプリケーションを管理する方法を学んでください。