云可移植性¶
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 Actions或CodePipeline | 重写工作流文件 |
| 本地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.yaml和03-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天
多云策略¶
对于需要多云部署的组织:
保持可移植性¶
- 保留Traefik而非云原生ingress(在EKS、GKE、AKS上运行方式完全相同)
- 保留cert-manager而非ACM/Google证书(云无关的TLS)
- 保留k8s上的PostgreSQL以避免供应商锁定(代价是更多运维负担)
- 使用云无关的仓库如Harbor(自托管,适用于任何k8s)
接受云服务¶
为了简化运维,可以拥抱各云的托管服务:
- 数据库:RDS (AWS) / Cloud SQL (GCP)——显著减少运维负担
- 仓库:ECR (AWS) / Artifact Registry (GCP)——与IAM紧密集成
- TLS:ACM (AWS) / 托管证书 (GCP)——零维护的证书
正确的选择取决于您是优先考虑可移植性(保持云无关)还是运维简洁性(使用托管服务)。