跳转至

云可移植性

KanjiIQ的Kubernetes清单在云提供商之间大约90%可移植。本页详细介绍了迁移到AWS和GCP的路径,说明哪些保持不变,哪些需要更改。

通用不变部分

这些资源在任何CNCF兼容的Kubernetes集群上运行方式完全相同:

  • Deployments:Pod规格、容器定义、资源限制、健康探针
  • Services:ClusterIP服务、端口映射、选择器
  • Secrets:使用stringData的Opaque密钥
  • PersistentVolumeClaims:存储请求(云供应器处理其余部分)
  • Namespaces:隔离边界
  • Docker镜像:符合OCI标准,在任何容器运行时上运行

迁移到AWS (EKS)

架构映射

graph TB
    subgraph Current["Current: Hetzner k3s"]
        A1[k3s] --> A2[Traefik]
        A1 --> A3[PostgreSQL on k8s]
        A1 --> A4[Forgejo Registry]
        A1 --> A5[cert-manager]
    end

    subgraph AWS["Target: AWS EKS"]
        B1[EKS] --> B2[ALB Ingress Controller<br/>or Traefik]
        B1 --> B3[RDS PostgreSQL]
        B1 --> B4[ECR]
        B1 --> B5[ACM<br/>or cert-manager]
    end

    Current -.->|Migration| AWS

逐组件对比

当前 AWS等效方案 所需更改
k3s EKS 集群配置(eksctl/Terraform)
Traefik ALB Ingress Controller或保留Traefik Ingress注解更改
k8s上的PostgreSQL RDS 更新DATABASE_URL Secret;移除PG清单
Forgejo Registry ECR 更新Deployments中的镜像URL;更新CI/CD
cert-manager ACM 将cert-manager注解替换为ACM ARN
Forgejo Actions GitHub ActionsCodePipeline 重写工作流文件
本地PV EBS (gp3) PVC按原样工作;EKS自动供应EBS

清单更改

Ingress(如切换到ALB):

# Before (Traefik)
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
spec:
  ingressClassName: traefik

# After (AWS ALB)
metadata:
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:...
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
spec:
  ingressClassName: alb

数据库(切换到RDS):

# Update the secret with RDS endpoint
stringData:
  database-url: "postgresql://user:[email protected]:5432/jlpt_flashcard"

然后删除02-postgres-pvc.yaml03-postgres-deployment.yaml——RDS处理一切。

预估工作量

  • 集群搭建:1-2天(EKS + 网络配置)
  • 清单适配:1天(ingress、secrets、镜像URL)
  • CI/CD重写:1天(GitHub Actions或CodePipeline)
  • 数据迁移:1天(pg_dump → RDS导入)
  • DNS切换:1小时
  • 总计:约4-5天

迁移到GCP (GKE)

组件映射

当前 GCP等效方案 所需更改
k3s GKE 集群配置(gcloud/Terraform)
Traefik GKE Ingress或保留Traefik Ingress注解更改
k8s上的PostgreSQL Cloud SQL 更新DATABASE_URL;移除PG清单
Forgejo Registry Artifact Registry 更新镜像URL
cert-manager Google托管证书或保留cert-manager 注解更改
Forgejo Actions Cloud Build或GitHub Actions 重写流水线
本地PV Persistent Disk PVC按原样工作

清单更改

Ingress(GKE原生):

metadata:
  annotations:
    networking.gke.io/managed-certificates: kanjiiq-cert
spec:
  ingressClassName: gce

预估工作量

  • 集群搭建:1-2天
  • 清单适配:1天
  • CI/CD重写:1天
  • 数据迁移:1天
  • 总计:约4-5天

多云策略

对于需要多云部署的组织:

保持可移植性

  1. 保留Traefik而非云原生ingress(在EKS、GKE、AKS上运行方式完全相同)
  2. 保留cert-manager而非ACM/Google证书(云无关的TLS)
  3. 保留k8s上的PostgreSQL以避免供应商锁定(代价是更多运维负担)
  4. 使用云无关的仓库如Harbor(自托管,适用于任何k8s)

接受云服务

为了简化运维,可以拥抱各云的托管服务:

  • 数据库:RDS (AWS) / Cloud SQL (GCP)——显著减少运维负担
  • 仓库:ECR (AWS) / Artifact Registry (GCP)——与IAM紧密集成
  • TLS:ACM (AWS) / 托管证书 (GCP)——零维护的证书

正确的选择取决于您是优先考虑可移植性(保持云无关)还是运维简洁性(使用托管服务)。