GKE(Google Kubernetes Engine)のistioでサンプルアプリを動かす【ルーティング編】
前回はGKE上でistioのサービスメッシュを構築し、サンプルアプリケーションをデプロイしました。
今回は、その環境を使ってistioの設定と動作を確認していきたいと思います。
参考にするページは以下のとおりです。
リクエストのルーティング
サンプルアプリケーションは、フロントエンドから各マイクロサービスに通信する構成になっています。
その中でも、reviewsサービスはいくつかのバージョンがデプロイされていて、アクセスするたびにバージョンが切り替わってしまいます。
そこで、VirtualServiceの設定を変更してバージョンを固定することで、リクエストのルーティング方法を学びます。
まず、現状のサービスの一覧を表示して確認しておきます。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.113.7.246 <none> 9080/TCP 178m
kubernetes ClusterIP 10.113.0.1 <none> 443/TCP 4h19m
productpage ClusterIP 10.113.12.37 <none> 9080/TCP 178m
ratings ClusterIP 10.113.3.237 <none> 9080/TCP 178m
reviews ClusterIP 10.113.4.40 <none> 9080/TCP 178m
次に、以下のコマンドでVirtualServiceの内容も確認しておきます。
$ kubectl get virtualservices -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
namespace: default
...
spec:
gateways:
- bookinfo-gateway
hosts:
- '*'
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
このVirtualServiceは前回、Gatewayを作成したときに作成されたものです。
現状の設定ではURIが「/productpage」「/login」「/logout」の場合と「/api/v1/products」から始まる場合は、productpageサービスにルーティングするように設定されています。
現状の確認ができたので、次に用意されているVirtualServiceを適用させてみます。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
設定された内容を確認します。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
namespace: default
spec:
gateways:
- bookinfo-gateway
hosts:
- '*'
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
namespace: default
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
namespace: default
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
namespace: default
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
新たに、各サービスのVirtualServiceが追加されました。
前回、DestinationRuleで設定されたバージョン(subset)がv1に指定されているのがわかります。
この状態でブラウザからアクセスすると、レビューの星が表示されないことを確認できます。(v1のreviewsは星がでません)
検証のために、reviewsサービスをv2にしてみます。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
ブラウザからアクセスすると、黒い星のレビューしか表示されないことを確認できました。(v2のreviewsは黒い星がでます)
トラフィックの移行
次に、トラフィックをv1とv3に50%ずつ転送(分散)するように設定してみます。
この検証は、カナリアリリースを行うときに役立ちます。
まずは、トラフィックの100%をv1に転送するようにします。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
ブラウザでアクセスすると、レビューの星が表示されないことが確認できます。
次に、用意されたVirtualServiceを適用させます。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
reviewsのVirtualServiceが以下のように設定されました。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
weightで重みを設定しているのが確認できます。
ブラウザで数回アクセスすると、約50%でレビューの星がでなかったり、赤い星がでたりするのが確認できます。
今回は50%からスタートでしたが、実際は少量のトラフィックを段階的に新しいバージョンに転送していき、最終的には100%のトラフィックを転送した時点でリリース完了ということになります。
まとめ
リクエストのルーティングとトラフィックの移行に必要な設定と動作を確認しました。
istioを使うことで、K8sだけでは難しかった細かなトラフィックの制御が簡単にできるようになり、より安定したリリースが実現できると思います。
この記事を書いた人
-
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この執筆者の最新記事
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Twitterでフォロー
- Feedlyでフォロー