Istioについてまとめてみた

Istioについて勉強していまいちドキュメントで理解しにくい部分もあり他に同じような人がいるかと思いましたので簡単なまとめの記事を残します。

この記事で理解しきれなかったIstioの概要を掴むのに役に立ってくれれば幸いです。

Istioとは?

Istioはオープンソースのサービスメッシュ・プラットフォームで、マイクロサービスの相互間の通信やロードバランシング、モニタリングなどの機能を備えたものです。

サービスメッシュとはアプリケーションのそれぞれがデータをどのように共有するかを制御するための方法で、マイクロサービスではそれぞれのアプリケーションをサービスと呼びそのサービスを網目のようにつないでいくことからサービスメッシュと呼ばれます。

Istioはそんなサービスメッシュを構築する上でアプリケーション側の変更をすることなくトラフィックなどの管理をすることができる便利なものになっています。

Istioのアーキテクチャ

Istioはkubernetesのコントロールプレーンとデータプレーンのような関係性のあるコントロールプレーンとデータプレーンを提供してくれます。

まずコントロールプレーンはサービスメッシュにおけるトラフィックをルーティングされるためのプロキシ(Envoy)の管理設定をおこなってくれます。 istiodと呼ばれるコンポーネントがコントロールプレーンの役割を果たしてくれてそのistiodからそれぞれのコンテナpodに対してサイドカーとしてenvoyがinjectされていきます。

こちらがIstioのアーキテクチャ図でこのようにistiodの中にPilot、Citadel、Galleyと呼ばれるコンポーネントが入っていてこれらが各envoy proxyの設定を管理してくれています。 またIstioは1.4と1.5以降でアーキテクチャが大きく変わっておりこの記事では1.5以降の話で進めていくのでそれ以前のバージョンで運用されている際は他の記事をご参照ください。

f:id:yuzun225:20200919082033j:plain

機能

Istioが提供してくれている機能として大きく分けて3つ挙げられます。

Traffic management、Security、Observabilityこの3つがIstioのコアになる機能です。

Traffic management

Istioのトラフックの管理はKubernetesのカスタムリソースを使用することによって実現しています。

重要なものから順番に説明していきます。

Gateway

Gatewayは外部からの通信を受け取りどのEnvoyに対してトラフィックを流すかの入り口のような役割を果たします。 ここで使われるEnvoyはアプリケーションのEnvoyと違いスタンドアロンなenvoy proxyなります。

k8s上の扱いとしてIngress Contorllerのようなものだと思っていただけるとわかりやすいかなと思います。

Virtual service

Virtual serviceはGatewayから受け取ったトラフィックをどこのサービスへ流すかをしているできるリソースでk8sIngressリソースと同じような機能を提供します。

ここでカナリーリリースやheaderを変えることで検証中のマイクロサービスへトラフィックを流すことも可能になります

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - bookinfo.com
  http:
  - match:
    - uri:
        prefix: /reviews
    route:
    - destination:
        host: reviews
  - match:
    - uri:
        prefix: /ratings
    route:
    - destination:
        host: ratings
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 75
    - destination:
        host: reviews
        subset: v2
      weight: 25

Ingressに似ていますね。 ここのsubetに関しては後述するDestination Ruleと共に使用することでトラフィックの分散などを行うことができるようになります。

Destination Rule

名前付きのサブセットを付与することで、Virtual serviceが呼び出すことのできるserviceの定義をします。

また trafficPolicy.loadBalancerのフィールドを付与することでそのサブセットのトラフィックのルールを設定することができます。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-destination-rule
spec:
  host: my-svc
  trafficPolicy:
    loadBalancer:
      simple: RANDOM
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
    trafficPolicy:
      loadBalancer:
        simple: ROUND_ROBIN
  - name: v3
    labels:
      version: v3

基本的にはこの3つを使用してトラフィックのマネジメントを行う仕様になっています。

Security

従来のIngressのみを使用したトラフィック分散はインターネットからリクエストが入ってきてIngressの部分まではTLSがされているのですがそれ以降のbackendの通信は保護されていませんでした。

しかしIstioを使用することで全ての通信を保護(mutual TLS)がデフォルトで有効化されいています。 これによってbackend側での通信も全てセキュアになるというメリットがあります。

また認証認可などの規格も備えており、これも独自のカスタムリソースを定義することで実装が可能になっています。

https://istio.io/latest/docs/concepts/security/

Observability

Observabilityは最近とても注目されている概念です。 これが何を指しているのかを今このブログで全体像を説明するには長すぎるので割愛しますがIstioの中でこれを説明すると、Istioはサービス通信の詳細なテレメトリを生成しサービスがどのサービスに対して通信を行いどれくらいのトラフィックを送っているのかなどの状態を把握し問題が起こった際にどこで問題が起こっているのかのトラブルシュートに役にたちます。

またGrafanaやKiali、Jaegerなどを使用してダッシュボード上で確認できそれらをデフォルトで導入できることもIstioではできます。

https://istio.io/latest/docs/concepts/observability/

Istioの導入方法

Istioの導入に関してはGKEだけは Intio on GKEというデフォルトでIstioが導入されたk8sクラスタの構築をすることができますがそれ以外のクラウドプロバイダ(すみませんAWSしかわからないです)に関しては別の方法で導入する形になります。

IstioにもkubectlのようなCLIが提供されていてそれを最初に導入します。

$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.7.1
$ export PATH=$PWD/bin:$PATH

このistioctlを使用してmanifestの生成などをすることができます。

$  istioctl profile list
Istio configuration profiles:
    demo
    empty
    minimal
    preview
    remote
    default

このコマンドでIstioで使用するprofileを表示してくれそれぞれによってどこまで導入してくれるか違うので自身のユースケースに沿ったprofileを選択しましょう。 これまではdemoを使用することで prometheusも導入してくれるのですが 1.7から入らなくなったのでもしそれらのモニタリングツールをデフォルトで導入したい場合は 1.7以前のIstioを使用することをお勧めします。

$ istioctl install --set profile=demo

これによって自身のkubernetes環境にIstioが導入されました。

このままではIstioを導入するのに自動で行えないのでnamespaceに対して istio-injection=enabledというラベルを付与します。 このラベルが付与されるとそのnamespaceでデプロイされたPodに対してはenvoyサイドカーが一緒にデプロイされてサービスメッシュの一つのサービスになります。

$ kubectl label ns default istio-injection=enabled

あとはご自身のアプリケーションをデプロイしてみるか book-infoというsampleにぴったりなアプリケーションがあるのでそれを使ってみるのもオススメです。

https://istio.io/latest/docs/setup/getting-started/

最後はそれぞれの試したい機能を試してみることです。 僕も全てを理解してないので簡単に覚えていることを纏めましたが全然理解しきれていない状態なのが正直なところです。

またトラフィックどのようなことをすればいいのかあまりわからなかったのですがここにいい教材があったのでシェアさせて頂きます。 僕もこれでIstioの基本的な構成をこの記事に書くことできるようになりました。

今回も読んでいただいてありがとうございました!!