Istio アーキテクチャの原則と実践を始める

公式ウェブサイト:https://istio.io/v1.11/zh/docs/concepts/what-is-istio/

istio アーキテクチャ

画像.png

実際、Istio は Service Mesh アーキテクチャの実装であり、サービス間の通信 (ここではサービス A がサービス B にアクセスするなど) はプロキシ (デフォルトは Envoy) を介して実行されます。

また、中間ネットワークプロトコルはHTTP/1.1、HTTP/2、gRPC、TCPをサポートしており、主流の通信プロトコルをカバーしていると言えます。このエージェント層はデータ プレーンと呼ばれます。

コントロール プレーンはさらに Pilot、Citadel、Galley に分割され、それぞれの機能は次のとおりです。

Pilot:为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。

Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。

Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。

データ プレーンはコントロール プレーンと通信し、サービス間で必要な情報を取得できる一方で、サービス呼び出しのメトリクス データを報告することもできます。

Istio を使用する理由

Istio では、ロード バランシング、サービス間認証、モニタリングなどを通じて、コードをほとんどまたはまったく変更せずにサービスがすでにデプロイされているネットワークを簡単に作成できます環境全体に特別なサイドカー プロキシをデプロイすることで、サービスに Istio サポートを追加します。プロキシは、マイクロサービス間のすべてのネットワーク通信を傍受し、そのコントロール プレーン機能を使用して Istio を構成および管理します。これには次のものが含まれます。

  • HTTP、gRPC、WebSocket、TCP トラフィックの自動ロード バランシング。
  • 豊富なルーティング ルール、再試行、フェイルオーバー、フォールト インジェクションによるトラフィック動作のきめ細かな制御。
  • アクセス制御、レート制限、クォータをサポートするプラグイン可能なポリシー レイヤーと構成 API。
  • クラスターへの出入りを含む、クラスター内のすべてのトラフィックの自動測定、ロギング、トレース。
  • 強力な認証と認可ベースの認証を使用して、クラスター内で安全なサービス間通信を有効にします。

Istio は、さまざまな導入ニーズを満たす拡張性を考慮して設計されています。

交通管理

Istio のシンプルなルール構成とトラフィック ルーティングにより、サービスと API 呼び出しプロセス間のトラフィックを制御できます。Istio は、サービス レベル プロパティ (サーキット ブレーカー、タイムアウト、再試行など) の構成を簡素化し、重要なタスク (A/B テスト、カナリア ロールアウト、トラフィック パーセンテージによる段階的ロールアウトなど) を簡単に実行できるようにします。
トラフィックの可視性が向上し、すぐに使える障害回復機能により、問題が発生する前に問題を発見できるため、何があっても通話の信頼性が高まり、ネットワークがより堅牢になります。

Istioバージョンのサポート状況

バージョン 現在サポートされている 発行日 メンテナンスの停止 サポートされている Kubernetes バージョン 未テスト、サポートされている可能性のある Kubernetes バージョン
マスター いいえ、開発のみです - - - -
1.15 はい 2022年8月31日 ~2023年3月(予定) 1.22、1.23、1.24、1.25 1.16、1.17、1.18、1.19、1.20、1.21
1.14 はい 2022 年 5 月 24 日 ~ 2023 年 1 月 (予定) 1.21、1.22、1.23、1.24 1.16、1.17、1.18、1.19、1.20
1.13 はい 2022 年 2 月 11 日 ~2022年10月(予定) 1.20、1.21、1.22、1.23 1.16、1.17、1.18、1.19
1.12 はい 2021年11月18日 2022 年 7 月 12 日 1.19、1.20、1.21、1.22 1.16、1.17、1.18
1.11 いいえ 2021年8月12日 2022 年 3 月 25 日 1.18、1.19、1.20、1.21、1.22 1.16、1.17
1.10 いいえ 2021年5月18日 2022 年 1 月 7 日 1.18、1.19、1.20、1.21 1.16、1.17、1.22
1.9 いいえ 2021年2月9日 2021年10月8日 1.17、1.18、1.19、1.20 1.15、1.16
1.8 いいえ 2020年11月10日 2021年5月12日 1.16、1.17、1.18、1.19 1.15
1.7 いいえ 2020年8月21日 2021年2月25日 1.16、1.17、1.18 1.15
1.6以前 いいえ - - - -

1.ダウンロード

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.7 TARGET_ARCH=x86_64 sh -


#转到 Istio 包目录。例如,如果包是 istio-1.11.7:
cd istio-1.11.7

#将 istioctl 客户端添加到路径
export PATH=$PWD/bin:$PATH


2. istioをインストールする

istioctl install --set profile=demo -y

名前空間にラベルを追加して、アプリケーションのデプロイ時に Envoy サイドカー プロキシを自動的に挿入するように Istio に指示します。

kubectl label namespace default istio-injection=enabled

#istio をアンインストールする

istioctl manifest generate --set profile=demo | kubectl delete -f -

3. サンプル アプリケーションをデプロイする

この例では、さまざまな Istio 機能をデモンストレーションし、4 つの個別のマイクロサービスで構成されるアプリケーションをデプロイします。このアプリケーションは、オンライン書店のカテゴリを模倣し、書籍に関する情報を表示します。このページには、書籍の説明、書籍の詳細 (ISBN、ページ数など)、および書籍に関するコメントが表示されます。

Bookinfo アプリケーションは、
productpage という 4 つの個別のマイクロサービスに分割されています。このマイクロサービスは詳細を呼び出し、マイクロサービスをレビューしてページを生成します。
このマイクロサービスには書籍情報が含まれています。
このマイクロサービスには、書籍関連のレビューが含まれています。また、評価マイクロサービスとも呼ばれます。
このマイクロサービスには、書籍レビューからなる評価情報が含まれています。

レビュー マイクロサービスには 3 つのバージョンがあります。v1
バージョンは評価サービスを呼び出しません。
v2 バージョンは評価サービスを呼び出し、1 ~ 5 個の黒い星アイコンを使用して評価情報を表示します。
v3 バージョンは評価サービスを呼び出し、1 ~ 5 個の赤い星アイコンを使用して評価情報を表示します。
以下の図は、このアプリケーションのエンドツーエンドのアーキテクチャを示しています。
画像.png

Bookinfo サンプル アプリケーションをデプロイします

bookinfo.yaml

##################################################################################################
# Details service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: details
  labels:
    app: details
    service: details
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: docker.io/istio/examples-bookinfo-details-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        securityContext:
          runAsUser: 1000
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-ratings
  labels:
    account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        securityContext:
          runAsUser: 1000
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: reviews
  labels:
    app: reviews
    service: reviews
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-reviews
  labels:
    account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v1
  labels:
    app: reviews
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v1
  template:
    metadata:
      labels:
        app: reviews
        version: v1
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v2
  labels:
    app: reviews
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v2
  template:
    metadata:
      labels:
        app: reviews
        version: v2
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v3
  labels:
    app: reviews
    version: v3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v3
  template:
    metadata:
      labels:
        app: reviews
        version: v3
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-productpage
  labels:
    account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      labels:
        app: productpage
        version: v1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {
    
    }
---

書籍情報の展開

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

kubectl get po


#测试页面
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"


4. アプリケーションを外部に公開する

この時点で、BookInfo アプリケーションは展開されていますが、外部からはまだアクセスできません。アクセスを開くには、パスをメッシュのエッジのルートにマップするIstio Ingress Gateway を作成する必要があります。

  1. アプリケーションを Istio ゲートウェイに関連付けます。

外部ロードバランサーをサポートしていない環境 (例: minikube) でクラスターが実行されている場合、istio-ingressgateway の EXTERNAL-IP がステータスとして表示されます。ゲートウェイにアクセスするには、サービスの NodePort またはポート転送を使用してください。

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

kubectl get svc -n istio-system

#服务的 NodePort
kubectl -n istio-system edit svc istio-ingressgateway

kubectl get svc -n istio-system

構成ファイルに問題がないことを確認してください。

istioctl analyze

受信IPとポートを決定する

以下の手順に従ってください。 環境に外部ロード バランサーがない場合は、代わりにノード ポートを選択します。
受信ポートを設定する


export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

#ceph1主机Ip
export INGRESS_HOST=ceph1

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

echo "$GATEWAY_URL"

echo "http://$GATEWAY_URL/productpage"

外部アクセスを検証する

ブラウザを使用して Bookinfo アプリケーションの製品ページを表示し、Bookinfo で外部アクセスが有効になっていることを確認します。

  1. 次のコマンドを実行して、Bookinfo アプリケーションの外部アクセス アドレスを取得します。
kubectl get svc istio-ingressgateway -n istio-system


curl ceph1:31479/productpage



for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done


上記コマンドで出力されたアドレスをブラウザにコピー&ペーストしてアクセスし、Bookinfoアプリの商品ページが開けるか確認してください。

5. ダッシュボードを表示する

Istio は、いくつかのテレメトリ アプリケーションと統合されています。テレメトリは、サービス メッシュの構造を理解し、ネットワーク トポロジを表示し、メッシュの健全性を分析するのに役立ちます。Kialiダッシュボード、 PrometheusGrafanaJaegerをデプロイするには、
以下の手順を使用します

  1. Kiali と他のプラグインをインストールし、展開が完了するまで待ちます。
kubectl apply -f samples/addons

kubectl rollout status deployment/kiali -n istio-system


2. Kiali 外部アクセス NodePort を変更する

kubectl -n istio-system get svc

kubectl -n istio-system edit svc kiali

#type: NodePort


kubectl -n istio-system get svc |grep kiali

#访问 Kiali 仪表板  
http://ceph1:32514

左側のナビゲーション メニューで [グラフ]を選択し、[名前空間]ドロップダウン リストで[デフォルト]を選択します。
追跡データを表示するには、サービスにリクエストを送信する必要があります。リクエストの数は Istio のサンプリング レートによって異なります。サンプリング レートは Istio のインストール時に設定され、デフォルトのサンプリング レートは 1% です。最初のトレースが表示されるまでに、少なくとも 100 件のリクエストを送信する必要があります。次のコマンドを使用して、productpage サービスに 100 個のリクエストを送信します。

テストURL

for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done

キアリの設定
画像.png

6. istio のテスト

1. デフォルトのターゲットルールを適用する

各サービスのDestinationRuleを作成します
。Istio を使用して Bookinfo バージョンのルーティングを制御する前に、宛先ルールで利用可能なバージョンを定義し、それらにサブセット名を付ける必要があります。

#设置
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

#查询
kubectl get destinationrules -o yaml

この時点で、Istio はすべてのテイクオーバーを完了し、最初のデプロイ例が完了しました。

2. リクエストルーティング

バージョンごとのルート

現在、レビューには 3 つのバージョンがあります。ブラウザで Bookinfo アプリケーションの /productpage にアクセスし、数回更新してください。書籍レビューの出力には星評価が含まれる場合と含まれない場合があることがわかりました。これは、明示的なデフォルトのサービス バージョン ルートが存在しないためです。

ここで行う必要があるのは、すべてのトラフィックを各マイクロサービスの v1 バージョンにルーティングするなど、istio にルーティングを引き継がせることです。Istio の実装は非常に簡単で、仮想サービス (VirtualService) を追加するだけです。

3. 例: すべてのトラフィックを各マイクロサービスの v1 バージョンにルーティングします。

#virtual-service-all-v1.yaml是官方提供的示例文件

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

その内容は次のとおりです。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1  #在这里指定了所有的http请求都通过v1完成,而v1在默认的规则中有定义
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

テストの結果、レビューのスタイルが切り替わらないことがわかりました。

4. さまざまなユーザー ID に応じたルーティング

  接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。
  请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。

reviews:v2 は星による評価機能が含まれるバージョンであることに注意してください。

  1. 次のコマンドを実行して、ユーザーベースのルーティングを有効にします。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

2. ルールが作成されたことを確認します

kubectl get virtualservice reviews -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

3. Bookinfo アプリケーションの /productpage で、ユーザー jason としてログインします。
ブラウザを更新します。何が見えますか?各レビューの横に星評価が表示されます。

4. 別のユーザーとしてログインします (任意の名前を選択します)。
ブラウザを更新します。今、星は消えました。これは、Jason を除くすべてのユーザーのトラフィックが reviews:v1 にルーティングされるためです。

ユーザー ID に基づいてトラフィックをルーティングするように Istio が正常に構成されました。

5. トラフィック転送 - グレースケール リリース

また、レビューのトラフィックの一部を v3 バージョンに転送し、これに基づいてグレースケール パブリッシング、A/B テストなどを実装することもできます。

#将所有流量都路由到每个服务的v1版本
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

#将reviews服务 50%的流量转移到v3
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

内容は以下の通りです。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

ブラウザで /productpage ページを更新すると、約 50% の確率でページに赤い星が付いた評価コンテンツが表示されます。これは、v3 のレビューは星による評価を含む評価サービスにアクセスしますが、v1 はアクセスしないためです。

reviews:v3 マイクロサービスが安定していると思われる場合は、次の仮想サービス ルールを適用することで、トラフィックの 100% を reviews:v3 にルーティングできます。

#将reviews服务的全部流量都切换到v3版本

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml

このようにして、すべてのリクエストが v3 に転送されます。
すべてのサービスの仮想ネットワークを削除する必要がある場合は、次のコマンドを実行できます。

kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml

virtual-service-all-v1.yaml 設定ファイルには全サービスのルーティング情報が設定されており、削除するとすべてのルーティング情報が削除されます。

6. タイムアウト

http リクエストのタイムアウトは、ルーティング ルールのタイムアウト フィールドを使用して指定できます。デフォルトでは、タイムアウトは無効になっています

ここでは、レビュー サービスのリクエスト タイムアウトを実験し、評価サービスを呼び出すレビュー サービスの v2 バージョンにリクエストをルーティングします。最初に評価サービスに 2 秒の遅延 (フォールト インジェクション) を人工的に導入します。次に、レビュー サービスのタイムアウトを構成します。タイムアウト
1. /samples/bookinfo/networking ディレクトリに構成ファイルを作成します。

#创建配置文件
cat > samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percent: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    #timeout: 0.5s
EOF

評価サービスに 2 秒の遅延を挿入します。

2. ルーティング設定を適用するには、現在のディレクトリで実行するだけです。

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml

3. Web サイトにアクセスすると、Bookinfo アプリケーションが正常に実行されていることがわかります (評価の星印が表示されます) が、ページが更新されるたびに 2 秒の遅延が発生します。

4. ファイルを再編集し、レビュー サービスへの呼び出しを解放し、0.5 秒のリクエスト タイムアウトを追加します (タイムアウト コメントを削除します)。

5. 設定を再適用するか、手順 2 のコマンドを実行し、次のコマンドで設定が更新されたかどうかを確認します

kubectl get virtualservice -o yaml

6. Web ページを再度更新します。
この時点では、前の 2 秒ではなく 1 秒で戻ることがわかりますが、レビューは利用できません (ページにはレビュー データがありません)。

タイムアウトが 0.5 秒に構成されていても、productpage サービスには再試行がハードコードされているため、応答には 1 秒かかります。そのため、レビュー サービスを呼び出して、戻る前に 2 回タイムアウト (再試行) します。

7. もう一度試してください

HTTP リクエストが失敗した場合に使用する再試行戦略について説明します。たとえば、次のルールは、評価 V1 サービスを呼び出すときの最大再試行を 3 に設定します。各再試行のタイムアウトは 2 秒です。

#创建配置文件
cat > samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream
EOF


kubectl apply -f samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml

8. フュージング

サーキット ブレーカーは、回復力のあるマイクロサービス アプリケーションを作成するために Istio によって提供される便利なメカニズムです。サーキット ブレーカーでは、サービス内の 1 つのホスト呼び出しに対して、同時接続の数やホストへの失敗した呼び出しの数などの制限を設定します。制限がトリガーされると、ヒューズが「トリップ」し、そのホストへの接続が停止します。

サーキット ブレーカー モードを使用すると、クライアントが過負荷または障害のあるホストに接続しようとすることなく、すぐに失敗します。
httpbin をデプロイする

httpbin は Python+Flask で書かれたオープンソース プロジェクトで、さまざまな HTTP リクエストとレスポンスをテストするために使用できます。公式ウェブサイト: http: //httpbin.org/

kubectl apply -f samples/httpbin/httpbin.yaml

この構成ファイルの内容は次のとおりです。

##################################################################################################
# httpbin service
##################################################################################################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

8.1 サーキット ブレーカーの構成:
宛先サーキット ブレーカー ルール (DestinationRule)を作成し、httpbin サービスを呼び出すときにサーキット ブレーカー設定を適用します。

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1  #最大连接数
      http:
        http1MaxPendingRequests: 1  #http请求pending状态的最大请求数
        maxRequestsPerConnection: 1  #在一定时间内限制对后端服务发起的最大请求数
    outlierDetection:  #熔断设置
      consecutiveErrors: 1  #从连接池开始拒绝连接,已经连接失败的次数,当通过HTTP访问时,返回代码是502、503或504则视为错误。
      interval: 1s  #拒绝访问扫描的时间间隔,即在interval(1s)内连续发生1个consecutiveErrors错误,则触发服务熔断,格式是1h/1m/1s/1ms,但必须大于等于1ms。即分析是否需要剔除的频率,多久分析一次,默认10秒。
      baseEjectionTime: 3m  #最短拒绝访问时长。这个时间主机将保持拒绝访问,且如果决绝访问达到一定的次数。格式:1h/1m/1s/1ms,但必须大于等于1ms。实例被剔除后,至少多久不得返回负载均衡池,默认是30秒。
      maxEjectionPercent: 100  #服务在负载均衡池中被拒绝访问(被移除)的最大百分比,负载均衡池中最多有多大比例被剔除,默认是10%。
EOF

ターゲット ルールが正しく作成されたことを確認します。

kubectl get destinationrule httpbin -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  ...
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        maxConnections: 1
    outlierDetection:
      baseEjectionTime: 180.000s
      consecutiveErrors: 1
      interval: 1.000s
      maxEjectionPercent: 100

クライアント

httpbin サービスにトラフィックを送信するクライアント プログラムを作成します。これは Fortio と呼ばれる負荷テスト クライアントで、接続数、同時実行数、HTTP リクエスト送信の遅延を制御できます。Fortio は、DestinationRule で以前に設定されたサーキット ブレーカー ポリシーを効果的にトリガーできます。

kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml

kubectl get po


クライアントが正常にデプロイされるまで少し待ちます。

クライアント Pod にログインし、Fortio ツールを使用して httpbin サービスを呼び出します。-curl パラメータは、通話の送信を示します。

$ FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
$ kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -curl  http://httpbin:8000/get
HTTP/1.1 200 OK
server: envoy
date: Tue, 16 Jan 2018 23:47:00 GMT
content-type: application/json
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 445
x-envoy-upstream-service-time: 36

{
    
    
  "args": {
    
    },
  "headers": {
    
    
    "Content-Length": "0",
    "Host": "httpbin:8000",
    "User-Agent": "istio/fortio-0.6.2",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "824fbd828d809bf4",
    "X-B3-Traceid": "824fbd828d809bf4",
    "X-Ot-Span-Context": "824fbd828d809bf4;824fbd828d809bf4;0000000000000000",
    "X-Request-Id": "1ad2de20-806e-9622-949a-bd1d9735a3f4"
  },
  "origin": "127.0.0.1",
  "url": "http://httpbin:8000/get"
}

バックエンド サービスを呼び出すリクエストが成功したことがわかります。次に、融合をテストできます。

サーキット ブレーカーのトリガー
DestinationRule 構成では、maxConnections: 1 および http1MaxPendingRequests: 1 が定義されています。これらのルールは、複数の同時接続およびリクエストがある場合、istio-proxy がさらなるリクエストおよび接続を行う間、後続のリクエストまたは接続がブロックされることを意味します。

发送并发数为 2 的连接(-c 2),请求 20 次(-n 20):
[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 14 (70.0 %)
Code 503 : 6 (30.0 %)
...

同時接続数を 3 に増やします。

[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 30 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 11 (36.7 %)
Code 503 : 19 (63.3 %)
...

istio-proxy ステータスをクエリして、サーキット ブレーカーの詳細を確認します。

[root@ceph1 istio-1.11.7]# kubectl exec $FORTIO_POD -c istio-proxy -- pilot-agent request GET stats | grep httpbin | grep pending
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.remaining_pending: 1
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.high.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_active: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_failure_eject: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_overflow: 89
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_total: 114

upstream_rq_pending_overflow 値が 89 であることがわかります。これは、これまでに 89 件のコールがブロー済みとしてマークされていることを意味します。

9. httpbin をクリーンアップする

#清理规则:
kubectl delete destinationrule httpbin


#下线 httpbin 服务和客户端:
kubectl delete deploy httpbin fortio-deploy
kubectl delete svc httpbin

参考ブログ
https://blog.csdn.net/bxg_kyjgs/article/details/125599452?utm_source=miniapp_weixin

おすすめ

転載: blog.csdn.net/qq_35583325/article/details/132564350