zoukankan      html  css  js  c++  java
  • 边开飞机边换引擎?我们造了个新功能保障业务流量无损迁移

    简介: 容器化部署应用可以降低企业成本,提升研发效率,解放运维人员。据 Gartner 预计,到 2022 年,将有 75% 的企业将在生产中运行容器化应用程序。Kubernetes 是企业部署容器化应用的首选框架。由于 Kubernetes 部署及运维的复杂性,越来越多的客户选择将业务从 ECS 或者自建的 Kubernetes 迁移到阿里云托管版 Kubernetes —— ACK 中。但是,如何保证业务流量的平滑迁移成为一大挑战。

    头图.png

    作者 | 顾静(子白)
    来源 | 阿里巴巴云原生公众号

    容器化部署应用可以降低企业成本,提升研发效率,解放运维人员。据 Gartner 预计,到 2022 年,将有 75% 的企业将在生产中运行容器化应用程序。Kubernetes 是企业部署容器化应用的首选框架。由于 Kubernetes 部署及运维的复杂性,越来越多的客户选择将业务从 ECS 或者自建的 Kubernetes 迁移到阿里云托管版 Kubernetes —— ACK 中。但是,如何保证业务流量的平滑迁移成为一大挑战。

    Cloud Controller Manager(CCM)是 ACK 的一个系统核心组件,负责对接 Kubernetes 与云上基础产品如 CLB、VPC、DNS 等。当 Service 的类型设置为 Type=LoadBalancer 时,CCM 会为该 Service 创建或配置阿里云负载均衡 CLB。当 Service 对应的后端 Endpoint 或者集群节点发生变化时,CCM 会自动更新 CLB 的后端虚拟服务器组。此外,CCM 还提供了许多阿里云注解,支持丰富的负载均衡能力。

    近期 CCM 发布了一个新特性——支持在同一个 CLB 后端挂载集群内节点和集群外 ECS,借助这一特性可以解决业务容器化过程中流量平滑迁移的难题。

    场景一:应用容器化改造(流量平滑迁移)

    对于一个 CLB,支持将流量转发至集群内及集群外节点

    1.png

    1)操作步骤

    • 登录 CLB 控制台创建 CLB,记录 CLB ID ("lb-xxxxx")
    • 创建 Service

    设置 service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners 为 false,不管理监听信息。

    CCM 会自动创建对应的虚拟服务器组。

    cat <<EOF |kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxx"
        service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: "false"
      labels:
        app: nignx
      name: my-nginx-svc
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
    EOF
    • 登录 CLB 控制台,创建监听并关联虚拟服务器组
    • 登录 CLB 控制台,手动在虚拟服务器组中添加集群外 ECS 并设置权重

    2)预期结果

    配置完成后,在 CLB 的虚拟服务组里既可以看到集群内的节点,也可以看到集群外的 ECS。集群内应用进行扩缩容时,集群外的 ECS 节点不受影响。

    2.png

    场景二:金丝雀发布

    支持金丝雀发布,将流量按比例转发至集群内及集群外节点

    迁移过程中,往往需要逐步将流量从存量 ECS 迁往 Kubernetes 集群中。CCM 支持通过 annotationservice.beta.kubernetes.io/alicloud-loadbalancer-weight为 Kubernetes 集群配置权重,从而实现流量的逐步迁移。

    3.png

    1)注意事项

    • 不能跨 CLB 复用虚拟服务器组
    • 一个虚拟服务器组只能与一个端口关联
    • 集群内节点权重由 CCM 组件设置,集群外 ECS 权重需要用户手动设置

    2)操作步骤

    • 登录 CLB 控制台创建 CLB、监听及虚拟服务器组,记录 CLB ID ("lb-xxxx") 及虚拟服务器组 Id ("rsp-xxx")
    • 手动在虚拟服务器组中添加集群外 ECS 并设置权重
    • 创建 Service
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alicloud-loadbalancer-id: "lb-xxxxx"
        service.beta.kubernetes.io/alicloud-loadbalancer-vgroup-ids: "80:rsp-xxx"
        # 集群内部权重为20%
        service.beta.kubernetes.io/alicloud-loadbalancer-weight: "20"
      name: nginx-svc
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer

    3)预期结果

    配置完成后,在 CLB 的虚拟服务组里既可以看到集群内的节点,也可以看到集群外的 ECS,集群节点的权重按照 annotation 配置。集群内应用进行扩缩容时,集群外的 ECS 节点不受影响。

    场景三:多集群业务流量多活与灾备

    对于一个 CLB,支持将流量转发至多个 Kubernetes 集群内

    企业用户会采取多种措施以保障应用的高可用性,如创建多个集群进行备份、容灾等。这要求业务流量可以通过一个 CLB 接入多个 Kubernetes 集群中,并且支持为 Kubernetes 集群设置不同的权重,如下图所示。

    4.png

    1)注意事项

    • 不能跨 CLB 复用虚拟服务器组
    • 一个虚拟服务器组只能与一个端口关联
    • 两个集群均已配置 Cluster Id,否则两个集群中的 service 需要不同名称

    2)操作步骤

    • 登录 CLB 控制台创建 CLB、监听及虚拟服务器组,记录 CLB ID ("lb-xxxx")  及虚拟服务器组 Id ("rsp-xxx")
    • 集群 A 中创建 Serivce-A,权重设置为 20%
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alicloud-loadbalancer-id: "lb-xxxxx"
        service.beta.kubernetes.io/alicloud-loadbalancer-vgroup-ids: "80:rsp-xxx"
        service.beta.kubernetes.io/alicloud-loadbalancer-weight: "20"
      name: service-A
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer

    3)预期结果

    配置完成后,在 clb 的虚拟服务组里既可以看到集群 A 内的节点,也可以看到集群 B 的节点。集群节点的权重按照 annotation 自动设置。集群内应用进行扩缩容时,CLB 后端虚拟服务器组会自动更新。

    总结

    出于降本增效的考虑,越来越多的企业采用容器化方式部署应用。在业务迁移过程中,如何保障业务流量不受损成为一大难题。对于电商类应用而言,业务流量下跌往往会导致交易量下跌,造成重大损失。游戏类应用对业务流量也十分敏感,短暂的流量中断都会明显地影响游戏用户体验;交通类应用的流量下跌会影响交通流量管制、交通故障排险效率。保障业务流量不受损是保障用户业务正常运转的底线。

    CCM 发布的支持在同一个 CLB 后端挂载集群内节点和集群外 ECS 的功能,可以一举解决迁移过程中流量中断的难题。同时,还支持将业务流量转发至多个 Kubernetes 集群内,支撑备份、容灾等需求,保障业务高可用。

    原文链接

    本文为阿里云原创内容,未经允许不得转载。

  • 相关阅读:
    《CLR Via C# 第3版》笔记之(十四) 泛型高级
    《CLR Via C# 第3版》笔记之(十三) 泛型基础
    AOP学习基于Emit和Attribute的简单AOP实现
    《CLR Via C# 第3版》笔记之(十五) 接口
    C# 连接Oracle(利用ODP.net,不安装oracle客户端)
    《CLR Via C# 第3版》笔记之(十七) 线程基础
    C#直接读取磁盘文件(类似linux的Direct IO模式)
    《CLR Via C# 第3版》笔记之(十六) 字符串
    [置顶] C#中通过调用webService获取上网IP地址的区域的方法
    Android中Socket通讯类
  • 原文地址:https://www.cnblogs.com/yunqishequ/p/14717308.html
Copyright © 2011-2022 走看看