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以降の話で進めていくのでそれ以前のバージョンで運用されている際は他の記事をご参照ください。
機能
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から受け取ったトラフィックをどこのサービスへ流すかをしているできるリソースでk8sのIngressリソースと同じような機能を提供します。
ここでカナリーリリースや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の基本的な構成をこの記事に書くことできるようになりました。
今回も読んでいただいてありがとうございました!!