Ninazu00/aks-cloud-resume

GitHub: Ninazu00/aks-cloud-resume

一个部署在Azure Kubernetes Service上的全栈简历网站,展示云原生应用部署、有状态工作负载管理和安全最佳实践。

Stars: 0 | Forks: 0

# 云简历 — AKS 部署 一个部署在 Azure Kubernetes Service 上的全栈简历网站,作为云/云安全作品集项目构建。在线访问地址 [mohamedayman.work](https://mohamedayman.work)。 ## 架构 ``` Internet → Azure Load Balancer → NGINX Ingress (TLS) → Backend Service (ClusterIP) │ Node.js Deployment (3 pods) │ PostgreSQL Service (Headless) │ PostgreSQL StatefulSet │ PersistentVolumeClaim (1Gi) ``` | 层级 | 技术 | |---|---| | 前端 (Frontend) | HTML, CSS, JavaScript | | 后端 (Backend) | Node.js, Express | | 数据库 (Database) | PostgreSQL 16 (StatefulSet) | | 编排 (Orchestration) | Kubernetes (AKS) | | Ingress | NGINX Ingress Controller | | TLS | cert-manager + Let's Encrypt | | Registry | Azure Container Registry | ## 功能特性 - **访客计数器** — 将每次访问记录到 PostgreSQL 并显示实时计数 - **速率限制** — 通过 `express-rate-limit` 对 `/api/visit` 实施基于 IP 的速率限制 - **HTTPS** — 由 cert-manager 自动配置和续订 TLS - **3 个后端副本** — 在 NGINX ingress 后端进行负载均衡 - **就绪探针 (Readiness probes)** — 流量仅路由到已连接数据库的 Pod ## 关键设计决策 **自管 PostgreSQL 而非托管服务** — 主动选择使用 StatefulSets 和 PersistentVolumeClaims 来展示有状态工作负载的管理能力,而不是外包给 Azure Database 或 CosmosDB。 **PostgreSQL 使用 Headless Service** — 使用 `clusterIP: None` 为每个 Pod 提供稳定的 DNS 条目 (`postgres-0.postgres.resume.svc.cluster.local`),这是 StatefulSets 的正确模式。 **Secrets 绝不提交** — `k8s/secret.yaml` 和 `.env` 已被 gitignore。未来的生产路径是通过 Secrets Store CSI Driver 使用 Azure Key Vault。 **ConfigMap 从源码生成** — postgres init ConfigMap 通过 `kubectl create configmap --from-file` 直接从 `db/init.sql` 生成,保持 SQL 文件作为单一事实来源。 ## 项目结构 ``` cloud-aks-resume/ ├── backend/ │ ├── server.js # Express API + static file serving │ ├── package.json │ └── Dockerfile ├── frontend/ │ ├── index.html │ └── js/main.js # Calls /api/visit, falls back to /api/visits if rate limited ├── db/ │ └── init.sql ├── k8s/ │ ├── namespace.yaml │ ├── secret.yaml # Gitignored — not committed │ ├── configmap.yaml # Generated from db/init.sql │ ├── postgres-statefulset.yaml │ ├── postgres-service.yaml │ ├── backend-deployment.yaml │ ├── backend-service.yaml │ ├── clusterissuer.yaml │ └── ingress.yaml └── docker-compose.yaml ``` ## 本地开发 ``` cp .env.example .env docker compose up --build # 可通过 http://localhost:3001 访问 ``` ## Minikube ``` minikube start minikube addons enable ingress minikube docker-env --shell powershell | Invoke-Expression docker build -t resume-backend:latest . kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/secret.yaml kubectl create configmap postgres-init \ --from-file=init.sql=./db/init.sql \ --namespace=resume \ --dry-run=client -o yaml > k8s/configmap.yaml kubectl apply -f k8s/configmap.yaml kubectl apply -f k8s/postgres-statefulset.yaml kubectl apply -f k8s/postgres-service.yaml kubectl apply -f k8s/backend-deployment.yaml kubectl apply -f k8s/backend-service.yaml kubectl apply -f k8s/ingress.yaml minikube tunnel # 可通过 http://127.0.0.1 访问 ``` ## AKS ``` az group create --name resume-rg --location az aks create --resource-group resume-rg --name resume-aks \ --node-count 1 --node-vm-size Standard_B2s_v2 --generate-ssh-keys az aks get-credentials --resource-group resume-rg --name resume-aks az acr create --resource-group resume-rg --name --sku Basic az acr login --name docker build -t .azurecr.io/resume-backend:latest . docker push .azurecr.io/resume-backend:latest kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml kubectl apply -f k8s/ ``` ## 安全性 - 凭证存储在 Kubernetes Secrets 中,已被 gitignore,绝不硬编码 - 非根容器 (Dockerfile 中的 `USER node`) - 使用 `npm ci` 进行确定性的锁定依赖安装 - 对写入端点实施速率限制 - 在 ingress 层强制执行 HTTP → HTTPS 重定向 ## 路线图 - [ ] GitHub Actions CI/CD 与 OIDC (无存储凭证) - [ ] 通过 Secrets Store CSI Driver 使用 Azure Key Vault - [ ] Kubernetes NetworkPolicies - [ ] Ingress 级别的速率限制作为纵深防御层
标签:ACR, AKS, Azure, Azure Container Registry, Azure Kubernetes Service, Azure 负载均衡器, cert-manager, Docker, Express, GNU通用公共许可证, Headless Service, HTTPS, Let's Encrypt, MITM代理, Nginx Ingress, Node.js, PostgreSQL, PVC, Rate Limiting, StatefulSet, 个人作品集, 全栈项目, 子域名突变, 安全防御评估, 容器编排, 持久化存储, 有状态副本集, 测试用例, 简历网站, 访问计数器, 请求拦截, 限流, 高可用性