公式ウェブサイト:https://istio.io/v1.11/zh/docs/concepts/what-is-istio/
istio アーキテクチャ
実際、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 個の赤い星アイコンを使用して評価情報を表示します。
以下の図は、このアプリケーションのエンドツーエンドのアーキテクチャを示しています。
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 を作成する必要があります。
- アプリケーションを 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 で外部アクセスが有効になっていることを確認します。
- 次のコマンドを実行して、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ダッシュボード、 Prometheus、Grafana、Jaegerをデプロイするには、
以下の手順を使用します。
- 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
キアリの設定
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 は星による評価機能が含まれるバージョンであることに注意してください。
- 次のコマンドを実行して、ユーザーベースのルーティングを有効にします。
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