Service Mesh (ASM) を使用して複数のクラスターを管理する場合、これらのクラスター全体にサービスのワークロードをデプロイできます。デフォルトでは、ASM はすべてのクラスター間でサービスへのトラフィックを負荷分散します。トラフィックを送信元クラスター内に留めるには、クラスター内トラフィック維持機能を使用します。このトピックでは、Bookinfo アプリケーションを例に、マルチクラスター環境でこの機能を有効にする方法を説明します。
前提条件
-
同一の Virtual Private Cloud (VPC) 内に 2 つの Container Service for Kubernetes (ACK) クラスターが作成されていること。このトピックでは、クラスターの名前は m1c1 と m1c2 です。詳細については、「ACK 専用クラスターの作成 (廃止)」をご参照ください。
-
バージョン 1.15.3.101 以降の ASM インスタンスが作成されていること。このトピックでは、インスタンスの名前は mesh1 です。詳細については、「ASM インスタンスの作成」をご参照ください。
事前準備
ステップ 1:クラスター間接続の設定
(オプション) セキュリティグループの名前変更
識別しやすくするために、両方のクラスターのセキュリティグループの名前を変更します。この例では、セキュリティグループ名 をそれぞれ m1c1-sg と m1c2-sg に設定します。
クラスターのセキュリティグループ名を変更する方法
-
ECS コンソールにログインします。 左側のナビゲーションペインで、を選択します。
-
上部メニューで、対象の ECS インスタンスが配置されているリージョンを選択します。
-
セキュリティグループリスト ページで、ターゲットセキュリティグループの名前にカーソルを合わせ、
アイコンをクリックし、新しい名前を入力し、OK をクリックします。
セキュリティグループルールの追加
クラスター間で相互にアクセスできるように、セキュリティグループルールを追加します。m1c1-sg セキュリティグループの設定で、m1c2-sg からのアクセスを許可するルールを追加します。同様に、m1c2-sg セキュリティグループについても、m1c1-sg からのアクセスを許可するルールを追加します。詳細については、「セキュリティグループルールの追加」をご参照ください。
inbound 方向にルールを追加します。Authorization Policy を [Allow]、Protocol Type を [All]、Port Range を [-1/-1]、Authorization Type を [Security Group Access]、Priority を [1] に設定します。
ステップ 2:クラスターの追加とイングレスゲートウェイのデプロイ
両方のクラスターを ASM インスタンスに追加すると、相互にアクセスできるようになります。したがって、いずれか一方のクラスターにのみイングレスゲートウェイをデプロイする必要があります。
-
2 つのクラスターを ASM インスタンスに追加します。詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
-
m1c1 クラスターにイングレスゲートウェイをデプロイします。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ステップ 3:各クラスターへの Bookinfo のデプロイ
クラスター内トラフィック維持機能を検証するために、このトピックでは、わずかに異なる 2 つの Bookinfo アプリケーションを使用します。唯一の違いは、Reviews Service のバージョンです。m1c1 では v1 を実行し、m1c2 では v2 を実行します。
-
以下の YAML ファイルを使用して、m1c1 クラスターに v1 Reviews Deployment を含む Bookinfo アプリケーションをデプロイします。詳細については、「ASM インスタンスに関連付けられたクラスターへのアプリケーションのデプロイ」をご参照ください。
Reviews Service の v1 Deployment では、書籍レビューセクションに星評価が表示されません。
m1c1 の Bookinfo アプリケーション用 YAML ファイル
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.20.1
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
cluster: m1c1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
-
以下の YAML ファイルを使用して、m1c2 クラスターに v2 Reviews Deployment を含む Bookinfo アプリケーションをデプロイします。
Reviews Service の v2 Deployment では、書籍レビューセクションに評価が黒い星として表示されます。
m1c2 の Bookinfo アプリケーション用 YAML ファイル
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
cluster: m1c2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.20.1
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage サービス
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9080"
prometheus.io/path: "/metrics"
labels:
app: productpage
version: v1
cluster: m1c2
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.20.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
ステップ 4:Gateway、VirtualService、DestinationRule の作成
-
以下の YAML ファイルを使用して、ASM インスタンスの default 名前空間に Gateway を作成します。詳細については、「ゲートウェイの管理」をご参照ください。
Gateway 用 YAML ファイル
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
-
以下の YAML ファイルを使用して、ASM インスタンスの default 名前空間に VirtualService を作成します。詳細については、「仮想サービスの管理」をご参照ください。
VirtualService 用 YAML ファイル
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-cluster-local
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage1
rewrite:
uri: /productpage
route:
- destination:
host: productpage
port:
number: 9080
subset: m1c1
- match:
- uri:
exact: /productpage2
rewrite:
uri: /productpage
route:
- destination:
host: productpage
port:
number: 9080
subset: m1c2
- match:
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
-
以下の YAML ファイルを使用して、ASM インスタンスの default 名前空間に DestinationRule を作成します。詳細については、「宛先ルールの管理」をご参照ください。
DestinationRule 用 YAML ファイル
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: productpage-cluster-local
spec:
host: productpage
subsets:
- name: m1c1
labels:
cluster: m1c1
- name: m1c2
labels:
cluster: m1c2
-
ブラウザーで http://{イングレスゲートウェイの IP アドレス}/productpage1 または http://{イングレスゲートウェイの IP アドレス}/productpage2 にアクセスし、ページを更新します。
書籍レビューセクションで星評価が交互に表示されたり非表示になったりする場合、Bookinfo アプリケーションは正常にデプロイされています。ページには「BookInfo Sample」アプリケーションの「productpage」が表示され、書籍「The Comedy of Errors」に関する情報が表示されます。
操作手順
以下の手順では、特定のサービス (この場合は Reviews Service) に対してクラスター内トラフィック維持機能を有効にする方法について説明します。グローバルまたは名前空間レベルでこの機能を有効にする方法については、「関連操作」をご参照ください。
ASM コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
Base Information ページの Config Info セクションで、edit の右側にある Keep traffic in cluster をクリックします。
-
Configure services that keep traffic in cluster ダイアログボックスで、Enable Keep traffic in cluster スイッチをオンにし、Select Service を選択し、Select services をクリックします。
-
Add services ダイアログボックスで、Service を選択し、[名前空間] ドロップダウンリストから Namespace を選択し、[サービスの選択] セクションで Select services を選択し、
アイコンをクリックし、OK をクリックします。
-
設定が完了したら、Configure services that keep traffic in clusterをOK ダイアログボックスでクリックします。
Config Info セクションでは、Keep traffic in cluster の右側に 設定済み と表示されます。これは、Keep traffic in cluster 機能が有効であることを示します。
-
クラスター内トラフィック維持機能が動作していることを確認します。
-
ブラウザーで http://{イングレスゲートウェイの IP アドレス}/productpage1 にアクセスし、ページを更新します。
書籍レビューセクションに評価が一貫して表示されないことから、クラスター内トラフィック維持機能が期待どおりに動作していることがわかります。
-
ブラウザーで http://{イングレスゲートウェイの IP アドレス}/productpage2 にアクセスし、ページを更新します。
書籍レビューセクションに黒い星評価付きのレビューが一貫して表示されます。ページには書籍「The Comedy of Errors」の詳細と「Book Reviews」セクションのレビュー内容が正しく表示されます。これにより、トラフィックが m1c2 クラスター内のローカルサービスに正しくルーティングされていることが確認できます。
結果分析
次の図は、クラスター内トラフィック維持機能を有効にする前と後のメッシュ内のトラフィックフローを示しています。
|
状態
|
説明
|
|
無効
|
Bookinfo アプリケーションでは、Productpage Service が Reviews Service を呼び出して書籍レビューを取得します。ブラウザーで http://{イングレスゲートウェイの IP アドレス}/productpage1 にアクセスすると、m1c1 クラスター内の Productpage Service にアクセスします。http://{イングレスゲートウェイの IP アドレス}/productpage2 にアクセスすると、m1c2 クラスター内の Productpage Service にアクセスします。
Reviews Service のワークロードは、m1c1 と m1c2 の両方のクラスターに存在します。デフォルトでは、Service Mesh は、トラフィックがいずれかのクラスター内のサービス (たとえば、m1c1 の Productpage Service) から発生した場合でも、Reviews Service へのリクエストを両方のクラスター間で負荷分散します。その結果、書籍レビューセクションに星評価が交互に表示されたり非表示になったりします。
|
|
有効
|
m1c1 などの特定のクラスター内の Productpage Service にアクセスすると、Service Mesh はクラスター間でリクエストを負荷分散しなくなります。代わりに、すべてのリクエストをローカルの Reviews Service にルーティングします。その結果、書籍レビューセクションには一貫して星評価が表示されなくなります。
重要
この機能を有効にした後、m1c1 クラスター内の reviews-v1 Service に障害が発生した場合、Productpage Service は m1c2 クラスター内の reviews-v2 Service にフェールオーバーできません。
|
説明
サービスに対してクラスター内トラフィック維持機能を有効にすると、呼び出し元は同じクラスター内のサービスのエンドポイントにのみアクセスできます。クラスター内のエンドポイントが利用できない場合でも、メッシュは他のクラスター内のエンドポイントにトラフィックをシフトしません。
サービスのトラフィックをクラスター内に維持しつつフェールオーバーも有効にするには、トラフィックルールを使用してトラフィックレーンを作成し、トラフィックシフトを有効にします。詳細については、「トラフィックルールを使用したトラフィックレーンとトラフィックシフトの設定」をご参照ください。
関連操作
グローバルなクラスター内トラフィックの有効化
-
Base Information ページの Config Info セクションで、edit の右側にある Keep traffic in cluster をクリックします。
-
Configure services that keep traffic in cluster ダイアログボックスで、Enable Keep traffic in cluster スイッチをオンにし、All Services を選択して、OK をクリックします。
このオプションを有効にすると、Service Mesh はすべてのトラフィックを送信元クラスター内に留めます。
名前空間のクラスター内トラフィックの有効化
-
Base Information ページの Config Info セクションで、edit の右側にある Keep traffic in cluster をクリックします。
-
Configure services that keep traffic in cluster ダイアログボックスで、Enable Keep traffic in cluster スイッチをオンにし、Select Service を選択してから、Select services をクリックします。
-
Add services ダイアログボックスで Namespace を選択し、Select services セクションでターゲット名前空間を選択して
アイコンをクリックし、OK をクリックします。
-
Configure services that keep traffic in cluster ダイアログボックスで、OK をクリックします。
このオプションを有効にすると、Service Mesh は対象の名前空間内のサービスへのトラフィックを送信元クラスター内に留めます。