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 ポリシーに基づくトラフィック管理

推薦する

ウェブサイトのトラフィック統計分析についてもう一度お話しします

人生日記には、喜び、悲しみ、怒り、幸せ、そして成長体験を記録できます。では、ウェブサイトのトラフィッ...

iwfhosting - $8.99/KVM/2G メモリ/25g SSD/1T トラフィック/10Gbps 帯域幅/ロサンゼルス

iwfhosting は H4Y Technologies LLC 傘下のブランドです。主にホスティ...

徹底解説!時系列データベース HiTSDB: 分散ストリーミング集約エンジン

[[226527]]背景Alibaba グループ内の顧客にサービスを提供する際に、HiTSDB 時系...

Youpin.com の視点から見た SEO の考え方と戦略

待望の Youpin.com がついにオンラインになりました。ほぼ 1 か月間、黙々と作業してきまし...

ステーショングループの運営の成功または失敗に影響を与える、見落とされがちな5つの重要な要素

サイトクラスターの誕生当初の大きな衝撃に比べ、サイトクラスターの発展は安定期に入り、サイトクラスター...

インターネットトラフィックと有料トラフィックの分析!

少し前に、Pinduoduo は年次財務報告書を発表しました。財務報告によると、ピンドゥオドゥオのマ...

5Gとエッジクラウドが出会うとき、それが5Gが世界を変える根本的な理由です

2019年6月6日、非常に縁起の良い日に、工業情報化部は4つの主要通信事業者に5G商用ライセンスを発...

Google のジッパー発明者記念の Google SEO

Google がアルゴリズムを更新して以来、SEO 作業の難しさは、ガーゼの層を通して少女を見るよう...

垂直型ブログサイトは運営に苦戦しており、無料ユーザーを削除すると脅している。

「過去数ヶ月にわたり、多くのユーザーがこの告発に対して憤慨を表明してきましたが、さらに多くのユーザー...

電子商取引の統合が始まる可能性:垂直電子商取引は難しい選択に直面

蘇寧が6600万ドルでレッドベイビーを「養子」に百貨店小売業への転換は、電子商取引業界の統合を誘発す...

企業ウェブサイトの最適化に関する3つの提案の簡単な分析

移民労働者は長い間、SEOに関する記事を書いていません。最近オンラインマーケティングを勉強し始めたの...

ウェブマスターネットワークニュース:Yu'ebaoが公的資金の引き抜きを引き起こし、Aiku.comは閉鎖される

1. 紙媒体の枠を越え、電子雑誌アプリ広告からスタートそれは2009年末のことでした。しばらくモダン...

テンセントクラウドが「タレントプラン」を開始、人材育成に参加する企業は100万以上のリソースサポートを享受できる

ポストパンデミック時代において、「新しいインフラ」は「ハイライトの瞬間」を迎えます。業界の観点から見...

2023 年の成長を牽引する 5 つの主要なデジタル トレンド

今日、あらゆる業界の企業は、厳しい労働環境と予測不可能な経済情勢の中で繁栄するために、大きな課題に直...

最適化された Web デザインとは何ですか?

検索エンジンによってウェブページのサポートが異なるため、ウェブページをデザインする際には見た目の美し...