云原生概览¶
KanjiIQ遵循云原生原则设计,可在任何符合Kubernetes标准的平台上移植。应用使用标准Kubernetes API,不包含任何专有云提供商扩展。
十二要素应用对齐¶
| 要素 | KanjiIQ实现 |
|---|---|
| I. 代码库 | 单一Git仓库(Forgejo),纳入版本控制 |
| II. 依赖 | 在pubspec.yaml(Dart)和requirements-docs.txt(Python)中显式声明 |
| III. 配置 | 通过Kubernetes Secrets和ConfigMaps注入的环境变量 |
| IV. 后端服务 | PostgreSQL通过DATABASE_URL访问——无需代码更改即可替换 |
| V. 构建、发布、运行 | 多阶段Docker构建 → 标记镜像 → Kubernetes滚动更新 |
| VI. 进程 | 无状态应用容器;状态存储在PostgreSQL中 |
| VII. 端口绑定 | 服务自包含:前端:80,后端:8080 |
| VIII. 并发 | 通过Kubernetes副本实现水平扩展 |
| IX. 易处理 | 快速启动、优雅关闭、健康探针 |
| X. 开发/生产等价 | 预发布命名空间镜像生产清单 |
| XI. 日志 | 标准输出/标准错误(Kubernetes捕获到节点文件系统) |
| XII. 管理进程 | 数据库迁移作为一次性命令运行 |
是什么让KanjiIQ成为云原生?¶
仅使用标准Kubernetes API¶
所有资源使用标准的apps/v1、v1和networking.k8s.io/v1 API组:
Deployment(非云特定的托管服务)Service(ClusterIP——在任何地方都适用)Ingress(标准网络API)PersistentVolumeClaim(云无关的存储请求)Secret(标准配置管理)
唯一的非标准CRD是Traefik Middlewares——可以在任何平台上用等效的Ingress控制器功能替代。
全面容器化¶
每个组件都有生产就绪的Dockerfile:
| 组件 | Dockerfile | 基础镜像 |
|---|---|---|
| 前端 | Dockerfile.frontend |
nginx:alpine |
| 后端 | Dockerfile.backend |
dart:stable |
| 文档 | Dockerfile.docs |
nginx:alpine |
所有镜像:
- 使用多阶段构建(小体积生产镜像)
- 以非root用户运行(UID 1000)
- 包含健康检查
- 推送到容器仓库(可移植到任何仓库)
基础设施即代码¶
100%的基础设施定义在版本控制的YAML中:
k8s/
├── 00-namespace.yaml
├── 01-secrets.yaml (template)
├── 02-postgres-pvc.yaml
├── 03-postgres-deployment.yaml
├── 05-deployment.yaml
├── 06-service.yaml
├── 07-ingress.yaml
├── 08-security-middlewares.yaml
└── ...
从零开始重建整个环境只需要:
可移植性评估¶
| 组件 | 可移植性 | 备注 |
|---|---|---|
| 应用Deployments | 完全可移植 | 标准k8s清单 |
| Services | 完全可移植 | ClusterIP在任何地方都适用 |
| Ingress | 大部分可移植 | 可能需要更改ingress class |
| PVC | 完全可移植 | 云提供商自动供应存储 |
| Secrets | 完全可移植 | 所有云上API相同 |
| Traefik Middlewares | 需要适配 | 替换为云原生替代方案 |
| 容器镜像 | 完全可移植 | 推送到任何OCI仓库 |
| CI/CD | 需要适配 | Forgejo Actions → GitHub Actions / Cloud Build |
详见可移植性了解迁移到AWS和GCP的详细指南。