K8s-サービス メッシュ プラクティス - メッシュの構成 (グレー リリース)

K8s-サービス メッシュ プラクティス - メッシュの構成 (グレー リリース)

前の記事  k8s-Service Mesh Practice-Istio の概要では、Istio をインストールしてデプロイする方法が紹介されており、Istio を使用して gRPC ロード バランシングを実装できます。

今日はさらに一歩進んで、Istio の機能の使い方について詳しく見ていきます。

Istio トラフィック モデルから、Istio はクラスターのイングレス リクエストとエグレス リクエスト (ゲートウェイ) の管理をサポートしているだけでなく、クラスター内のメッシュ トラフィック、つまりクラスター内のサービス間のリクエストの管理もサポートしていることがわかります。

今回は、まずクラスター内のリクエストについて説明し、以下の2つの機能を実装します。

  • グレースケールリリース(指定されたリクエストを異なるサービスにルーティングする)
  • サービスのリクエストの重みを設定する

グレースケールリリース

開始前に、2 つのデプロイメントと 1 つのサービスがデプロイされます。同時に、これら 2 つのデプロイメントに関連付けられた Pod は、グレースケール中にグループ化されるため、2 つの異なるラベルに対応します。

この yaml を使用すると、必要なデプロイメントとサービスがデプロイされます。

 kubectl apply -f https://raw.githubusercontent.com/crossoverJie/k8s-combat/main/deployment/istio-mesh.yaml

まず、グレースケールのリリースが必要な場合を想像してみましょう。通常、主要機能のテストであり、内部テストにエントリーした一部のユーザーのみ入場可能です。

アプリを作成していると仮定すると、内部テスト パッケージを受け取ったユーザーのすべてのリクエスト ヘッダーにバージョン番号を追加できます。

たとえば、versinotallow=200 は新しいバージョンを示し、versinotallow=100 は古いバージョンを示します。同時に、このバージョン番号はサーバー上に出力され、リクエストが期待される Pod に入ったかどうかを区別します。

 // Client version := r.URL.Query().Get("version") name := "world" ctx, cancel := context.WithTimeout(context.Background(), time.Second) md := metadata.New(map[string]string{ "version": version, }) ctx = metadata.NewOutgoingContext(ctx, md) defer cancel() g, err := c.SayHello(ctx, &pb.HelloRequest{Name: name}) // Server func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { md, ok := metadata.FromIncomingContext(ctx) var version string if ok { version = md.Get("version")[0] } log.Printf("Received: %v, version: %s", in.GetName(), version) name, _ := os.Hostname() return &pb.HelloReply{Message: fmt.Sprintf("hostname:%s, in:%s, version:%s", name, in.Name, version)}, nil }

グループ化サービス

グレースケール テストを実行する場合、多くの場合、v2 (上図の Pod2) と呼ばれる新しいグレースケール サービスをデプロイする必要があります。

同時に、v1 と v2 をグループ化する必要があります。

 apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: k8s-combat-service-ds spec: host: k8s-combat-service-istio-mesh subsets: - name: v1 labels: app: k8s-combat-service-v1 - name: v2 labels: app: k8s-combat-service-v2

ここでは、Istio の DestinationRule を使用してサブセットを定義します。つまり、サービス下の Pod を v1/v2 に分割します。

ラベルアプリを使ってグループ化する

ここでのホスト: k8s-combat-service-istio-mesh は通常、サービス名で構成されます。

 apiVersion: v1 kind: Service metadata: name: k8s-combat-service-istio-mesh spec: selector: appId: "12345" type: ClusterIP ports: - port: 8081 targetPort: 8081 name: app - name: grpc port: 50051 targetPort: 50051

これはサービスの名前です。ホストとしての構成もサポートされています: k8s-combat-service-istio-mesh.default.svc.cluster.local。略語が使用されている場合、Istio は現在指定されている名前空間に従ってそれを解決します。

Istio では、誤操作を避けるために、ここでは省略形ではなく完全修飾名を使用することをお勧めします。

もちろん、DestinationRule で負荷分散戦略を構成することもできますが、ここでは省略します。

 apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: k8s-combat-service-ds spec: host: k8s-combat-service-istio-mesh trafficPolicy: loadBalancer: simple: ROUND_ROBIN

そこで、次の 2 つのグループを定義しました。

  • v1: アプリ: k8s-combat-service-v1
  • v2: アプリ: k8s-combat-service-v2

その後、ルーティング ルールを構成して、トラフィックを 2 つの異なるグループに割り当てることができます。ここでは、構成に VirtualService を使用します。

 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: k8s-combat-service-vs spec: gateways: - mesh hosts: - k8s-combat-service-istio-mesh # match this host http: - name: v1 match: - headers: version: exact: '100' route: - destination: host: k8s-combat-service-istio-mesh subset: v1 - name: v2 match: - headers: version: exact: '200' route: - destination: host: k8s-combat-service-istio-mesh subset: v2 - name: default route: - destination: host: k8s-combat-service-istio-mesh subset: v1

このルールはとてもシンプルです。 http プロトコル ヘッダーのバージョン フィールド値を検出します。 100 の場合は、subset=v1 グループ内の Pod にルーティングされます。同様に、200 の場合は、subset=v2 グループ内の Pod にルーティングされます。

一致するヘッダーがない場合、デフォルトのサブセット: v1が入力されます

gRPC も http プロトコルに基づいており、そのメタデータは http プロトコルのヘッダーに対応します。

ヘッダー=100

 Greeting: hostname:k8s-combat-service-v1-5b998dc8c8-hkb72, in:world, version:100istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=100" Greeting: hostname:k8s-combat-service-v1-5b998dc8c8-hkb72, in:world, version:100istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=100" Greeting: hostname:k8s-combat-service-v1-5b998dc8c8-hkb72, in:world, version:100istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=100" Greeting: hostname:k8s-combat-service-v1-5b998dc8c8-hkb72, in:world, version:100istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=100"

ヘッダー=200

 Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200"

上記のテスト リクエストによれば、リクエスト ヘッダーに指定されたバージョンが含まれている限り、指定された Pod にルーティングされます。

この機能を使用すると、グレースケール検証中に Deployment のグレースケール バージョンを別途送信し、クライアントが指定したバージョンと組み合わせてグレースケール機能を実装できます。

重みの設定

VirtualService に基づいて、異なるサブセット グループの重みを構成することもできます。

 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: k8s-combat-service-vs spec: gateways: - mesh hosts: - k8s-combat-service-istio-mesh # match this host http: - match: - uri: exact: /helloworld.Greeter/SayHello route: - destination: host: k8s-combat-service-istio-mesh subset: v1 weight: 10 - destination: host: k8s-combat-service-istio-mesh subset: v2 weight: 90 timeout: 5000ms

ここで説明されているのは、SayHello インターフェースの重み設定です (もちろん、一致するルールは複数あります)。トラフィックの 90% は v2 サブセット、つまり k8s-combat-service-istio-mesh サービスの下にあるアプリ: k8s-combat-service-v2 Pod に入ります。

 Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-**v1**-5b998dc8c8-hkb72, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$ curl "http://127.0.0.1:8081/grpc_client?name=k8s-combat-service-istio-mesh&versinotallow=200" Greeting: hostname:k8s-combat-service-v2-5db566fb76-xj7j6, in:world, version:200istio-proxy@k8s-combat-service-v1-5b998dc8c8-hkb72:/$

テストの結果、ほとんどのリクエストは予想どおり v2 グループに入ることがわかりました。

もちろん、次のこともできます。

  • タイムアウト
  • フォールト注入
  • 再試行の詳細な設定については、Istio の公式ドキュメントを参照してください。

  • もちろん、一部のクラウド プラットフォームでは、より直感的に使用できるビジュアル ページも提供されています。

上記はAlibaba Cloudのスクリーンショットです

しかし、管理するリソースは主にKubernetesであり、通常は運用やDevOpsによって構成されるため、開発や使用には不便です。したがって、クラウド ベンダーと開発者の間で、開発者がプロ​​ジェクトの次元でこれらの機能を管理および保守できるようにする管理およびリリース プラットフォームが必要です。

この記事のすべてのソースコードは、https://github.com/crossoverJie/k8s-combat からアクセスできます。

<<:  単一のクラウドプロバイダーに過度に依存することの危険性

>>:  Kubernetes ゲートウェイ API ポリシーに基づくトラフィック管理

推薦する

greenwebpage VPS はどうですか?香港データセンターのVPSの詳細レビュー

greenwebpage は香港 VPS 事業を運営しています。サーバーは M247 コンピューター...

100カ国以上が2020年までにデジタル課税の合意を目指すことに合意

ロイター通信によると、経済協力開発機構(OECD)は金曜日、約110カ国が多国籍デジタル企業への課税...

ウェブサイトの最適化における Baidu の共有の利点について簡単に説明します。

現在、多くのウェブサイトがBaidu Share機能を提供しています。実はこれは、Baidu自身がW...

クラウド コンピューティング サービス プラットフォームの選択: SaaS か PaaS か?

現在、クラウド コンピューティングの概念は、定義がやや不明瞭なだけでなく、特に現在の経済不況の中でク...

「Hongmeng HarmonyOS 分散データ管理プラットフォームの包括的な解釈」ライブ Q&A (パート 3)

詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したHongmengテクノ...

server-factory: オランダの VPS、年間 9 ユーロから、ギガビット帯域幅、AMD EPYC+Ryzen+DDR4+NVMe

新しいブランドである server-factory はドイツ人によって運営されており、オランダの S...

クラウド コンピューティング環境におけるストレージの 6 つの必須要素は何ですか?

最近、クラウド コンピューティングに注目が集まっており、ストレージは基盤となるプラットフォームとして...

効率的なクラウド移行のために適切なデータ転送プロトコルを選択する

急速に進化する今日のデジタル環境において、スケーラビリティ、柔軟性、コスト効率の向上を目指す企業にと...

WeChatの成功からウェブマスターの夜明けを見る

街を歩いていると、携帯電話を持ち、WeChatを使っているおしゃれな若者をよく見かけます。 WeCh...

クラウドコンピューティングとは何ですか?

クラウドは一般的にグローバルなインターネットまたはネットワークを指しますが、コンピューティングはリモ...

インターネットの歴史に残る短命な職業:フラッシュハッカー、リンクパブリッシャー、テキストライター、ウィットハッカー

文/呉俊(Fayiba創設者、Dianmo Media中核メンバー)不完全な統計によると、インターネ...

日本サーバー

日本サーバー:日本のコンピュータルームのハードウェア条件は非常に良好で、国際輸出帯域幅が大きく、中国...

Linode-13周年、VPS価格は据え置き、メモリは「なんとも言えないほど」倍増

Linode.com は、今年で 13 周年を迎えたと発表しました。これまでとは異なり、同社はお金を...

図 |分散システムをマスターする: プログラマーになるための道

[[384765]]プログラミングは芸術であり、その魅力は創造にあります。 65 兄さんは 2 年間...