Service Mesh (ASM) のレイヤー 7 ルーティングは、URI パスおよびリクエストヘッダーに基づいてトラフィックをルーティングします。ルーティングルールを設定する前に、ASM 環境を構築し、ルーティングに関するチュートリアルで参照されるサンプルワークロードをデプロイしてください。
本トピックでは、以下の 2 つの手順について説明します:まず、ASM インスタンス、ACK クラスター、およびサイドカープロキシ注入が準備できていることを確認し、次に、ルーティングに関するチュートリアルで使用されるサンプルサービスをデプロイします。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Enterprise Edition の Service Mesh (ASM) インスタンス。詳細については、「ASM インスタンスの作成」をご参照ください。
重要 データプレーンモード セクション(Service Mesh の作成 ページ)で、Ambient Mesh モードを有効化 を選択しないでください。本ガイドで説明するレイヤー 7 ルーティング機能は、サイドカーモードでのみ動作します。
Container Service for Kubernetes (ACK) クラスター。いずれかのクラスターを作成してください:ACK 専用クラスター または ACK マネージドクラスター。
クラスターが ASM インスタンスに追加されていること。
default 名前空間で自動サイドカープロキシ注入が有効になっていること。「グローバル名前空間の管理」の「自動サイドカープロキシ注入の有効化」セクションをご参照ください。
サンプルワークロードのデプロイ
レイヤー 7 ルーティングに関するチュートリアルでは、4 つのサンプルサービスを使用します。ご自身が実施する予定のチュートリアルで必要なサービスのみをデプロイしてください。
| サービス | 目的 | リッスンポート |
|---|
| helloworld | バージョンベースのルーティングおよびトラフィック分割のテスト用マルチバージョンサービス(v1、v2) | ポート 5000 |
| sleep | メッシュ内の他のサービスに対してテストリクエストを送信するクライアント Pod(curl を含む) | ポート 80 |
| HTTPBin | リクエストの詳細(ヘッダー、URI パス、メソッド)を呼び出し元にエコー返す HTTP テストエンドポイント | ポート 8000 |
| NGINX | 基本的な URI パスルーティングのテスト用静的 Web サーバー | ポート 8000 |
kubeconfig ファイルを使用して kubectl をご利用の ACK クラスターに接続し、以下のセクションに従って操作を進めてください。
helloworld サービスのデプロイ
helloworld は、同一アプリケーションの v1 および v2 の 2 つのバージョンを実行します。これにより、バージョンベースのルーティングおよびトラフィック分割のテストに適しています。
以下の YAML を helloworld-application.yaml として保存します。
helloworld-application.yaml を表示
apiVersion: v1
kind: Service
metadata:
name: helloworld
labels:
app: helloworld
spec:
ports:
- port: 5000
name: http
selector:
app: helloworld
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: helloworld
labels:
account: helloworld
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v1
labels:
apps: helloworld
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: helloworld
version: v1
template:
metadata:
labels:
app: helloworld
version: v1
spec:
serviceAccount: helloworld
serviceAccountName: helloworld
containers:
- name: helloworld
image: istio/examples-helloworld-v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v2
labels:
apps: helloworld
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: helloworld
version: v2
template:
metadata:
labels:
app: helloworld
version: v2
spec:
serviceAccount: helloworld
serviceAccountName: helloworld
containers:
- name: helloworld
image: istio/examples-helloworld-v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
サービスをデプロイします。
kubectl apply -f helloworld-application.yaml
デプロイを確認します。期待される出力:アプリケーションコンテナとサイドカープロキシの両方が実行中であることを示すために、READY 列の値が 2/2 である必要があります。
kubectl get pods -l app=helloworld
NAME READY STATUS RESTARTS AGE
helloworld-v1-xxxxxxxxx-xxxxx 2/2 Running 0 30s
helloworld-v2-xxxxxxxxx-xxxxx 2/2 Running 0 30s
sleep サービスのデプロイ
sleep はクライアント Pod として機能します。アイドル状態を維持し、メッシュ内の他のサービスに対してテストリクエストを送信するための curl 環境を提供します。
以下の YAML を sleep-application.yaml として保存します。
sleep-application.yaml を表示
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: curlimages/curl
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
サービスをデプロイします。
kubectl apply -f sleep-application.yaml
デプロイを確認します。期待される出力:
kubectl get pods -l app=sleep
NAME READY STATUS RESTARTS AGE
sleep-xxxxxxxxx-xxxxx 2/2 Running 0 30s
HTTPBin サービスのデプロイ
HTTPBin は、リクエストの詳細(ヘッダー、URI パス、メソッド)を呼び出し元にエコー返します。これを使用して、ルーティングルールがリクエストを正しい送信先に転送していることを検証できます。
以下の YAML を httpbin-application.yaml として保存します。
httpbin-application.yaml を表示
apiVersion: v1
kind: ServiceAccount
metadata:
name: httpbin
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v1
template:
metadata:
labels:
app: httpbin
version: v1
spec:
serviceAccountName: httpbin
containers:
- image: docker.io/kennethreitz/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
ports:
- containerPort: 80
サービスをデプロイします。
kubectl apply -f httpbin-application.yaml
デプロイを確認します。期待される出力:
kubectl get pods -l app=httpbin
NAME READY STATUS RESTARTS AGE
httpbin-xxxxxxxxx-xxxxx 2/2 Running 0 30s
NGINX サービスのデプロイ
NGINX は静的コンテンツを提供します。基本的な URI パスルーティングを説明するチュートリアルで使用します。
以下の YAML を nginx.yaml として保存します。
nginx.yaml を表示
apiVersion: v1
kind: ServiceAccount
metadata:
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
service: nginx
name: nginx
spec:
ports:
- name: http
port: 8000
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
version: v1
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
version: v1
template:
metadata:
labels:
app: nginx
version: v1
spec:
serviceAccountName: nginx
containers:
- image: 'nginx:1.7.9'
name: nginx
ports:
- containerPort: 80
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
サービスをデプロイします。
kubectl apply -f nginx.yaml
デプロイを確認します。期待される出力:
kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-xxxxxxxxx-xxxxx 2/2 Running 0 30s
すべてのデプロイの確認
必要なサービスをデプロイした後、すべての Pod がサイドカープロキシ注入とともに実行中であることを確認します。
kubectl get pods
すべての Pod の READY 列には 2/2 と表示される必要があります。これは、アプリケーションコンテナと Istio サイドカープロキシの両方が注入され、実行中であることを確認するものです。