K8S高可用Web应用部署方案

以下是基于 Kubernetes 的高可用 Web 应用部署方案,满足多副本、跨可用区容灾、HTTPS 配置以及滚动更新和回滚的需求:


一、架构设计

  1. 多副本 + 跨可用区容灾

    • 使用 Kubernetes 的 Deployment 部署多副本应用,并通过 Pod 反亲和性 将 Pod 分散到不同可用区。

    • 使用 Cluster Autoscaler 自动扩缩节点,确保资源充足。

  2. 通过 Ingress 暴露服务并配置 HTTPS

    • 使用 Ingress Controller (如 Nginx Ingress)暴露服务,并通过 Cert-Manager 自动管理 TLS 证书。
  3. 滚动更新和回滚机制

    • 使用 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

三、验证与测试

  1. 验证多副本与跨可用区容灾

    • 查看 Pod 分布:

      复制代码
      kubectl get pods -o wide
    • 确认 Pod 分散到不同可用区。

  2. 验证 HTTPS 配置

    • 访问 https://my-web-app.example.com,确认证书有效且服务正常。
  3. 验证滚动更新与回滚

    • 更新镜像版本,观察 Pod 替换过程。

    • 执行回滚,确认应用恢复到旧版本。


四、总结

通过以上方案,可以实现高可用的 Web 应用部署,满足多副本、跨可用区容灾、HTTPS 配置以及滚动更新和回滚的需求。关键点包括:

  • 使用 Deployment 和 Pod 反亲和性实现多副本与跨可用区容灾。

  • 使用 Ingress 和 Cert-Manager 配置 HTTPS。

  • 利用 Deployment 的滚动更新和回滚机制实现无缝升级与回退。

相关推荐
fanxiaohui1213813 分钟前
元脑服务器的创新应用:浪潮信息引领AI计算新时代
运维·服务器·人工智能
亦世凡华、1 小时前
快速部署:在虚拟机上安装 CentOS 7 的详细步骤
linux·运维·经验分享·centos·安装教程
星图辛某人2 小时前
《Linux命令行和shell脚本编程大全》第四章阅读笔记
linux·运维·笔记
梦游钓鱼4 小时前
在window终端创建docker容器的问题
运维·docker·容器
孤寂大仙v4 小时前
【Linux笔记】理解文件系统(上)
linux·运维·笔记
winyh54 小时前
Vite 打包后Nginx部署配置
运维·nginx
运维小贺5 小时前
Nginx常用的模块
运维·nginx·正则表达式
努力学习的小廉5 小时前
深入了解Linux —— 调试程序
linux·运维·服务器