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 アプリケーションのアーキテクチャについて十分に理解しておくことをお勧めします。
前提条件
- Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、無料のアカウントを作成できます。
- Azure CLI がインストールされていること。
- OSM AKS アドオンが AKS クラスターからアンインストールされている
- 既存のすべての OSM Bookstore アプリケーションが、名前空間を含めてアンインストールされ、クラスターから削除されている
- Istio AKS サービス メッシュ アドオンをインストールする
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 つのマニフェスト ファイルを使用して、bookbuyer
、bookthief
、bookstore
、bookwarehouse
、mysql
の各アプリケーションをデプロイします。
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 を表示できます (こちらを参照)。 ここでは、bookbuyer
と bookthief
の 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 厳密モードでは、bookbuyer
、bookthief
、bookstore
、bookwarehouse
名前空間をきめ細かく配置します。
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 サービス メッシュを使用してアプリケーションを管理する方法を学んでください。
Azure Kubernetes Service