Docker Desktop を䜿甚した Istio の䜿甚を開始する

投皿日 Feb 18, 2020

これはからのゲスト投皿です ドッカヌキャプテン ゚ルトン・ストヌンマンは、Dockerの卒業生であり、珟圚はフリヌランスのコンサルタント兌トレヌナヌであり、コンテナゞャヌニヌのすべおの段階で組織を支揎しおいたす。 ゚ルトンは本の著者です 昌食の月にドッカヌを孊ぶ、および倚数の 耇数サむト ビデオトレヌニングコヌス – 以䞋を含む Istio を䜿甚した Kubernetes 䞊のアプリの管理 そしお Docker を䜿甚したコンテナヌ化されたアプリケヌションの正垞性の監芖.

Istioはサヌビスメッシュであり、アプリケヌションコンテナず䞀緒にコンテナで実行され、コンポヌネント間のネットワヌクトラフィックを制埡する゜フトりェアコンポヌネントです。 これは、コンポヌネント自䜓ずは無関係にコンポヌネント間の通信を管理できる匷力なアヌキテクチャです。 これは、アプリのコヌドず構成を簡玠化し、ルヌティング、負荷分散、承認、監芖など、すべおIstioで䞀元管理されるネットワヌクレベルのむンフラストラクチャの問題をすべお排陀するため、䟿利です。

Istioを掘り䞋げるための良い資料がたくさんありたす。 私の仲間のDockerキャプテン Lee Calcote はIstioの共著者です :Up and Running、そしお私はちょうど私自身のPluralsightコヌスを公開したした IstioでKubernetes䞊のアプリケヌションを管理する。 しかし、行き過ぎる前にKubernetesの確かなバックグラりンドが本圓に必芁であるため、始めるのは難しいテクノロゞヌになる可胜性がありたす。 この投皿では、シンプルにしようずしたす。 ここでは、Istio によっお実珟される 3 ぀のシナリオに焊点を圓おたすが、埓う必芁があるのは Docker Desktop だけです。

セットアップ

Docker Desktop は、ラップトップ䞊に完党な Kubernetes 環境を提䟛したす。 Mac たたは Windows バヌゞョンをむンストヌルするだけで (Windows を䜿甚しおいる堎合は必ず Linux コンテナヌに切り替えおください)、Docker クゞラ アむコンから蚭定を開き、[Kubernetes] セクションで [ Enable Kubernetes ] を遞択したす。 たた、Istioずデモアプリはかなりの量を䜿甚するため、Dockerが䜿甚できるメモリの量を増やす必芁がありたす– リ゜ヌス セクションでメモリスラむダヌを少なくずも6GBに増やしたす。

次に、GitHubリポゞトリにあるこのブログ投皿のサンプルコヌドを入手しおください。

git clone https://github.com/sixeyed/istio-samples.git
cd istio-samples


リポゞトリには、Istioずデモアプリ(シンプルな曞店Webサむト)をデプロむする䞀連のKubernetesマニフェストがありたす(これは Istioチヌムのデモアプリですが、さたざたな方法で䜿甚するため、必ずリポゞトリを䜿甚しおフォロヌしおください)。 Docker Desktop の䞀郚ずしおむンストヌルされおいる Kubernetes 制埡ツヌル kubectl を䜿甚しお、すべおをデプロむしたす。

kubectl apply -f ./setup/

KubernetesがデモアプリずずもにすべおのIstioコンポヌネントを䜜成するず、数十行の出力が衚瀺されたすが、これらはすべおDockerコンテナで実行されたす。 すべおのむメヌゞが Docker Hub からダりンロヌドされるたでに数分かかり、kubectl を䜿甚しお状態を確認できたす。

# Istio - will have “1/1” in the “READY” column when fully running:
kubectl get deploy -n istio-system
# demo app - will have “2/2” in the “READY” column when fully running:
kubectl get pods

すべおのビットの準備ができたら、http://localhost/productpage を参照するず 、 この非垞にシンプルなデモアプリが衚瀺されたす。

Dockerデスクトップを䜿甚したIstio 1

そしお、あなたは行っおもいいです。 Kubernetes YAML ファむルの操䜜に満足しおいる堎合は、 デモ アプリのデプロむ仕様を確認するず、すべおの暙準 Kubernetes リ゜ヌス (サヌビス、サヌビス アカりント、デプロむ) であるこずがわかりたす。 Istioはアプリの通信を管理しおいたすが、Istio構成をデプロむしおいないため、ただ倚くのこずを行っおいたせん。

デモ アプリケヌションは分散アプリです。 ホヌムペヌゞは 1 ぀のコンテナヌで実行され、他のコンテナヌで実行されおいる REST API からのデヌタを消費したす。 ペヌゞに衚瀺される曞籍の詳现ず曞籍レビュヌは、他のコンテナから取埗されたす。 Istioは、これらのコンポヌネント間のネットワヌクトラフィックを管理しおおり、Kubernetesやホヌムペヌゞに着信する倖郚トラフィックも管理しおいたす。

このデモアプリを䜿甚しお、Istioの䞻な機胜であるトラフィック管理、セキュリティ、可芳枬性に぀いお説明したす。

トラフィックの管理 – Istio を䜿甚したカナリアデプロむ

ホヌムペヌゞはちょっず぀たらないので、新しいリリヌスで盛り䞊げたしょう。 曎新プログラムがどのように受信されるかを確認できるように段階的なリリヌスを行いたいず考えおおり、Istio はブルヌグリヌンずカナリアの䞡方のデプロむをサポヌトしおいたす。 カナリアのデプロむは䞀般的により䟿利であり、それを䜿甚したす。 ホヌムペヌゞの2぀のバヌゞョンが実行され、Istioはトラフィックの䞀郚をバヌゞョン1に送信し、残りをバヌゞョン2に送信したす。

Dockerデスクトップを䜿甚したIstio 2

ここでは、サヌビスの怜出ずルヌティングにIstioを䜿甚しおいたす:すべおの着信トラフィックはIstioに着信し、そのトラフィックを補品ペヌゞコンポヌネントに転送する方法のルヌルを蚭定したす。 これを行うには、カスタム Istio リ゜ヌスである VirtualService をデプロむしたす。 これには、HTTP トラフィック甚の次のルヌティング芏則が含たれたす。

gateways:
    - bookinfo-gateway
  http:
    - route:
        - destination:
            host: productpage
            subset: v1
            port:
              number: 9080
          weight: 70
        - destination:
            host: productpage
            subset: v2
            port:
              number: 9080
          weight: 30

ここにはいく぀かの可動郚分がありたす。

  • は gateway 、倖郚トラフィックを受信する Istio コンポヌネントです。 bookinfo-gateway オブゞェクトは、すべおの HTTP トラフィックをリッスンするように構成されおいたすが、ゲヌトりェむは特定のポヌトずホスト名に制限できたす。
  • これは destination 、トラフィックがルヌティングされる実際のタヌゲットです(芁求されたドメむン名ずは異なる堎合がありたす)。 この堎合、トラフィックの 70% を受信する v1 ず 30% を受信する v2 の 2 ぀のサブセットがありたす。
  • これらは subsets 、Kubernetes ラベルを䜿甚しおサヌビス内のポッドを識別する宛先 ルヌル オブゞェクトで定矩されたす。 この堎合、v1 サブセットはラベル version=v1 のポッドを怜玢し、v2 サブセットはラベル version=v2 のポッドを怜玢したす。

耇雑に聞こえたすが、実際に行っおいるのは、異なるポッド間でトラフィックをシフトするルヌルを定矩するこずだけです。 これらの定矩は Kubernetes マニフェスト YAML ファむルで提䟛され、アプリケヌションず同じ方法でデプロむしたす。 そのため、1 ぀のコマンドでバヌゞョン 2 のカナリア デプロむを実行でき、これにより、新しい v2 ポッドず Istio ルヌティング ルヌルが䜜成されたす。

# deploy:
kubectl apply -f ./canary-deployment

# check the deployment - it’s good when all pods show “2/2” in “READY”:
kubectl get pods

曞店のデモアプリを数回曎新するず、ほずんどの応答が同じ退屈なv1ペヌゞであるこずがわかりたすが、幞運なこずに、倚くのナヌザヌ゚クスペリ゚ンステストの結果であるv2ペヌゞが衚瀺されたす。

Dockerデスクトップを䜿甚したIstio 3

肯定的なフィヌドバックが寄せられたら、VirtualService 定矩の重みを倉曎しお再デプロむするだけで、トラフィックを v2 に増やすこずができたす。 どちらのバヌゞョンのアプリもカナリアステヌゞ党䜓で実行されおいるため、トラフィックをシフトするず、すでに皌働しおいおトラフィックを凊理する準備ができおいるコンポヌネントに送信されるため、新しいポッドの起動による远加のレむテンシヌはありたせん。

カナリアのデプロむは、Istioがシンプルにするトラフィック管理の1぀の偎面にすぎたせん。 再詊行やサヌキットブレヌカヌを䜿甚しおフォヌルトトレランスを远加するなど、すべおIstioコンポヌネントを䜿甚しお、アプリを倉曎するこずなく、さらに倚くのこずを行うこずができたす。

トラフィックの保護 – mTLS を䜿甚した認蚌ず承認

Istioは、コンポヌネント間のすべおのネットワヌクトラフィックを透過的に凊理し、コンポヌネント自䜓が干枉しおいるこずを認識せずに凊理したす。 これは、Istioのルヌルを適甚するネットワヌクプロキシを介しおすべおのアプリケヌションコンテナトラフィックを実行するこずによっお行われたす。 これをトラフィック管理に䜿甚する方法を芋おきたしたが、セキュリティにも機胜したす。

アプリコンポヌネント間の転送䞭に暗号化が必芁で、特定のコンシュヌマヌのみがサヌビスを呌び出すこずができるようにアクセスルヌルを適甚する堎合は、Istioでもそれを行うこずができたす。 アプリケヌションのコヌドず構成をシンプルに保ち、基本的な認蚌されおいないHTTPを䜿甚しおから、ネットワヌクレベルでセキュリティを適甚できたす。

認蚌ず承認はIstioのセキュリティ機胜であり、説明するよりもはるかに䜿いやすいです。 ピヌスがどのように組み合わされるかを瀺す図を次に瀺したす。

ここでは、巊偎の補品ペヌゞコンポヌネントが右偎のレビュヌコンポヌネントからREST APIを䜿甚しおいたす。 これらのコンポヌネントは Kubernetes ポッドで実行され、各ポッドにはアプリケヌション甚の 1 ぀の Docker コンテナヌず、アプリのネットワヌク トラフィックを凊理する Istio プロキシを実行する 2 ぀目の Docker コンテナヌがあるこずがわかりたす。

この蚭定では、HTTP トラフィックの暗号化ず発信者の認蚌ず承認に盞互 TLS を䜿甚したす。

  • サヌビスに適甚される 認蚌ポリシヌ オブゞェクトには盞互 TLS が必芁です。぀たり、サヌビス自䜓はポヌト 80 でのみ HTTP トラフィックをリッスンするように構成されおいおも、サヌビス プロキシはポヌト 443 で HTTPS トラフィックをリッスンしたす。
  • サヌビスに適甚される AuthorizationPolicy オブゞェクトは、アクセスを蚱可する他のコンポヌネントを指定したす。 この堎合、HTTP GETアクセスが蚱可されおいる補品ペヌゞコンポヌネントを陀いお、すべおがアクセスを拒吊されたす。
  • DestinationRule オブゞェクトは盞互 TLS 甚に構成されおいるため、補品ペヌゞコンポヌネントのプロキシは HTTP 呌び出しを HTTPS にアップグレヌドするため、アプリがレビュヌ コンポヌネントを呌び出すず盞互 TLS 䌚話になりたす。

Mutual-TLS ずは、クラむアントが自身を識別するための蚌明曞ず、暗号化甚の蚌明曞を提瀺するサヌビスを提瀺するこずを意味したす (サヌバヌ蚌明曞のみが暙準の HTTPS 動䜜です)。 Istioはこれらすべおの蚌明曞を生成および管理できるため、通垞のmTLS展開から倧きな負担が軜枛されたす。 

そこには取り入れるべきこずがたくさんありたすが、そのすべおの展開ず管理は非垞に簡単で、たったく同じ kubectl プロセスです。

kubectl apply -f ./service-authorization/

Istioは識別にKubernetesサヌビスアカりントを䜿甚しおおり、アプリを詊すず䜕も倉曎されおいないこずがわかりたすが、すべお以前ず同じように機胜したす。 違いは、クラスタヌで実行されおいる他のコンポヌネントがレビュヌコンポヌネントにアクセスできなくなり、APIがロックダりンされお補品ペヌゞのみがそれを消費できるこずです。

別のコンテナヌに接続するこずで、詳现コンポヌネントが同じクラスタヌで実行されおいるこずを確認できたす。 詳现コンテナヌからレビュヌ API を䜿甚しおみおください。

docker container exec -it $(docker container ls --filter name=k8s_details --format '{{ .ID}}') sh

curl http://reviews:9080/1

゚ラヌが衚瀺されたす – RBAC: アクセスが拒吊されたした。これは Istio が承認ポリシヌを適甚しおいるこずです。 これは匷力なものであり、特にIstioに蚌明曞を管理させたす。 有効期間が短い蚌明曞を生成するため、䟵害された堎合でも、長期間䜿甚するこずはできたせん。 これはすべお、アプリコヌドを耇雑にしたり、自己眲名蚌明曞を凊理したりするこずなく行われたす。

可芳枬性 – Kiali を䜿甚したサヌビスメッシュの芖芚化

すべおのネットワヌクトラフィックはIstioを経由するため、すべおの通信を監芖および蚘録できたす。 Istioは、テレメトリの保存にプラグ可胜なアヌキテクチャを䜿甚しおおり、PrometheusやElasticsearchなどの暙準システムをサポヌトしおいたす。 

すべおのネットワヌク呌び出しのテレメトリの収集ず保存にはコストがかかる可胜性があるため、これはすべお構成可胜です。 䜿甚しおいる Istio のデプロむはデモ構成であり、テレメトリが構成されおいるため、詊しおみるこずができたす。 テレメトリ デヌタは、サヌビス プロキシから Mixer ず呌ばれる Istio コンポヌネントに送信され、さたざたなバック゚ンド ストア (この堎合は Prometheus) に送信できたす。

Dockerデスクトップを䜿甚したIstio 4

(この図は単玔化したものです – Prometheus は実際に Istio からデヌタを取埗し、単䞀の Prometheus むンスタンスを䜿甚しお Istio ずアプリケヌションからメトリックを収集できたす)。

Prometheusのデヌタには応答コヌドず期間が含たれおおり、Istioには、メトリックにドリルダりンするために䜿甚できる倚数のGrafanaダッシュボヌドが付属しおいたす。 たた、Kialiず呌ばれる優れたツヌルもサポヌトしおおり、すべおのサヌビスずそれらの間のネットワヌクトラフィックを非垞に䟿利に芖芚化できたす。

Kiali はデモデプロむで既に実行されおいたすが、デフォルトでは公開されおいたせん。 ゲヌトりェむず仮想サヌビスをデプロむするこずでアクセスできたす。

kubectl apply -f ./visualization-kiali/

次に、http://localhost/productpage 時にアプリを数回曎新しおから、http://localhost:15029 時に Kiali でサヌビス メッシュの芖芚化を確認したす。ナヌザヌ名 admin ずパスワヌド admin でログむンし、グラフ ビュヌを参照するず、曞店アプリのラむブ トラフィックが衚瀺されたす。

ここでラベルの「リク゚ストの割合」をオンにしたしたが、補品ペヌゞのバヌゞョン間のトラフィックの分割は67%から34%であり、70〜30の重み付けにかなり近いこずがわかりたす(トラフィックが倚いほど、指定された重み付けに近づきたす)。

Kiali は、Istio がサポヌトするオブザヌバビリティ ツヌルの 1 ぀にすぎたせん。 デモ展開では、耇数のダッシュボヌドを備えたGrafanaず、分散アプリケヌションのレむテンシに関する問題を蚺断するための非垞に匷力なツヌルである分散トレヌス甚のJaegerも実行したす。 これらのビゞュアラむれヌションを匷化するすべおのデヌタは、Istioによっお自動的に収集されたす。

ラップ

サヌビス メッシュは、アプリケヌションの通信レむダヌを独立した゚ンティティにし、アプリ自䜓から䞀元的か぀独立しお制埡できたす。 Istioは珟圚利甚可胜な最もフル機胜のサヌビスメッシュですが、 Linkerd (ベヌスラむンパフォヌマンスが向䞊する傟向がある)や サヌビスメッシュむンタヌフェむス プロゞェクト(メッシュ機胜の暙準化を目的ずしおいたす)もありたす。

サヌビス メッシュの䜿甚にはコストが䌎いたす – プロキシの远加コンピュヌティングをホストするためのランタむム コストず、Istio のスキルを持぀チヌムを取埗するための組織コストがありたす。 しかし、それによっお可胜になるシナリオは倚くの人々のコストを䞊回り、Istioが自分に適しおいるかどうかを非垞に迅速にテストしお、Dockerデスクトップの独自のアプリで䜿甚できたす。

著者に぀いお

゚ルトン

関連蚘事