Kubernetes上の認証済みgRPCサービス
Built for Speed: ~10ms Latency, Even Under Load
Blazingly fast way to build, track and deploy your models!
- Handles 350+ RPS on just 1 vCPU — no tuning needed
- Production-ready with full enterprise support
Kubernetesに関するブログシリーズでは、 Kubernetes上でのスケーラブルなMLOpsの構築、 MLOpsのアーキテクチャ、そして アプリケーション開発の課題解決について話しました。本ブログでは、AWS EKSクラスター上でGRPCサービスをホストする方法について説明します。このプロセスは、どのKubernetesクラスターでもほぼ同じですが、これを機能させるためにはAWSロードバランサーでいくつかの特別な設定を行う必要がありました。
gRPCとは何か、そして私たちのユースケース
gRPCは、あらゆる環境で動作するオープンソースのRPCフレームワークです。データセンター内およびデータセンター間でサービスを効率的に接続でき、ロードバランシング、トレース、ヘルスチェック、認証のサポートをプラグインする機能も備えています。
私たちのユースケース:約100MBのペイロードを受け入れるAPIとしてTensorflowモデルをホストすること。GRPCはより大きなペイロードに対してはるかに優れたパフォーマンスを発揮するため、GRPCポートをポート5000で公開しました。
サービスのホスティング
以下のDeployment YAMLを使用して、サービスをKubernetes上にホストしました。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-api
namespace: ml-services
spec:
replicas: 1
selector:
matchLabels:
truefoundry.com/component: ml-api
template:
metadata:
labels:
truefoundry.com/application: ml-api
spec:
containers:
- name: ml-api
image: >-
XXXX.dkr.ecr.us-east-1.amazonaws.com/ml-services-ml-api:latest
ports:
- name: port-8500
containerPort: 8500
protocol: TCP
resources:
limits:
CPU: '4'
エフェメラルストレージ: 2G
メモリ: 4G
リクエスト:
CPU: '1'
エフェメラルストレージ: 1G
メモリ: 500M
イメージプルポリシー: IfNotPresent
再起動ポリシー: Always
終了猶予期間 (秒): 30
DNSポリシー: ClusterFirst
セキュリティコンテキスト: {}
イメージプルシークレット:
- 名前: ml-api-image-pull-secret
スケジューラ名: default-scheduler
ストラテジー:
タイプ: RollingUpdate
ローリングアップデート:
最大利用不可数: 25%
最大サージ数: 0
これによりPodが起動します。以下のYAMLを使用してServiceオブジェクトを作成する必要があります。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
labels:
argocd.argoproj.io/instance: tfy-istio-ingress
name: tfy-wildcard
namespace: istio-system
spec:
selector:
istio: tfy-istio-ingress
servers:
- hosts:
- 'ml.example.com'
port:
name: http-tfy-wildcard
number: 80
protocol: HTTP
tls:
httpsRedirect: true
- ホスト:
- 'ml.example.com'
ポート:
name: https-tfy-wildcard
number: 443
protocol: HTTP
サービスの公開
KubernetesではIngressレイヤーとしてIstioを使用しています。istio-ingressがインストールされると、Istioはロードバランサーをプロビジョニングします。ロードバランサーの設定は、Istioゲートウェイのアノテーションを使用してカスタマイズできます。Istio Gatewayを作成するための仕様は以下の通りです。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
labels:
argocd.argoproj.io/instance: tfy-istio-ingress
name: tfy-wildcard
namespace: istio-system
spec:
selector:
istio: tfy-istio-ingress
servers:
- ホスト:
- 'ml.example.com'
port:
name: http-tfy-wildcard
number: 80
protocol: HTTP
tls:
httpsRedirect: true
- hosts:
- 'ml.example.com'
port:
name: https-tfy-wildcard
number: 443
protocol: HTTP
AWSロードバランサーでSSLターミネーションを行っています。そのためには、証明書をロードバランサーにアタッチする必要があります。これは、Istio Gatewayチャート (https://istio-release.storage.googleapis.com/charts) に以下のAnnotationを使用することで実現できます。
"service.beta.kubernetes.io/aws-load-balancer-type": "nlb"
"service.beta.kubernetes.io/aws-load-balancer-backend-protocol": "tcp"
"service.beta.kubernetes.io/aws-load-balancer-ssl-cert": "<certificate-arn>"
"service.beta.kubernetes.io/aws-load-balancer-ssl-ports": "https"
"service.beta.kubernetes.io/aws-load-balancer-alpn-policy": "HTTP2Preferred"
GRPCトラフィックを許可するためには、alpn-policyの指定が重要です。当社のml-apiサービスは、Kubernetesサービスを指すVirtualServiceを作成することで公開できます。VirtualServiceのYAMLは以下の通りです。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
labels:
argocd.argoproj.io/instance: ml-services_ml-api
name: ml-apiport-8500-vs
namespace: ml-services
spec:
gateways:
- istio-system/tfy-wildcard
hosts:
- ml.example.com
http:
- route:
- destination:
host: ml-api
port:
number: 8500
仮想サービスが公開されると、ml.example.comでサービスにリクエストを送信できるようになります。その後、誰もがAPIを呼び出せないように、APIに認証を追加したいと考えました。認証はコード内に追加することもできましたが、すべてのサービスで統一されたレイヤーとして機能させられるよう、Istioレイヤーで追加することにしました。
Istioイングレステイヤーで認証を追加するため、私たちは〜で進めることにしました。 IstioWasm プラグイン。プラグインのYAMLは以下のようになります。
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: ml-services-ml-api-0
namespace: istio-system
spec:
phase: AUTHN
pluginConfig:
basic_auth_rules:
- credentials:
- username:password
hosts:
- ml.example.com
prefix: /
request_methods:
- GET
- PUT
- POST
- PATCH
- DELETE
selector: セレクター
matchLabels: マッチラベル
istio: tfy-istio-ingress
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
上記のスペックをクラスターに適用すると、ブラウザでアプリを開いた際にユーザー名とパスワードが求められます。
TrueFoundryでは、これを非常に簡単にしました。
上記のプロセスをさらに簡単にするため、私たちは Truefoundry プラットフォーム上で非常に簡単にすることにしました。

TrueFoundry AI Gateway delivers ~3–4 ms latency, handles 350+ RPS on 1 vCPU, scales horizontally with ease, and is production-ready, while LiteLLM suffers from high latency, struggles beyond moderate RPS, lacks built-in scaling, and is best for light or prototype workloads.


















.webp)
.webp)


.png)

.png)














