把 EKS 迁移到 GKE 做成可审计流水线:AI 翻译、确定性校验与 GitOps 审批

2026-09-25 34 预计阅读时间: 1 分钟
来源: cloud.google.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:11 分钟

把 Kubernetes 工作负载从 AWS EKS 迁移到 Google Kubernetes Engine(GKE),难点从来不只是把 YAML 中的字段换个名字。身份、网络入口、镜像仓库、节点供给和有状态数据都带有云平台语义;如果直接让通用大模型批量改写 Terraform 和清单,得到的配置往往“看起来合理”,却可能包含不存在的属性、过期 API,或者悄悄漏掉关键安全规则。

GKE agentic migration 的价值在于把 AI 放进一条受约束的迁移流水线:模型负责需要推理的翻译工作,确定性工具负责精确映射和离线验证,所有结果通过 Pull Request 进入现有 GitOps 审批流程,而不是直接修改生产集群。

AI 可以写代码,但不能独自决定目标状态

这套方法将迁移视为一次“编译”,而不是一次聊天:

  1. 扫描 EKS 代码仓库或现有集群,建立资源清单和依赖关系。
  2. 识别架构不兼容项,为阻塞问题分配负责人和解决日期。
  3. 明确 GKE 落地区设计,例如 Autopilot 或 Standard、网络边界和组织策略。
  4. 由 AI 生成 Terraform、Kubernetes 清单和迁移说明。
  5. 对身份、镜像地址等精确映射执行确定性转换。
  6. 离线运行 Terraform 和清单验证。
  7. 生成 Pull Request,等待人工审查和 CI/CD 放行。

这里的关键不是模型能力有多强,而是模型没有绕过治理的路径。迁移状态被持久化后,平台团队可以先建立 landing zone,应用团队再从各自的工作区迁移服务;长期迁移不会因为换人、换机器或一次对话结束而丢失上下文。

云资源不是简单的一对一替换

一些转换有明确方向,但仍需要平台决策。

IRSA 到 Workload Identity

EKS ServiceAccount 可能通过 IRSA 关联 IAM Role:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: orders-api
  namespace: orders
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/orders-api

迁移到 GKE 后,可以将其改为指向 Google Cloud 服务账号。运行前应替换项目 ID 和服务账号名称:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: orders-api
  namespace: orders
  annotations:
    iam.gke.io/gcp-service-account: orders-api@PROJECT_ID.iam.gserviceaccount.com

这只是 Kubernetes 侧配置。还必须在 Google Cloud IAM 中授予相应身份绑定和最小权限角色。一个安全的迁移器不能仅替换注解,然后假定授权已经完成;它应同时生成 Terraform 变更或明确的待办项。

ALB、Karpenter 与镜像仓库

其他映射更像架构重设计:

  • AWS Load Balancer Controller 管理的 ALB Ingress,可以迁移到 GKE Gateway API,但监听器、健康检查、证书和安全策略并不保证一一对应。
  • Karpenter NodeClaim 可以映射到 GKE Node Auto Provisioning,或在需要明确硬件约束时使用 Custom Compute Classes。
  • ECR 镜像地址可以迁移到 Artifact Registry,但镜像复制、摘要核验和部署身份授权必须单独处理。
  • GPU 节点迁移需要重新检查机型可用区、驱动、配额和切分策略,不能只转换资源 requests。

因此,AI 适合提出目标配置草案,确定性规则适合处理可证明的映射,而平台工程师必须批准那些涉及成本、可靠性和安全边界的选择。

可以这样实践:在仓库里建立迁移状态和离线门禁

下面是一个可改造的最小目录。它不是该插件的固定目录约定,而是展示如何把迁移状态、生成结果和验证脚本放进同一 GitOps 仓库:

migration/
├── migration-state.yaml
├── source-eks/
├── target-gke/
│   ├── terraform/
│   └── kubernetes/
└── scripts/
    └── preflight.sh

用结构化文件记录边界、阻塞项和审批状态,避免关键决定只留在聊天记录中:

migrationId: orders-prod
phase: assessment
source:
  platform: eks
  region: us-east-1
target:
  platform: gke
  projectId: replace-me
  region: us-central1
  mode: standard
blockers:
  - id: NET-001
    description: Confirm private egress and NAT design
    owner: platform-team
    targetDate: "2026-04-15"
    status: open
  - id: DATA-001
    description: Select an approved database migration method
    owner: data-team
    targetDate: "2026-04-22"
    status: open
approvals:
  platformBoundary: pending
  applicationTranslation: pending

然后在 scripts/preflight.sh 中设置离线验证。运行前需要安装 terraform 和 kubectl,并把目录改成自己的仓库结构:

#!/usr/bin/env bash
set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TF_DIR="$ROOT/target-gke/terraform"
K8S_DIR="$ROOT/target-gke/kubernetes"

command -v terraform >/dev/null || {
  echo "terraform is required" >&2
  exit 1
}
command -v kubectl >/dev/null || {
  echo "kubectl is required" >&2
  exit 1
}

echo "==> Checking Terraform formatting"
terraform -chdir="$TF_DIR" fmt -check -recursive

echo "==> Initializing without a remote backend"
terraform -chdir="$TF_DIR" init -backend=false -input=false

echo "==> Validating Terraform"
terraform -chdir="$TF_DIR" validate

echo "==> Parsing Kubernetes manifests without applying them"
while IFS= read -r -d '' file; do
  echo "Checking $file"
  kubectl apply --dry-run=client --validate=false -f "$file" >/dev/null
done < <(find "$K8S_DIR" -type f \( -name '*.yaml' -o -name '*.yml' \) -print0)

echo "Preflight checks passed"

执行方式:

chmod +x migration/scripts/preflight.sh
./migration/scripts/preflight.sh

kubectl --dry-run=client --validate=false 只能发现 YAML 解析和部分对象结构问题,不能替代服务端准入控制、CRD Schema、策略引擎或真实集群测试。生产流水线还应加入固定版本的 Schema 校验器、组织策略检查、安全扫描以及 Terraform plan 审批。

为什么必须通过 Pull Request 交付

迁移工具直接调用集群 API 看似省事,却会制造新的事实来源:Git 里是一套配置,集群里是另一套配置,回滚时也难以确认哪些资源是人工修改、脚本修改还是控制器生成。

PR 工作流保留了几个重要属性:

  • 每次转换都有可读差异和提交记录。
  • CODEOWNERS 可以让网络、IAM 和应用团队分别审批自己的边界。
  • CI 可以重复执行相同验证,而不是依赖操作者本地环境。
  • 合并和部署相互分离,可以使用既有的发布窗口和回滚机制。
  • AI 生成内容与人工修改都进入同一审计链。

人工审批不应只是点击“Approve”。审查者至少要核对身份权限是否扩大、网络是否意外暴露、存储类和可用区语义是否改变,以及扩缩容策略是否会造成成本突增。

数据迁移要与配置翻译分开

基础设施翻译和数据搬运的风险模型不同。迁移插件可以为数据库、对象存储和持久卷生成上下文相关的 runbook,但不应擅自传输生产数据。

实际执行时,可以让配置 PR 创建目标数据库连接、Secret 引用和网络路径,再由数据团队使用具备 SLA、校验和重试能力的专用服务完成传输。例如数据库可以评估 Database Migration Service,对象数据可以评估 Storage Transfer Service。切换前还要定义停写窗口、增量同步、校验方法和回退条件。

落地前的检查清单

采用 AI 辅助迁移时,建议坚持以下边界:

  • Git 是目标配置的唯一事实来源,工具不得绕过 PR 直接变更集群。
  • 所有阻塞项必须有负责人、截止日期和明确状态。
  • AI 输出必须通过 Terraform、Kubernetes Schema、策略和安全扫描。
  • IRSA、Ingress、节点供给和 GPU 配置按架构变更审查,不按字符串替换审查。
  • 平台团队与应用团队使用隔离目录和独立审批边界。
  • 数据传输使用专用服务,并单独设计一致性验证与回滚。
  • Autopilot、Standard、NAP 或 CCC 等决策应记录依据,而不是由模型默认选择。

这类插件并没有消除迁移复杂度,而是把复杂度变成可见的状态、可执行的验证和可审计的决策。AI 缩短编写与分析时间;确定性工具、GitOps 和人工审批则负责让速度不会以生产风险为代价。


相关推荐