Service Mesh (ASM) を使用して複数のクラスターを管理する場合、サービスのワークロードを複数のクラスターにデプロイできます。デフォルトでは、サービスへのトラフィックはクラスター間で負荷分散されます。トラフィックをローカルクラスター内に保持するには、クラスターローカルトラフィック保持機能を使用できます。このトピックでは、Bookinfo アプリケーションを例として、マルチクラスターシナリオで ASM のクラスターローカルトラフィック保持機能を有効にする方法を説明します。
前提条件
同一の Virtual Private Cloud (VPC) 内に 2 つの ACK クラスターを作成します。このトピックでは、m1c1 と m1c2 を例として使用します。詳細については、「ACK 専用クラスターを作成する (新規作成は中止)」をご参照ください。
バージョン 1.15.3.101 以降の ASM インスタンスを作成します。このトピックでは、mesh1 を例として使用します。詳細については、「ASM インstance を作成する」をご参照ください。
準備
ステップ 1: クラスター間の接続性を構成する
(オプション) クラスターのセキュリティグループ名を変更する
2 つのクラスターのセキュリティグループの名前を変更して、識別しやすくすることができます。これにより、後続の構成が簡素化されます。この例では、[セキュリティグループ名] を m1c1-sg および m1c2-sg に設定します。
クラスターのセキュリティグループ名の変更方法を展開して表示
ECS コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のメニューバーで、ターゲット ECS インスタンスが配置されているリージョンを選択します。
[セキュリティグループ] ページで、ターゲットセキュリティグループの名前にカーソルを合わせ、
アイコンをクリックし、新しい名前を入力してから [OK] をクリックします。
セキュリティグループルールを追加する
2 つのクラスターが相互にアクセスできるように、セキュリティグループルールを追加します。m1c1-sg セキュリティグループの構成ページで、m1c2-sg からのアクセスを承認するルールを追加します。同様に、m1c2-sg セキュリティグループの構成ページで、m1c1-sg からのアクセスを承認するルールを追加します。詳細については、「セキュリティグループルールを追加する」をご参照ください。
図 1. m1c1-sg セキュリティグループ構成の例
ステップ 2: クラスターを ASM インスタンスに追加し、イングレスゲートウェイをデプロイする
両方のクラスターを ASM インスタンスに追加すると、相互にアクセスできるようになります。したがって、イングレスゲートウェイはクラスターの 1 つにのみデプロイする必要があります。
2 つのクラスターを ASM インスタンスに追加します。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
m1c1 クラスターにイングレスゲートウェイをデプロイします。詳細については、「イングレスゲートウェイを作成する」をご参照ください。
ステップ 3: 2 つの各クラスターに Bookinfo アプリケーションをデプロイする
このトピックでは、2 つの別々のクラスターに Bookinfo アプリケーションをデプロイする例を使用して、ASM のクラスターローカルトラフィック保持機能を示します。2 つのクラスターのサービス間の唯一の違いは、Reviews コンポーネントのバージョンです。m1c1 クラスターは v1 を使用し、m1c2 クラスターは v2 を使用します。他のすべてのコンポーネントは同じです。
次の YAML ファイルを使用して、m1c1 に v1 Reviews デプロイメントを持つ Bookinfo アプリケーションをデプロイします。詳細については、「ASM インスタンスに関連付けられたクラスターにアプリケーションをデプロイする」をご参照ください。
v1 Reviews デプロイメントでは、Web ページの書籍レビューセクションに星評価が表示されません。
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 デプロイメントを持つ Bookinfo アプリケーションをデプロイします。
v2 Reviews デプロイメントでは、Web ページの書籍レビューセクションに白黒の星評価が表示されます。
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: ASM でゲートウェイルール、仮想サービス、宛先ルールを作成する
次の YAML ファイルを使用して、ASM インスタンスの default 名前空間にゲートウェイルールを作成します。詳細については、「ゲートウェイルールを管理する」をご参照ください。
ゲートウェイルールの 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 名前空間に仮想サービスを作成します。詳細については、「仮想サービスを管理する」をご参照ください。
仮想サービスの 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 名前空間に宛先ルールを作成します。詳細については、「宛先ルールを管理する」をご参照ください。
宛先ルールの 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://{INGRESS_GATEWAY_IP}/productpage1 または http://{INGRESS_GATEWAY_IP}/productpage2 にアクセスし、ページをリフレッシュします。
書籍レビューセクションに星評価が交互に表示される場合、Bookinfo アプリケーションが正常にデプロイされたことを示します。
プロシージャ
次のプロシージャでは、サービスレベルでクラスターローカルトラフィック保持を有効にして、Reviews サービスのトラフィックをローカルクラスター内に保持する方法を示します。この機能をグローバルレベルまたは名前空間レベルで有効にする方法については、「関連操作」をご参照ください。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[基本情報] ページで、[構成情報] セクションの [クラスターローカルトラフィック保持] の右側にある [編集] をクリックします。
[クラスターローカルトラフィック保持サービスの構成] ダイアログボックスで、[クラスターローカルトラフィック保持を有効にする] スイッチをオンにし、[一部のサービスに適用] を選択してから [サービスの選択] をクリックします。
[サービスの追加] ダイアログボックスで、[サービス] を選択します。[名前空間] を [default] に設定します。[サービスの選択] セクションで [reviews] を選択し、
アイコンをクリックしてから [OK] をクリックします。
構成が完了したら、[クラスターローカルトラフィック保持サービスの構成] ダイアログボックスで [OK] をクリックします。

[構成情報] セクションで、[クラスターローカルトラフィック保持] の右側に 設定済み が表示されます。これは、[クラスターローカルトラフィック保持] 機能が有効になっていることを示します。
クラスターローカルトラフィック保持機能が有効であることを確認します。
ブラウザで http://{INGRESS_GATEWAY_IP}/productpage1 にアクセスし、ページをリフレッシュします。
書籍レビューセクションには評価が表示されません。
ブラウザで http://{INGRESS_GATEWAY_IP}/productpage2 にアクセスし、ページをリフレッシュします。
書籍レビューセクションには常に白黒の星評価が表示されます。
これらの結果は、クラスターローカルトラフィック保持機能が有効であることを示しています。
結果分析
次の図は、クラスターローカルトラフィック保持機能が有効になる前と後のサービスメッシュ内のトラフィックフローを示しています。
タイプ | 説明 |
クラスターローカルトラフィック保持が無効 | Bookinfo アプリケーションでは、Productpage コンポーネントが Reviews サービスを呼び出して書籍レビュー情報を取得します。ブラウザで http://{INGRESS_GATEWAY_IP}/productpage1 にアクセスすると m1c1 クラスターの Productpage にリダイレクトされ、http://{INGRESS_GATEWAY_IP}/productpage2 にアクセスすると m1c2 クラスターの Productpage にリダイレクトされます。 Reviews サービスのワークロードは m1c1 と m1c2 の両方のクラスターに存在します。デフォルトでは、m1c1 のような特定のクラスターの Productpage にアクセスしている場合でも、Reviews サービスへのリクエストは両方のクラスター間で負荷分散されます。Productpage の書籍レビューセクションに星評価が交互に表示されます。 |
クラスターローカルトラフィック保持が有効 | m1c1 クラスターの Productpage など、特定のクラスターにアクセスすると、Reviews サービスへのリクエストは 2 つのクラスター間で負荷分散されません。Productpage ページの書籍レビューセクションには評価が表示されません。交互に表示されていた星評価は表示されなくなります。
重要 トラフィック保持機能が有効になった後、m1c1 クラスターの Reviews-v1 が障害によりオフラインになった場合、Productpage は m1c2 クラスターの Reviews-v2 にアクセスしてサービスを提供することはできません。 |
説明 あるサービスに対してクラスターローカルトラフィック保持を有効にすると、他のサービスのワークロードはそのサービスの同じクラスター内のエンドポイントにのみアクセスできます。ローカルクラスターのエンドポイントが利用できない場合でも、トラフィックは他のクラスターにあるそのサービスのエンドポイントにはルーティングされません。
サービスに対してクラスターローカルトラフィック保持とトラフィック縮退の両方を実装したい場合は、「トラフィックルールに基づいてトラフィックレーンとトラフィック縮退を構成する」をご参照ください。トラフィックルールを使用してトラフィックレーンを作成し、異なるクラスターのサービスに対してトラフィック縮退を実装できます。
関連操作
クラスターローカルトラフィック保持をグローバルに有効にする
[基本情報] ページで、[構成情報] セクションの [クラスターローカルトラフィック保持] の右側にある [編集] をクリックします。
[クラスターローカルトラフィック保持サービスの構成] ダイアログボックスで、[クラスターローカルトラフィック保持を有効にする] スイッチをオンにし、[すべてのサービスに適用] を選択してから [OK] をクリックします。
この機能を有効にすると、すべてのサービスのトラフィックがそれぞれのローカルクラスター内に保持されます。
名前空間ごとにクラスターローカルトラフィック保持を有効にする
[基本情報] ページで、[構成情報] セクションの [クラスターローカルトラフィック保持] の右側にある [編集] をクリックします。
[クラスターローカルトラフィック保持サービスの構成] ダイアログボックスで、[クラスターローカルトラフィック保持を有効にする] スイッチをオンにし、[一部のサービスに適用] を選択してから [サービスの選択] をクリックします。
[サービスの追加] ダイアログボックスで、[名前空間] を選択します。[サービスの選択] セクションで、ターゲットの名前空間を選択し、
アイコンをクリックしてから [OK] をクリックします。
[クラスターローカルトラフィック保持サービスの構成] ダイアログボックスで、[OK] をクリックします。
この機能を有効にすると、ターゲット名前空間のサービスへのトラフィックはローカルクラスター内に保持されます。
