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 的滚动更新和回滚机制实现无缝升级与回退。

相关推荐
维尔切4 小时前
Linux中DHCP配置指南指南(配实验步骤与注释)
linux·运维·服务器
G_H_S_3_7 小时前
【网络运维】Linux:LNMP 项目实践
linux·运维·服务器·网络
wdfk_prog9 小时前
[Linux]学习笔记系列 -- [arm][lds]
linux·运维·arm开发·笔记·学习
CAE虚拟与现实10 小时前
调度系统部署架构是什么样的呢?
linux·运维·服务器·架构·集群队列·计算节点
Fanmeang11 小时前
MPLS LDP概述
运维·网络·华为·路由·mpls·标签·ldp
小孙姐11 小时前
Linux-Day14.自动批量装机
linux·运维·服务器
卡比巴拉—林12 小时前
企业高性能 Web 服务部署实践(基于 RHEL 9)
运维·服务器
IvanCodes14 小时前
十二、Linux Shell脚本:正则表达式
linux·运维·正则表达式
拾心2115 小时前
【运维进阶】LAMPLNMP 最佳实践
运维
CodeDevMaster16 小时前
Linux中tmux入门使用指南:告别SSH断线烦恼,提升终端工作效率的神器
linux·运维·ssh