将 GKE 推理网关从 v1alpha2 迁移到 v1

本页介绍了如何将 GKE 推理网关设置从预览版 v1alpha2 API 迁移到正式版 v1 API。

本文档适用于使用 v1alpha2 版 GKE 推理网关并希望升级到 v1 版以使用最新功能的平台管理员和网络专家。

在开始迁移之前,请确保您熟悉 GKE 推理网关的概念和部署。我们建议您查看部署 GKE 推理网关

准备工作

在开始迁移之前,请确定您是否需要遵循本指南。

检查是否存在 v1alpha2 API

如需检查您是否在使用 v1alpha2 GKE 推理网关 API,请运行以下命令:

kubectl get inferencepools.inference.networking.x-k8s.io --all-namespaces
kubectl get inferencemodels.inference.networking.x-k8s.io --all-namespaces

这些命令的输出结果可确定您是否需要迁移:

  • 如果任一命令返回一个或多个 InferencePoolInferenceModel 资源,则表示您使用的是 v1alpha2 API,必须遵循本指南。
  • 如果这两个命令都返回 No resources found,则表示您未使用 v1alpha2 API。您可以继续全新安装 v1 GKE 推理网关。

迁移途径

v1alpha2 迁移到 v1 有两种途径:

  • 简单迁移(有停机时间):此迁移路径更快、更简单,但会导致短暂的停机时间。如果您不需要零停机时间迁移,建议采用此方法。
  • 零停机时间迁移:此路径适用于无法承受任何服务中断的用户。它涉及并行运行 v1alpha2v1 堆栈,并逐步转移流量。

简单迁移(有停机时间)

本部分介绍如何执行简单的停机迁移。

  1. 删除现有 v1alpha2 资源:如需删除 v1alpha2 资源,请选择以下选项之一:

    方法 1:使用 Helm 卸载

    helm uninstall HELM_PREVIEW_INFERENCEPOOL_NAME
    

    方法 2:手动删除资源

    如果您未使用 Helm,请手动删除与 v1alpha2 部署关联的所有资源:

    • 更新或删除 HTTPRoute 以移除指向 v1alpha2 InferencePoolbackendRef
    • 删除 v1alpha2 InferencePool、指向它的所有 InferenceModel 资源,以及相应的端点选择器 (EPP) 部署和服务。

    删除所有 v1alpha2 自定义资源后,从集群中移除自定义资源定义 (CRD):

    kubectl delete -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v0.3.0/manifests.yaml
    
  2. 安装 v1 资源:清理旧资源后,安装 v1 GKE 推理网关。此流程包括以下步骤:

    1. 安装新的 v1 自定义资源定义 (CRD)。
    2. 创建新的 v1 InferencePool 和相应的 InferenceObjective 资源。InferenceObjective 资源仍在 v1alpha2 API 中定义。
    3. 创建新的 HTTPRoute,将流量导向新的 v1 InferencePool
  3. 验证部署:几分钟后,验证新的 v1 堆栈是否正在正确处理流量。

    1. 确认网关状态为 PROGRAMMED

      kubectl get gateway -o wide
      

      输出应类似于以下内容:

      NAME                CLASS                            ADDRESS        PROGRAMMED   AGE
      inference-gateway   gke-l7-regional-external-managed   <IP_ADDRESS>   True         10m
      
    2. 通过发送请求来验证端点:

      IP=$(kubectl get gateway/inference-gateway -o jsonpath='{.status.addresses[0].value}')
      PORT=80
      curl -i ${IP}:${PORT}/v1/completions -H 'Content-Type: application/json' -d '{"model": "<var>YOUR_MODEL</var>","prompt": "<var>YOUR_PROMPT</var>","max_tokens": 100,"temperature": 0}'
      
    3. 确保您收到包含 200 响应代码的成功响应。

零停机时间迁移

此迁移路径专为无法承受任何服务中断的用户而设计。下图展示了 GKE 推理网关如何帮助部署多个生成式 AI 模型,这是零停机迁移策略的关键方面。

根据模型名称和优先级将请求路由到不同的模型
图: GKE 推理网关根据模型名称和优先级将请求路由到不同的生成式 AI 模型

使用 kubectl 区分 API 版本

在零停机时间迁移期间,v1alpha2v1 CRD 都会安装在您的集群上。当使用 kubectl 查询 InferencePool 资源时,这可能会造成歧义。为确保您与正确的版本互动,您必须使用完整资源名称:

  • 对于 v1alpha2

    kubectl get inferencepools.inference.networking.x-k8s.io
    
  • 对于 v1

    kubectl get inferencepools.inference.networking.k8s.io
    

v1 API 还提供了一个便捷的短名称 infpool,您可以使用该名称专门查询 v1 资源:

kubectl get infpool

第 1 阶段:并行部署 v1

在此阶段,您将部署新的 v1 InferencePool 堆栈,同时保留现有的 v1alpha2 堆栈,以便安全地逐步迁移。

完成此阶段中的所有步骤后,您将拥有下图所示的基础设施:

根据模型名称和优先级将请求路由到不同的模型
图: GKE 推理网关根据模型名称和优先级将请求路由到不同的生成式 AI 模型
  1. 在 GKE 集群中安装所需的自定义资源定义 (CRD):

    • 对于低于 1.34.0-gke.1626000 的 GKE 版本,请运行以下命令来安装 v1 InferencePool 和 Alpha InferenceObjective CRD:
    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v1.0.0/manifests.yaml
    
    • 对于 GKE 版本 1.34.0-gke.1626000 或更高版本,请仅安装 Alpha 版 InferenceObjective CRD,方法是运行以下命令:
    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/raw/v1.0.0/config/crd/bases/inference.networking.x-k8s.io_inferenceobjectives.yaml
    
  2. 安装 v1 InferencePool

    使用 Helm 安装具有不同版本名称(例如 vllm-llama3-8b-instruct-ga)的新 v1 InferencePoolInferencePool 必须使用 inferencePool.modelServers.matchLabels.app 以与 Alpha InferencePool 相同的模型服务器 Pod 为目标。

    如需安装 InferencePool,请使用以下命令:

    helm install vllm-llama3-8b-instruct-ga \
    --set inferencePool.modelServers.matchLabels.app=MODEL_SERVER_DEPLOYMENT_LABEL \
    --set provider.name=gke \
    --version RELEASE \
    oci://registry.k8s.io/gateway-api-inference-extension/charts/inferencepool
    
  3. 创建 v1alpha2 InferenceObjective 资源。

    在迁移到 Gateway API 推理扩展程序的 v1.0 版本时,我们还需要从 Alpha 版 InferenceModel API 迁移到新的 InferenceObjective API。

    1. 应用以下 YAML 以创建 InferenceObjective 资源:

      kubectl apply -f - <<EOF
      ---
      apiVersion: inference.networking.x-k8s.io/v1alpha2
      kind: InferenceObjective
      metadata:
        name: food-review
      spec:
        priority: 2
        poolRef:
          group: inference.networking.k8s.io
          name: vllm-llama3-8b-instruct-ga
      ---
      apiVersion: inference.networking.x-k8s.io/v1alpha2
      kind: InferenceObjective
      metadata:
        name: base-model
      spec:
        priority: 2
        poolRef:
          group: inference.networking.k8s.io
          name: vllm-llama3-8b-instruct-ga
      ---
      EOF
      

第 2 阶段:流量转移

在两个堆栈都运行的情况下,您可以通过更新 HTTPRoute 来拆分流量,从而开始将流量从 v1alpha2 迁移到 v1。此示例展示了 50-50 的拆分。

  1. 更新 HTTPRoute 以进行流量拆分。

    如需更新流量拆分的 HTTPRoute,请运行以下命令:

    kubectl apply -f - <<EOF
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: llm-route
    spec:
      parentRefs:
      - group: gateway.networking.k8s.io
        kind: Gateway
        name: inference-gateway
      rules:
      - backendRefs:
        - group: inference.networking.x-k8s.io
          kind: InferencePool
          name: vllm-llama3-8b-instruct-preview
          weight: 50
        - group: inference.networking.k8s.io
          kind: InferencePool
          name: vllm-llama3-8b-instruct-ga
          weight: 50
    ---
    EOF
    
  2. 验证和监控。

    应用更改后,监控新 v1 堆栈的性能和稳定性。验证 inference-gateway 网关是否处于 PROGRAMMED 状态 TRUE

第 3 阶段:最终确定和清理

确认 v1 InferencePool 稳定后,您可以将所有流量定向到该资源,并停用旧的 v1alpha2 资源。

  1. 将 100% 的流量转移到 v1 InferencePool

    如需将 100% 的流量转移到 v1 InferencePool,请运行以下命令:

    kubectl apply -f - <<EOF
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: llm-route
    spec:
      parentRefs:
      - group: gateway.networking.k8s.io
        kind: Gateway
        name: inference-gateway
      rules:
      - backendRefs:
        - group: inference.networking.k8s.io
          kind: InferencePool
          name: vllm-llama3-8b-instruct-ga
          weight: 100
    ---
    EOF
    
  2. 执行最终验证。

    将所有流量定向到 v1 堆栈后,验证该堆栈是否按预期处理所有流量。

    1. 确认网关状态为 PROGRAMMED

      kubectl get gateway -o wide
      

      输出应类似于以下内容:

      NAME                CLASS                              ADDRESS           PROGRAMMED   AGE
      inference-gateway   gke-l7-regional-external-managed   <IP_ADDRESS>   True                     10m
      
    2. 通过发送请求来验证端点:

      IP=$(kubectl get gateway/inference-gateway -o jsonpath='{.status.addresses[0].value}')
      PORT=80
      curl -i ${IP}:${PORT}/v1/completions -H 'Content-Type: application/json' -d '{
      "model": "YOUR_MODEL,
      "prompt": YOUR_PROMPT,
      "max_tokens": 100,
      "temperature": 0
      }'
      
    3. 确保您收到包含 200 响应代码的成功响应。

  3. 清理 v1alpha2 资源。

    确认 v1 堆栈完全正常运行后,安全地移除旧的 v1alpha2 资源。

  4. 检查是否还剩有 v1alpha2 资源。

    现在,您已迁移到 v1 InferencePool API,可以安全地删除旧的 CRD。检查是否存在现有的 v1alpha2 API,确保您不再使用任何 v1alpha2 资源。如果您仍有部分数据未迁移,可以继续迁移这些数据。

  5. 删除 v1alpha2 CRD。

    删除所有 v1alpha2 自定义资源后,从集群中移除自定义资源定义 (CRD):

    kubectl delete -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/v0.3.0/manifests.yaml
    

    完成所有步骤后,您的基础架构应类似于下图:

    根据模型名称和优先级将请求路由到不同的模型
    图: GKE 推理网关根据模型名称和优先级将请求路由到不同的生成式 AI 模型

后续步骤