Istio シリーズです。
今回は VirtualService です。これを利用することで、コネクションプーリングの設定をしたり、レートリミットを入れたり、振り分け方法を指定したり、同じホスト名でアクセスしても条件によって振り分けを行えたり、指定の HTTP レスポンス (400 とか 500 Internal Server Error とか) を返したり、delay を入れたりすることができるようになります。また、後でやる Ingress Gateway からアクセスできるようになったりします。
複数 Version の Deployment を用意する
Version 違いを出し分けたりするテストを行うため、一旦今の httpbin-deployment を削除します。
| |
本当はレスポンスが異なる Pod を用意すればわかりやすいのですが、ログでアクセスを確認するってことで、v1 と v2 と version label だけが異なる Deployment を2つ deploy します。
| |
httpbin-service として作成ずみの Service は selector が app: httpbin だけであるため、v1 も v2 も両方とも対象となり、この状態でも v1, v2 両方にリクエストが振り分けられる状況ですが、振り分け方法を細かく制限したり Fault injection を行えるようにするため VirtualService を定義します。
v1 も v2 も一つの Service に含まれている様子。Endpoints に両方入っています。
$ kubectl get pods -o wide -l app=httpbin
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpbin-deployment-v1-7d95bdc6f6-5f69g 2/2 Running 0 13m 172.17.0.7 m01 <none> <none>
httpbin-deployment-v2-ccd49cc9c-lgvjs 2/2 Running 0 12m 172.17.0.8 m01 <none> <none>
$ kubectl describe svc httpbin-service
Name: httpbin-service
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpbin-service","namespace":"default"},"spec":{"ports":\[{"name":...
Selector: app=httpbin
Type: ClusterIP
IP: 10.109.118.31
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 172.17.0.7:80,172.17.0.8:80
Session Affinity: None
Events: <none>DestinationRule の作成
v1, v2 それぞれにアクセスするための DestinationRule を作成します。
| |
VirtualService
上で作った DestinationRule を使って VirtualServive を設定します。
重みづけで振り分ける
一番単純な例
| |
wegith を 100:0 に変更して試すと全部片方にしかリクエストが送られないことが確認できる。
HTTP Header を使って振り分ける
HTTPMatchRequest を使うことで HTTP の Request の内容によって振り分けを行うことができる。
| |
この例の様に `match` に `name` を設定しておけば、送信側の istio-proxy のログの `route_name` に subset 名が入っている。
| |
3つ目のログは v=3 で、その定義はしていなかったため 404 が返されている。次の様に `match` をつけないで `route` を最後に書いておけばマッチしなかったものが全てそこに送られる。
| |
注意点として、VirtualService の振り分けは最初にマッチしたところで宛先が決まってしまう点。条件の厳しいものから順に書いておく必要がある。
次回は Fault Injection にしよう。
Istio 導入への道シリーズ
- Istio 導入への道 (1) – インストール編
- Istio 導入への道 (2) – サービス間通信編
- Istio 導入への道 (3) – VirtualService 編
- Istio 導入への道 (4) – Fault Injection 編
- Istio 導入への道 (5) – OutlierDetection と Retry 編
- Istio 導入への道 (6) – Ingress Gatway 編
- Istio 導入への道 (7) – 外部へのアクセス / ServiceEntry 編
- Istio 導入への道 (8) – 外部へのアクセスでも Fault Injection 編
- Istio 導入への道 (9) – gRPC でも Fault Injection 編
- Istio 導入への道 (10) – 図解
- Istio 導入への道 (11) – Ingress Gateway で TLS Termination 編


