😽

【Istio】Traffic Managementまとめ

2021/05/23に公開

Gateway / Virtual Service / Destination Rule

Gateway

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
  namespace: default
spec:
  selector:
    istio: ingressgateway  # default istio gateway proxy
  servers:
  - port:  # L7設定
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - uk.bookinfo.com  # DNSホスト

Virtual Service

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo-rule
  namespace: default
spec:
  hosts:
  - uk.bookinfo.com  # Routingルールの適用先
  gateways:
  - default/my-gateway  # 上のgateway.ymlで作成するgateway
  http:
  - match:
    - uri:
        prefix: /reviews/
    route:
    - destination:
        port:
          number: 3000  # serviceポート
        host: reviews.prod.svc.cluster.local

確認コマンド

$ kubectl get virtualservice,gateway

Destination Rule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookinfo-ratings
spec:
  host: reviews.prod.svc.cluster.local  # k8sのService名(virtualservice.ymlと同じ)
  trafficPolicy:
    loadBalancer:  # round robin / random / least connectionの3択
      simple: LEAST_CONN
  subsets:
  - name: v1
    labels:
      version: v1 # podにつけたlabel(負荷分散用)
  - name: v2
    labels:
      version: v2   # podにつけたlabel(負荷分散用)

確認コマンド

$ kubectl get dr

VirtualService Canary設定

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
  - mesh  # Gatewayに限らず、それぞれのEnvoy Proxyにもルールを適用する
  http:
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v1 # podにつけたlabel(負荷分散用)
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v2 
      weight: 75

確認コマンド

$ kubectl get vs

ユーザーリクエストのルーティング指定

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
  - mesh  # Gatewayに限らず、それぞれのEnvoy Proxyにもルールを適用する
  http:
  - match:  # 下記ユーザーからのリクエストに対してルーティングを行う
    - headers:
       end-user:
         exact: log-in-as-this-user  # ユーザー
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v1 # podにつけたlabel(負荷分散用)
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v2 
      weight: 75

fault injection(Delay)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: tester  # fault_injection用のテストユーザー
  - fault:
      delay:  # Delayを追加する
        fixedDelay: 10s  # Delay:10秒
        percentage:
          value: 100  # リクエストのうち、何%に対してDelayを実行するか
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

fault injection(HTTPリターンコード)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - match:
    - headers:
        end-user:
          exact: tester  # fault_injection用のテストユーザー
  - fault:
      abort:  # HTTPのリターンコード
        httpStatus: 400  # リターンコード
        percentage:
          value: 100.0  # リクエストのうち、何%に対してDelayを実行するか
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

タイムアウト設定

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
  - mesh  # Gatewayに限らず、それぞれのEnvoy Proxyにもルールを適用する
  http:
  - timeout: 1s  # 1秒以内にreturnしない場合、HTTPエラーコードが表示される
  - route:
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v1 # podにつけたlabel(負荷分散用)
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v2 
      weight: 75

fault injection(Retry)

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - retries:
      attempts: 3  # 何回リトライするか
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream  # リトライの発動条件
  - match:
    - headers:
        end-user:
          exact: tester  # fault_injection用のテストユーザー
  - fault:
      delay:  # Delayを追加する
        fixedDelay: 10s  # Delay:10秒
        percentage:
          value: 100  # リクエストのうち、何%に対してDelayを実行するか
    route:
    - destination:
        host: ratings
        subset: v1
  - route:
    - destination:
        host: ratings
        subset: v1

リクエストのミラーリング設定

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
  - mesh  # Gatewayに限らず、それぞれのEnvoy Proxyにもルールを適用する
  http:
  - mirror:  # v3からv1へリクエストを100%ミラーリングする
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v1 # podにつけたlabel(負荷分散用)
    mirror_percent: 100.0
    route:
    - destination:
        host: reviews.prod.svc.cluster.local # k8sのService名(virtualservice.ymlと同じ)
        subset: v3 
      weight: 100.0

サーキットブレーカ有効化

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews-cb-policy
spec:
  host: reviews.prod.svc.cluster.local
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 100  # hostへのHTTP/TCPの最大接続数
      http:
        http2MaxRequests: 1000  # バックエンドへの最大接続数
        maxRequestsPerConnection: 10  # バックエンド接続毎のリクエスト最大数
    outlierDetection:
      consecutive5xxErrors: 7  # 7回以上エラーの場合
      interval: 5m  # 5分毎にスキャン
      baseEjectionTime: 15m  # 15分間退去

Istioをk8sにデプロイ

profileリストを確認

$ istioctl profile list
$ istioctl profile dump demo > profile_demo_config.yaml  // demoプロファイルをアウトプット

Istio込みのk8s Manifestファイルを生成

 $ istioctl manifest generate \
  --set profile=demo \
  --set values.gateways.istio-ingressgateway.sds.enabled=true \
  > generated-manifest-demo.yaml

k8s Manifestファイルをapply

$ istioctl install --set profile=demo

apply結果確認

$ kubectl get pod,svc -n istio-system
$ kubectl get pod -n istio-system -l istio=ingressgateway

Istio Sidecar Injection有効化

$ kubectl describe ns default
$ kubectl label namespace default istio-injection=enabled

kiali Dashboard

kialiインストール

$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.10/samples/addons/kiali.yaml

確認

$ kubectl -n istio-system get svc kiali

kiali 起動

$ istioctl dashboard kiali

参考文献

Discussion