0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kong Gateway Operatorのkind: AIGatewayを試す

Last updated at Posted at 2024-04-10

Kong Gateway、Kong Ingress Controller(以下KIC)を簡単にデプロイ・管理するためのOperatorとしてKong Gateway Operator(以下KGO)というものがある。
このOperatorが提供するカスタムリソースの中にkind: AIGatewayというリソースがexperimentalで用意されており、Kong GatewayをAI Pluginを入れ込んだ形で簡単にデプロイ出来るようになっている。
これを試してみる。

kind: AIGatewayの仕組み

kind: AIGatewayをapplyすると、Operatorが以下のリソースを自動で生成、展開する。

赤枠がKGOが提供するカスタムリソースで、緑枠がGatway APIが提供するカスタムリソースである。
上記のカスタムリソースのうち、KGOが提供するカスタムリソースの役割は以下となる。(参考:Custom Resource Definitions API Reference)

リソース名 役割
ControlPlane デプロイするKong GatwayのControlPlaneを定義する
DataPlane デプロイするKong GatwayのDataPlaneを定義する
KongPlugin Namespace単位でKong Gatewayのプラグインを定義
AIGateway AI向けPluginを設定する

まとめると、AIGatewayリソースを展開することで以下が自動で行われる。

  • Kong Gatewayそのものがデプロイされる(ControlPlaneDataPlane
  • Kong Gateway内にAI用Pluginが導入・設定される(KongPlugin
  • Kong Gatewayにアクセス・利用するためのルーティング設定が行われる(GatewayHTTPRouteServiceNetworkPolicy

これにより、「Kubernetesのリソースがたくさんあって構築・管理がムズカシイ!」という人でも簡単にKong AI Gatewayが利用できるようになる。はず。

KGOの導入

kind: AIGatewayを試すためにKGOをインストールし、カスタムリソースを展開する。
KGOはKongのHelmチャートのリポジトリに含まれている。

NAME                 	CHART VERSION	APP VERSION	DESCRIPTION
kong/kong            	2.38.0       	3.6        	The Cloud-Native Ingress and API-management
kong/gateway-operator	0.1.4        	1.2.0      	Deploy Kong Gateway Operator
kong/ingress         	0.12.0       	3.6        	Deploy Kong Ingress Controller and Kong Gateway

なので、Kongのチャートリポジトリを追加してHelmでインストールする。

helm repo add kong https://charts.konghq.com
helm repo update kong
helm upgrade --install kgo kong/gateway-operator -n kong-system --create-namespace 

インストールすると以下のようにOperatorのPodが展開される。

$ kubectl get pod -n kong-system
NAME                                                       READY   STATUS      RESTARTS   AGE
gateway-operator-admission-t4pvp-6pg8w                     0/1     Completed   0          2m20s
kgo-gateway-operator-controller-manager-6654b9f6d4-ggdbb   2/2     Running     0          22m

なお、KGOインストール時にGateway APIのカスタムリソースも自動で導入されるため、別途インストールする必要はない。
KGOの導入としては上記手順で終了だが、kind: AIGatewayを使うには追加の設定が必要となる。
kind: AIGatewayはまだアルファ版レベルの実験的機能で、'24/4時点ではデフォルトで機能に蓋がされている。
以下を実行し環境変数をOperator側に設定することで利用できるようになる

kubectl set env -n kong-system deployments/kgo-gateway-operator-controller-manager -c manager GATEWAY_OPERATOR_ENABLE_CONTROLLER_AIGATEWAY="true"

また、AIGateway作成時にどのGateway Controllerを使うか指定する必要があるため、GatewayClassも作成しておく

cat <<EOF | kubectl apply -f -
kind: GatewayClass
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: kong
spec:
  controllerName: konghq.com/gateway-operator
EOF

動作確認

AI Gatewayのページを参考にAI Gatewayを検証する
ここでは検証にお金が掛からないCohereのAPIトークンを使って検証する。
最初にCohereのAPIトークンをSecret化する。

COHERE_KEY=NZv930oWCxxxxxx
kubectl create secret generic acme-ai-cloud-providers --from-literal=cohere=$COHERE_KEY -n demo

Secretのキー名はLLMのプロバイダによって決まる。cohere以外のものを選ぶ場合はkubectl explain aigateway.spec.cloudProviderCredentialsとかで確認するとよい。
次にAIGatewayリソースを作成する。なおこのリソースを作成した時点でGatewayHTTPRouteKongPluginControlPlaneDataPlaneといったリソースが自動で作成される。

cat <<EOF > ./cohere.yaml
apiVersion: gateway-operator.konghq.com/v1alpha1
kind: AIGateway
metadata:
  name: kong-aigateway
spec:
  gatewayClassName: kong
  largeLanguageModels:
    cloudHosted:
    - identifier: devteam-chatgpt
      model: command
      promptType: chat
      aiCloudProvider:
        name: cohere
  cloudProviderCredentials:
    name: acme-ai-cloud-providers
EOF
kubectl apply -f ./cohere.yaml -n demo

gatewayClassNameにはKGOインストール時に作成したGatewayClassを指定する。
cloudHosted内の設定値についてはAI Proxy PluginのCohereの設定を参考に設定した。
個別の設定が必要な場合はcloudHosted内に書いていく。
identifierはRouteのパスになるため、デプロイ後は<Gatewayのアドレス/identifier>にアクセスするとCohereを叩くことになる。
cloudProviderCredentialsには先程作成したAPIトークンが入ったSecretを指定する。Secretのvalueの指定などは不要。
リソースが作成された後、正常にOperatorが動作すれば以下のような形でGateway等のリソースが作成される。

$ kubectl tree aigateway kong-aigateway -n demo
NAMESPACE  NAME                                                                         READY  REASON  AGE
demo       AIGateway/kong-aigateway                                                     -              14h
demo       ├─Gateway/kong-aigateway                                                     True   Ready   14h
demo       │ ├─ControlPlane/kong-aigateway-r7phq                                        True   Ready   14h
demo       │ │ ├─Deployment/controlplane-kong-aigateway-r7phq-8rhmn                     -              14h
demo       │ │ │ └─ReplicaSet/controlplane-kong-aigateway-r7phq-8rhmn-75d7fb69f7        -              14h
demo       │ │ │   └─Pod/controlplane-kong-aigateway-r7phq-8rhmn-75d7fb69f7-nx8d7       True           14h
demo       │ │ ├─Secret/controlplane-kong-aigateway-r7phq-4f6dc                         -              14h
demo       │ │ ├─Secret/controlplane-kong-aigateway-r7phq-rw598                         -              14h
demo       │ │ ├─Service/controlplane-webhook-kong-aigateway-r7phq-25snf                -              14h
demo       │ │ │ └─EndpointSlice/controlplane-webhook-kong-aigateway-r7phq-25snf-z9mtn  -              14h
demo       │ │ └─ServiceAccount/controlplane-kong-aigateway-r7phq-s7ftm                 -              14h
demo       │ ├─DataPlane/kong-aigateway-g2pbv                                           True   Ready   14h
demo       │ │ ├─Deployment/dataplane-kong-aigateway-g2pbv-glbj4                        -              14h
demo       │ │ │ └─ReplicaSet/dataplane-kong-aigateway-g2pbv-glbj4-85ff4b799            -              14h
demo       │ │ │   └─Pod/dataplane-kong-aigateway-g2pbv-glbj4-85ff4b799-pnv2q           True           14h
demo       │ │ ├─Secret/dataplane-kong-aigateway-g2pbv-dj498                            -              14h
demo       │ │ ├─Service/dataplane-admin-kong-aigateway-g2pbv-68sp7                     -              14h
demo       │ │ │ └─EndpointSlice/dataplane-admin-kong-aigateway-g2pbv-68sp7-mhg6c       -              14h
demo       │ │ └─Service/dataplane-ingress-kong-aigateway-g2pbv-clrdp                   -              14h
demo       │ │   └─EndpointSlice/dataplane-ingress-kong-aigateway-g2pbv-clrdp-cbfkx     -              14h
demo       │ └─NetworkPolicy/kong-aigateway-g2pbv-limit-admin-api-q6vpt                 -              14h
demo       ├─HTTPRoute/devteam-chatgpt-egress                                           -              14h
demo       ├─KongPlugin/devteam-chatgpt-ai-proxy                                        -              14h
demo       └─Service/kong-aigateway-ai-sink                                             -              14h

なお、うまく展開されたかどうかはAIGatewayリソースを確認しても分からないため、Gatewayリソースが展開されたかどうか等で確認した方がよい。
(おそらくまだ実験的機能なので実装が追いついていない)
LLMに関する設定はKongPlugin内に設定されている。

$ kubectl get kongplugin -n demo devteam-chatgpt-ai-proxy -o jsonpath={.config} | jq
{
  "auth": {
    "header_name": "Authorization",
    "header_value": "Bearer NZv930oWxxxxxx"
  },
  "logging": {
    "log_payloads": false,
    "log_statistics": true
  },
  "model": {
    "name": "command",
    "options": {},
    "provider": "cohere"
  },
  "route_type": "llm/v1/chat"
}

早速使ってみる。
最初にGatewayのアドレスを環境変数に設定する。

export PROXY_IP=$(kubectl get gateway kong-aigateway -o jsonpath='{.status.addresses[0].value}')

Kong Gatewayをcurlで叩く。

curl -s -X POST $PROXY_IP/devteam-chatgpt -H "Content-Type: application/json" --data-raw '{
    "messages": [{
    "role": "user",
    "content": "What is Kong Gateway?"
  }] }'

帰ってきた結果はこちら。

{"object":"chat.completion","model":"command","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Kong Gateway is an open-source API Gateway solution. It is a microservices-oriented middleware solution that serves as a centralized gateway to handle all API traffic for infrastructure and applications. Kong facilitates governance, securing, and management of APIs and microservices in any architecture, including hybrid, multi-cloud, and distributed architectures.\n\nSome of the main features and functionalities of Kong Gateway are:\n1. **API Proxy** - Kong can proxy all requests to APIs and microservices in the underlying infrastructure. As a result, all services in the backend are completely shielded from clients. This decoupling provides agility in the infrastructure as backend services can be created, updated, and removed without the need for clients to change code or configurations.\n2. **Load Balancing** - Kong can distribute incoming API traffic across a number of services, ensuring that no single service is overwhelmed with too much traffic. This creates a highly available and fault-tolerant infrastructure.\n3. **Security** - Kong provides various mechanisms to secure APIs, such as SSL/TLS, authentication, and authorization. It allows for certificate provisioning and revocation, OCSP response caching, and automated renewal via an integrated certificate manager. It supports over a dozen authentication plugins, including native OAuth support, with which users can integrate with existing identity providers. It also provides support for token-based authentication, such as JWT, and declarative ACLs (Access Control Lists) to enforce authorization.\n4. **Data Aggregation and Transformation** - Kong allows for data aggregation by transforming requests and responses on the fly. It can transform requests from multiple clients into a standardized format for consumption by different services, and it can also be used to create a unified response format.\n5. **Analytics** - Kong provides analytics on API usage, such as the number of hits, the slowest requests, and traffic graphs. This enables teams to monitor and assess the performance of their APIs and microservices and plan for improvements or optimizations.\n6. **Management** - Kong has a GUI and a CLI that make it easy to manage APIs and microservices. Through these, you can configure APIs, manage plugins and certificates, view analytics, and manage authentication. Further, Kong provides a Developer Portal where developers can find documentation and test APIs via interactive docs. \n\nOverall, Kong Gateway is a powerful and comprehensive solution for managing and orchestrating APIs and microservices. It is widely used in modern application architectures to provide improved agility, security, and governance.","role":"assistant"}}],"id":"5e5a13c1-5ef8-4e8a-b5bd-f25d7456c47d","usage":{}}

ということで、Kong Gateway経由でCohereに簡単にアクセスすることが出来た。

所感

Kong GatewayやAI Pluginを難しく考えずに簡単にデプロイする仕掛けとしてkind AIGatewayは面白そうだ。
ただ、まだ実装途中の機能が多く、以下のような不満はあった。

  • リソースの状態表示などが不十分(でもkubectl explainをしっかり書いてるのは立派)
  • リコンサイルの仕掛けが不十分で、ぶら下がってるリソースを削除しても復旧してくれない
  • PATCHに未対応なため、デプロイ後にmodel変更とかが出来ない。

中の人に聞いたところ、まだまだ絶賛実装中とのことで、上記の点も修正されるっぽいので将来が楽しみではある。
バージョンがあがったらまた試そうと思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?