将 Istio ServiceEntry 迁移到 Compute Engine 虚拟机的 GCPBackend

本页介绍了如何从 ServiceEntry 迁移到 GCPBackend,并演示了 Istio 的流量管理功能如何确保顺利安全地完成迁移。

迁移到 GCPBackend 可带来以下优势:

  1. 端点发现 - 添加或移除虚拟机实例时,后端服务中的虚拟机端点会自动更新。
  2. 集中式健康检查 - 系统会对虚拟机端点进行健康检查,并自动将流量从健康状况不佳的后端转移到健康状况良好的后端。
  3. 全球负载均衡和高级负载均衡算法 - 虚拟机端点可部署在多个区域。使用我们的负载均衡算法配置这些区域中的负载均衡行为。如需了解详情,请参阅 https://cloud.google.com/service-mesh/docs/service-routing/advanced-load-balancing-overview 和 https://cloud.google.com/service-mesh/docs/service-routing/advanced-load-balancing-overview。
  4. 无缝迁移:利用流量拆分和镜像功能,在不中断应用的情况下安全地迁移流量。
  5. 增强的易管理性:受益于简化后的配置和管理。

准备工作

以下部分假定您已完成以下操作:

  1. 已启用 Cloud Service Mesh 的 GKE 集群
  2. Istio 服务条目。
  3. Compute Engine 虚拟机配置了 GCPBackend 资源。

创建或修改现有 VirtualService,将 ServiceEntry 和 GCPBackend 都添加为目的地

您可以使用流量拆分功能,将流量从 ServiceEntry 逐步转移到 GCPBackend。您应先将一小部分流量定向到 GCPBackend,然后逐步增加,同时监控是否存在任何问题。

以下示例介绍了如何将 10% 的请求迁移到 GCPBackend。

cat <<EOF > virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: gcpbackend-migration
  namespace: NAMESPACE
spec:
  hosts:
  - service-entry.com
  http:
  - route:
    - destination:
        host: gcpbackend.com
      weight: 10 # 10% traffic to gcp backend.
    - destination:
        host: service-entry.com
      weight: 90 # 90% traffic to service entry
EOF
kubectl apply -f virtual-service.yaml

其中:

  • NAMESPACE 是命名空间名称。

在此示例中:

  • VIRTUAL_SERVICEgcpbackend-migration
  • SERVICE_ENTRY_HOSTNAMEservice-entry.com
  • GCP_BACKEND_HOSTNAMEgcpbackend.com

(可选)配置 VirtualService 以实现流量镜像

为了进一步确保顺利过渡,您可以配置流量镜像,将流量的副本发送到 GCPBackend,同时仍主要将流量定向到 ServiceEntry。这样,您就可以在不影响主要流量流的情况下测试和验证 GCPBackend 配置。如需了解详情,请参阅 Istio Virtual Service API

验证功能

请参阅应用日志或 Cloud Service Mesh 指标,检查对 $SERVICE_ENTRY_HOSTNAME 的请求错误率。应该没有任何错误。

如需在应用之外进行测试,您可以部署 curl 客户端。如果请求是使用 GCPBackend API 进行路由的,则无需向请求明确附加 IAM 令牌,因为 Cloud Service Mesh 会自动附加该令牌。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: testcurl
  namespace: default
spec:
  containers:
  - name: curl
    image: curlimages/curl
    command: ["sleep", "3000"]
EOF

kubectl exec testcurl -c curl -- curl "$SERVICE_ENTRY_HOSTNAME"

输出应为有效的 HTTP 200 响应。