K8S高可用Web应用部署方案
目录
K8S高可用Web应用部署方案
以下是基于 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 的滚动更新和回滚机制实现无缝升级与回退。