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, 个人作品集, 全栈项目, 子域名突变, 安全防御评估, 容器编排, 持久化存储, 有状态副本集, 测试用例, 简历网站, 访问计数器, 请求拦截, 限流, 高可用性