Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2

ノヌト。 翻蚳。: 最初の郚分 このシリヌズは、Istio の機胜を玹介し、その機胜を実際にデモンストレヌションするこずに専念したした。 ここでは、このサヌビス メッシュの構成ず䜿甚のより耇雑な偎面、特に、现かく調敎されたルヌティングずネットワヌク トラフィック管理に぀いお説明したす。

たた、この蚘事ではリポゞトリの構成 (Kubernetes および Istio のマニフェスト) が䜿甚されおいるこずにも泚意しおください。 istioマスタリヌ.

亀通管理

Istio では、次の機胜を提䟛する新しい機胜がクラスタヌに衚瀺されたす。

  • 動的リク゚ストルヌティング: カナリア ロヌルアりト、A/B テスト。
  • 負荷分散: シンプルで䞀貫性があり、ハッシュに基づいおいたす。
  • 転倒埌の回埩: タむムアりト、再詊行、サヌキット ブレヌカヌ。
  • フォルトの挿入: 遅延、リク゚ストのドロップなど。

蚘事の続きずしお、遞択したアプリケヌションを䟋ずしお䜿甚しおこれらの機胜を説明し、途䞭で新しい抂念も玹介したす。 そのようなコンセプトの最初のものは、 DestinationRules (぀たり、トラフィック/リク゚ストの受信者に関するルヌル - およその翻蚳)、これを利甚しお A/B テストを有効にしたす。

A/B テスト: 実際の DestinationRules

A/B テストは、アプリケヌションに 100 ぀のバヌゞョンがあり (通垞は芖芚的に異なりたす)、どちらがナヌザヌ ゚クスペリ゚ンスを向䞊させるかが XNUMX% わからない堎合に䜿甚されたす。 したがっお、䞡方のバヌゞョンを同時に実行し、メトリクスを収集したす。

A/B テストのデモンストレヌションに必芁なフロント゚ンドの XNUMX 番目のバヌゞョンをデプロむするには、次のコマンドを実行したす。

$ kubectl apply -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions/sa-frontend-green created

緑色のバヌゞョンの展開マニフェストは、次の XNUMX ぀の堎所で異なりたす。

  1. 画像は別のタグに基づいおいたす - istio-green,
  2. ポッドにはラベルが付いおいたす version: green.

䞡方のデプロむメントにラベルがあるため、 app: sa-frontend、仮想サヌビスによっおルヌティングされたリク゚スト sa-external-services サヌビス甚 sa-frontend、そのすべおのむンスタンスにリダむレクトされ、負荷は ラりンドロビンアルゎリズム、これにより、次のような状況が発生したす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2
芁求されたファむルが芋぀かりたせんでした

これらのファむルは、アプリケヌションのバヌゞョンによっお名前が異なるため、芋぀かりたせんでした。 これを確認したしょう:

$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.c7071b22.css
/static/js/main.059f8e9c.js
$ curl --silent http://$EXTERNAL_IP/ | tr '"' 'n' | grep main
/static/css/main.f87cd8c9.css
/static/js/main.f7659dbb.js

぀たり、 index.htmlあるバヌゞョンの静的ファむルを芁求するこのファむルは、ロヌド バランサヌによっお別のバヌゞョンを持぀ポッドに送信される可胜性がありたすが、明らかな理由により、そのようなファむルは存圚したせん。 したがっお、アプリケヌションが動䜜するには、次のような制限を蚭定する必芁がありたす。index.html を凊理したのず同じバヌゞョンのアプリケヌションが埌続のリク゚ストを凊理する必芁がありたす'。

䞀貫したハッシュベヌスの負荷分散によっお目暙を達成したす (䞀貫したハッシュロヌドバランシング)。 この堎合 同じクラむアントからのリク゚ストは同じバック゚ンド むンスタンスに送信されたす。、事前定矩されたプロパティ (HTTP ヘッダヌなど) が䜿甚されたす。 DestinationRules を䜿甚しお実装されたす。

宛先ルヌル

埌に 仮想サヌビス 目的のサヌビスにリク゚ストを送信したした。DestinationRules を䜿甚しお、このサヌビスのむンスタンス宛おのトラフィックに適甚されるポリシヌを定矩できたす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2
Istio リ゜ヌスを䜿甚したトラフィック管理

泚意: ここでは、ネットワヌク トラフィックに察する Istio リ゜ヌスの圱響がわかりやすく瀺されおいたす。 正確に蚀うず、どのむンスタンスにリク゚ストを送信するかは、CRD で構成された Ingress Gateway の Envoy によっお決定されたす。

宛先ルヌルを䜿甚するず、䞀貫したハッシュを䜿甚し、同じサヌビス むンスタンスが同じナヌザヌに応答するように負荷分散を構成できたす。 次の構成により、これを実珟できたす (destinationrule-sa-frontend.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: sa-frontend
spec:
  host: sa-frontend
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpHeaderName: version   # 1

1 - HTTP ヘッダヌの内容に基づいおハッシュが生成されたす version.

次のコマンドを䜿甚しお構成を適甚したす。

$ kubectl apply -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io/sa-frontend created

次に、以䞋のコマンドを実行し、ヘッダヌを指定したずきに正しいファむルが取埗されるこずを確認したす。 version:

$ curl --silent -H "version: yogo" http://$EXTERNAL_IP/ | tr '"' 'n' | grep main

泚意: ヘッダヌにさたざたな倀を远加し、結果をブラりザヌで盎接テストするには、次を䜿甚できたす。 この拡匵子 クロムぞ たたは これずずもに Firefox の堎合 - 玄。 翻蚳.

䞀般に、DestinationRules には負荷分散の分野でより倚くの機胜がありたす - 詳现に぀いおは、 公匏ドキュメント.

VirtualService に぀いおさらに孊習する前に、次のコマンドを実行しお、アプリケヌションの「グリヌン バヌゞョン」ず察応するトラフィック方向ルヌルを削陀したしょう。

$ kubectl delete -f resource-manifests/kube/ab-testing/sa-frontend-green-deployment.yaml
deployment.extensions “sa-frontend-green” deleted
$ kubectl delete -f resource-manifests/istio/ab-testing/destinationrule-sa-frontend.yaml
destinationrule.networking.istio.io “sa-frontend” deleted

ミラヌリング: 仮想サヌビスの実践

シャドりむング (「シヌルド」) たたはミラヌリング (「ミラヌリング」) ゚ンドナヌザヌに圱響を䞎えずに本番環境での倉曎をテストしたい堎合に䜿甚されたす。これを行うには、必芁な倉曎が加えられた XNUMX 番目のむンスタンスにリク゚ストを耇補 (「ミラヌリング」) し、その結果を確認したす。 簡単に蚀うず、これは、同僚が最も重芁な問題を遞択し、実際には誰もレビュヌできないような巚倧な土の塊の圢でプルリク゚ストを䜜成したずきです。

このシナリオを実際にテストするために、バグを含む SA-Logic の XNUMX 番目のむンスタンスを䜜成したしょう (buggy) 次のコマンドを実行したす。

$ kubectl apply -f resource-manifests/kube/shadowing/sa-logic-service-buggy.yaml
deployment.extensions/sa-logic-buggy created

次に、コマンドを実行しお、すべおのむンスタンスが app=sa-logic 察応するバヌゞョンのラベルも付いおいたす。

$ kubectl get pods -l app=sa-logic --show-labels
NAME                              READY   LABELS
sa-logic-568498cb4d-2sjwj         2/2     app=sa-logic,version=v1
sa-logic-568498cb4d-p4f8c         2/2     app=sa-logic,version=v1
sa-logic-buggy-76dff55847-2fl66   2/2     app=sa-logic,version=v2
sa-logic-buggy-76dff55847-kx8zz   2/2     app=sa-logic,version=v2

サヌビス sa-logic ラベルが付いたポッドをタヌゲットにしたす app=sa-logicしたがっお、すべおのリク゚ストはすべおのむンスタンスに分散されたす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2

...ただし、リク゚ストを v1 むンスタンスに送信し、v2 むンスタンスにミラヌリングする必芁がありたす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2

これは、VirtualService ず DestinationRule を組み合わせお実珟したす。ルヌルにより、VirtualService のサブセットず特定のサブセットぞのルヌトが決定されたす。

宛先ルヌルでのサブセットの定矩

サブセット (サブセット) は次の構成によっお決定されたす (sa-logic-subsets-destinationrule.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: sa-logic
spec:
  host: sa-logic    # 1
  subsets:
  - name: v1        # 2
    labels:
      version: v1   # 3
  - name: v2
    labels:
      version: v2

  1. ホスト host) ルヌトがサヌビスに向かう堎合にのみこのルヌルが適甚されるこずを定矩したす sa-logic;
  2. タむトル (name) サブセットは、サブセット むンスタンスにルヌティングするずきに䜿甚されたす。
  3. ラベル (label) は、むンスタンスがサブセットの䞀郚ずなるために䞀臎する必芁があるキヌず倀のペアを定矩したす。

次のコマンドを䜿甚しお構成を適甚したす。

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-destinationrule.yaml
destinationrule.networking.istio.io/sa-logic created

サブセットが定矩されたので、次は、sa-logic ぞのリク゚ストにルヌルを適甚するように VirtualService を構成しお、次のようにするこずができたす。

  1. サブセットにルヌティングされる v1,
  2. サブセットにミラヌリング v2.

次のマニフェストにより、蚈画を達成できたす (sa-logic-subsets-shadowing-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic          
  http:
  - route:
    - destination:
        host: sa-logic  
        subset: v1      
    mirror:             
      host: sa-logic     
      subset: v2

ここでは説明は䞍芁なので、実際の動䜜を芋おみたしょう。

$ kubectl apply -f resource-manifests/istio/shadowing/sa-logic-subsets-shadowing-vs.yaml
virtualservice.networking.istio.io/sa-logic created

次のコマンドを呌び出しお負荷を远加したしょう。

$ while true; do curl -v http://$EXTERNAL_IP/sentiment 
    -H "Content-type: application/json" 
    -d '{"sentence": "I love yogobella"}'; 
    sleep .8; done

Grafana で結果を芋おみたしょう。バグのあるバヌゞョンであるこずがわかりたす (buggy) リク゚ストの最倧 60% で倱敗したすが、これらの倱敗は実行䞭のサヌビスによっお応答されるため、゚ンド ナヌザヌには圱響したせん。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2
sa-logic サヌビスのさたざたなバヌゞョンの成功した応答

ここでは、VirtualService がサヌビスの Envoy にどのように適甚されるかを初めお確認したした。 sa-web-app にリク゚ストを出したす sa-logic、サむドカヌ Envoy を経由したす。これは、VirtualService を介しお、リク゚ストを v1 サブセットにルヌティングし、リク゚ストをサヌビスの v2 サブセットにミラヌリングするように構成されおいたす。 sa-logic.

仮想サヌビスは単玔だずすでに思われおいるかもしれたせん。 次のセクションでは、それらが本圓に玠晎らしいものであるこずを述べお、さらに詳しく説明したす。

カナリアのロヌルアりト

カナリア デプロむメントは、アプリケヌションの新しいバヌゞョンを少数のナヌザヌにロヌルアりトするプロセスです。 これは、リリヌスに問題がないこずを確認するために䜿甚され、その埌、そのリリヌスの品質にすでに自信を持っお、他のナヌザヌに配垃したす。Пより倧きな聎衆。

カナリアのロヌルアりトを実蚌するために、サブセットの䜿甚を継続したす。 buggy у sa-logic.

些现なこずで時間を無駄にせず、すぐにナヌザヌの 20% をバグのあるバヌゞョン (これがカナリア ロヌルアりトを衚したす) に送り、残りの 80% を通垞のサヌビスに送りたしょう。 これを行うには、次の VirtualService (sa-logic-subsets-canary-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic    
  http:
  - route: 
    - destination: 
        host: sa-logic
        subset: v1
      weight: 80         # 1
    - destination: 
        host: sa-logic
        subset: v2
      weight: 20 # 1

1 は重量 (weight)、受信者たたは受信者のサブセットに送信されるリク゚ストの割合を指定したす。

以前の VirtualService 構成を曎新したしょう。 sa-logic 次のコマンドを䜿甚したす。

$ kubectl apply -f resource-manifests/istio/canary/sa-logic-subsets-canary-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

...そしお、いく぀かのリク゚ストが倱敗に぀ながるこずがすぐにわかりたす。

$ while true; do 
   curl -i http://$EXTERNAL_IP/sentiment 
   -H "Content-type: application/json" 
   -d '{"sentence": "I love yogobella"}' 
   --silent -w "Time: %{time_total}s t Status: %{http_code}n" 
   -o /dev/null; sleep .1; done
Time: 0.153075s Status: 200
Time: 0.137581s Status: 200
Time: 0.139345s Status: 200
Time: 30.291806s Status: 500

VirtualServices によりカナリア ロヌルアりトが可胜になりたす。この堎合、問題の朜圚的な圱響をナヌザヌ ベヌスの 20% に絞り蟌みたした。 玠晎らしい コヌドが䞍明な堎合は垞に (぀たり、垞に...)、ミラヌリングずカナリア ロヌルアりトを䜿甚できたす。

タむムアりトず再詊行

ただし、バグが垞にコヌドに存圚するずは限りたせん。 からのリストでは、分散コンピュヌティングに関する 8 ぀の誀解「第䞀に、「ネットワヌクは信頌できる」ずいう誀った信念がありたす。 実はネットワヌクは ノヌ 信頌性が高く、このためタむムアりトが必芁です (タむムアりト) そしお再詊行したす 再詊行.

デモンストレヌションでは、同じ問題のあるバヌゞョンを匕き続き䜿甚したす。 sa-logic (buggy)、ランダムな障害によるネットワヌクの信頌性の䜎さをシミュレヌトしたす。

バグのあるサヌビスの応答に時間がかかりすぎる可胜性が 1/3、内郚サヌバヌ ゚ラヌで終了する可胜性が 1/3、ペヌゞが正垞に返される可胜性が 1/3 であるずしたす。

このような問題の圱響を軜枛し、ナヌザヌの生掻をより良いものにするために、次のこずが可胜です。

  1. サヌビスの応答に 8 秒以䞊かかる堎合はタむムアりトを远加したす。
  2. リク゚ストが倱敗した堎合は再詊行したす。

実装には、次のリ゜ヌス定矩を䜿甚したす(sa-logic-retries-timeouts-vs.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sa-logic
spec:
  hosts:
    - sa-logic
  http:
  - route: 
    - destination: 
        host: sa-logic
        subset: v1
      weight: 50
    - destination: 
        host: sa-logic
        subset: v2
      weight: 50
    timeout: 8s           # 1
    retries:
      attempts: 3         # 2
      perTryTimeout: 3s # 3

  1. リク゚ストのタむムアりトは 8 秒に蚭定されおいたす。
  2. リク゚ストは 3 回再詊行されたす。
  3. たた、応答時間が 3 秒を超えるず、各詊行は倱敗したずみなされたす。

これは、ナヌザヌが 8 秒以䞊埅぀必芁がなく、倱敗した堎合に応答を取埗するために XNUMX 回の新たな詊行を行うため、応答が成功する可胜性が高たるための最適化です。

次のコマンドを䜿甚しお、曎新された構成を適甚したす。

$ kubectl apply -f resource-manifests/istio/retries/sa-logic-retries-timeouts-vs.yaml
virtualservice.networking.istio.io/sa-logic configured

そしお、成功した応答の数が䞊蚘のように増加しおいるこずを Grafana グラフで確認したす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト2
タむムアりトず再詊行を远加した埌の成功応答統蚈の改善

次のセクションに進む前に (むしろ、この蚘事の次の郚分に進んでください。この蚘事ではこれ以䞊実際的な実隓は行わないためです。おおよその翻蚳です。)、 消去 sa-logic-buggy 次のコマンドを実行しお、VirtualService を実行したす。

$ kubectl delete deployment sa-logic-buggy
deployment.extensions “sa-logic-buggy” deleted
$ kubectl delete virtualservice sa-logic
virtualservice.networking.istio.io “sa-logic” deleted

サヌキットブレヌカヌずバルクヘッドのパタヌン

ここでは、自己回埩を実珟するマむクロサヌビス アヌキテクチャの XNUMX ぀の重芁なパタヌンに぀いお説明したす。 (自己修埩) サヌビス。

サヌキットブレヌカヌ (「サヌキットブレヌカヌ」) 異垞ずみなされるサヌビスのむンスタンスに送信されるリク゚ストを終了し、クラむアントのリク゚ストがそのサヌビスの正垞なむンスタンスにリダむレクトされる間にそれを埩元するために䜿甚されたす (これにより、成功した応答の割合が増加したす)。 (泚: パタヌンのより詳现な説明は、たずえば、 ここで.)

隔壁 "パヌティション" サヌビス障害がシステム党䜓に圱響を及がさないように隔離したす。 たずえば、サヌビス B が壊れおおり、別のサヌビス (サヌビス B のクラむアント) がサヌビス B にリク゚ストを行うず、サヌビス B のスレッド プヌルが枯枇し、他のリク゚スト (サヌビス B からのものでない堎合でも) を凊理できなくなりたす。 (泚: パタヌンのより詳现な説明は、たずえば、 ここで.)

これらのパタヌンの実装の詳现は、以䞋で簡単に芋぀けるこずができるため省略したす。 公匏ドキュメントたた、認蚌ず認可に぀いおも実際に瀺したいず思っおいたす。これに぀いおは、蚘事の次の郚分で説明したす。

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす