グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



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だけでは難しかった細かなトラフィックの制御が簡単にできるようになり、より安定したリリースが実現できると思います。

シリーズ:GKEのistioでサンプルアプリを動かす

この記事を書いた人

tkr2f
tkr2f事業開発部 web application engineer
2008年にアーティスへ入社。
システムエンジニアとして、SI案件のシステム開発に携わる。
その後、事業開発部の立ち上げから自社サービスの開発、保守をメインに従事。
ドメイン駆動設計(DDD)を中心にドメインを重視しながら、保守可能なソフトウェア開発を探求している。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします