以下是基于 Kubernetes 的高可用 Web 应用部署方案,满足多副本、跨可用区容灾、HTTPS 配置以及滚动更新和回滚的需求:
一、架构设计
-
多副本 + 跨可用区容灾
-
使用 Kubernetes 的 Deployment 部署多副本应用,并通过 Pod 反亲和性 将 Pod 分散到不同可用区。
-
使用 Cluster Autoscaler 自动扩缩节点,确保资源充足。
-
-
通过 Ingress 暴露服务并配置 HTTPS
- 使用 Ingress Controller (如 Nginx Ingress)暴露服务,并通过 Cert-Manager 自动管理 TLS 证书。
-
滚动更新和回滚机制
-
使用 Deployment 的滚动更新策略,逐步替换旧版本 Pod。
-
通过
kubectl rollout
命令实现版本回滚。
-
二、详细实现步骤
1. 多副本 + 跨可用区容灾
1.1 创建 Deployment
-
使用以下 YAML 文件创建 Deployment,部署 3 个副本:
apiVersion: apps/v1 kind: Deployment metadata: name: web-app namespace: default spec: replicas: 3 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web-app topologyKey: topology.kubernetes.io/zone containers: - name: web-app image: my-web-app:1.0.0 ports: - containerPort: 80 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "512Mi"
-
关键点:
-
replicas: 3
:部署 3 个副本。 -
podAntiAffinity
:确保 Pod 分散到不同可用区。
-
-
1.2 创建 Service
-
使用以下 YAML 文件创建 Service,暴露 Deployment:
apiVersion: v1 kind: Service metadata: name: web-app namespace: default spec: selector: app: web-app ports: - protocol: TCP port: 80 targetPort: 80
2. 通过 Ingress 暴露服务并配置 HTTPS
2.1 安装 Ingress Controller
-
使用 Helm 安装 Nginx Ingress Controller:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install ingress-nginx ingress-nginx/ingress-nginx
2.2 安装 Cert-Manager
-
使用 Helm 安装 Cert-Manager:
helm repo add jetstack https://charts.jetstack.io helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --set installCRDs=true
2.3 创建 Ingress 资源
-
使用以下 YAML 文件创建 Ingress,配置 HTTPS:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app namespace: default annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - my-web-app.example.com secretName: web-app-tls rules: - host: my-web-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: web-app port: number: 80
-
关键点:
-
tls
:配置 HTTPS,使用 Cert-Manager 自动签发 Let's Encrypt 证书。 -
host
:替换为实际域名。
-
-
3. 实现滚动更新和回滚机制
3.1 滚动更新
-
更新 Deployment 的镜像版本:
kubectl set image deployment/web-app web-app=my-web-app:2.0.0
-
Kubernetes 会自动执行滚动更新,逐步替换旧版本 Pod。
3.2 回滚机制
-
查看 Deployment 的更新历史:
kubectl rollout history deployment/web-app
-
回滚到上一个版本:
kubectl rollout undo deployment/web-app
-
回滚到指定版本:
kubectl rollout undo deployment/web-app --to-revision=2
三、验证与测试
-
验证多副本与跨可用区容灾
-
查看 Pod 分布:
kubectl get pods -o wide
-
确认 Pod 分散到不同可用区。
-
-
验证 HTTPS 配置
- 访问
https://my-web-app.example.com
,确认证书有效且服务正常。
- 访问
-
验证滚动更新与回滚
-
更新镜像版本,观察 Pod 替换过程。
-
执行回滚,确认应用恢复到旧版本。
-
四、总结
通过以上方案,可以实现高可用的 Web 应用部署,满足多副本、跨可用区容灾、HTTPS 配置以及滚动更新和回滚的需求。关键点包括:
-
使用 Deployment 和 Pod 反亲和性实现多副本与跨可用区容灾。
-
使用 Ingress 和 Cert-Manager 配置 HTTPS。
-
利用 Deployment 的滚动更新和回滚机制实现无缝升级与回退。