DataWorks 微服务集群的 Service Mesh 落地实践

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介:

初心

DataWorks 是集团内外广泛使用的全域智能大数据平台,包含了 DataStudio、StreamStudio、HoloStudio、AppStudio、GraphStudio、PAIStudio、WebExcel 等众多的线上产品,每个产品都是类似于 IDE 形态的富交互单页应用。

101

但是,DataWorks 服务于集团各大业务线上万名数据开发者和数据生态的参与者,这艘巨大的航母却不能准确地表达每一个用户的述求,「众口难调」。

因此,DataWorks 在架构升级的关键节点,决心将插件化、服务化定制的能力彻底落地,解开过重的业务共建模式在研发上的耦合羁绊,向更轻量的更开放的平台化迈进,不忘服务初心,帮助我们内外客户的业务定制快速落地。

那么如何开放 DataWorks 的定制化能力?

我们建立了一整套完整的微服务研发管控体系, DataWorks 微服务平台(DMSP:DataWorks MicroService Platform),以满足业务开发者定制服务化需求,帮助业务整合DataWorks输出的中台能力,重新定义属于自己的业务数据研发平台。

轻车快马

轻装上阵,是对用户(开发者、业务方)而言的。要做到用户的轻,作为平台方,我们就要做得更多。

对于业务而言,最轻量的,就是「只需要关注业务逻辑」。

即,业务开发者仅仅专注在业务逻辑上,而不需要再自己关注 入流量 的安全认证、路由、负载均衡、镜像、限流;出流量 的超时、重试、访问控制;服务间调用的隔离策略、熔断、分布式追踪等与业务逻辑无关的内容。

过去,微服务生态周边发展出了大量组件、框架,帮助我们很好地解决上述的业务以外的问题。但是这些组件框架门槛高、维护成本高、开发语言耦合,对于大多数开发者而言,成本太高,不适用于有敏捷开发需求的新兴业务。

近年来火热的服务网格(Service Mesh)技术,正能够解开这一困局。参见《Service Mesh 入门》。

微服务集群能力

DMSP 是一套基于 Kubernetes 集群的微服务运行平台。我们在K8S的基础上,基于 Operator 开发打造了一个完整的微服务生命周期管理体系。

整体上, DMSP 分成几个领域的能力来增强微服务:
9D9A2F5C_EDBE_4768_9ACD_DF8697E2B139

DMSP Service Mesh 架构

基于上述集群能力的要求,我们将 Istio 的 Service Mesh 能力落地。整体架构如下:

102

下层 SOA 服务包括了 DataWorks 已有的许多重量级服务,包括租户、数据开发、AI平台等。

DMS Console 是微服务管控台,它是微服务开发者与服务集群之间的管控交互唯一路径,负责管控所有(包括阿里巴巴内部、阿里云公有云 22 个 Region )的集群,前面提到的部署、流量控制与灰度、动态的安全策略、服务治理(日志&监控&报警)等能力都会在这里承上启下。

管控台与集群控制平面 Control Plane 之间的交互,完全基于 K8s ApiServer,通过抽象的一层 CRD 进行交互,再由特定的 Operator 基于 CRD 执行管控逻辑。透过对 Istio 的管控,基于服务 Sidecar 达到对服务能力的延展。业务服务就像插上了翅膀,无缝地获得了集群赋予的能力,用最小的开发成本,享受最多的最健全的微服务能力。

Why Operator and CRD?

扩展 K8s 的最佳实践,是以 Operator + CRD 的方式来实现扩展。

基于 Kubernetes 的 Operator ,将服务部署和 Service Mesh 控制层面的工作直接前移到集群上,降低原本需要多集群多配置需求中心部署管控的复杂度:
103

最终一致性保证

管控操作的可靠性强,能够保证最终一致性,依靠两个优势:

1、Operator 框架基于 K8s 的 Event&Watch 机制( Reconcile Cycle ),事件触发通过多发+幂等保证最终一致性。(而实际上幂等性不需要开发者过分关注,因为有下面第二个优势)。

2、 K8s Resource CRUD 的 Generation 机制能保证 CRD 操作的原子性

基于这两个优势,开发 Operator 时只需要专注于最终结果是什么,在任何情况下都往最终你想要的结果推进即可。

业务逻辑边界清晰
利用 Kubernates Operator 操作自定义的一套 CRD ,业务逻辑配置的复杂度降低了,将每一个业务逻辑抽象出一个 CRD 定义,业务功能边界清晰可维护,健壮性非常高。

管控链路安全可控
基于 CRD 的交互,集群不需要透出额外的控制接口,所有外部管控操作都可以基于原生的 apiserver 规范进行控制,完全可复用 k8s 的 rbac 体系,一定程度上也保证了管控链路的安全可靠,权限精细可控。

具体可参考 OpenShift 的这篇最佳实践,详情点击这里

对 Istio 的抽象设计

Istio 的 CRD 体系较为复杂,因此我们需要实现一层简单的控制平面,对 Istio 做一层抽象,用简单易懂的 API 做管控交互。

达到四两拨千斤的效果。例如:

基于 Istio 原生的控制配置,需要大约 100 行, 3 个 CRD 协作完成的控制,抽象的一层管控逻辑只需不到 10 行, 1 个 CRD :

spec:
  service: myservice1
  rules:
  - version: "1.1"
    weight: 70
  - version: "1.2"
    weight: 30
  - version: "2.0"
    weight: 100

服务路由(Route)

微服务迭代迅速,开发敏捷。因此,金丝雀版本流量的精细化控制是集群建设的首要重点。

这也是我们常说的「版本灰度」,那么灰度能力的支持主要分为两种:
1、流量权重灰度
2、规则灰度

权重灰度

按比例调整到达服务特定版本的流量。

在这里,我们设计了大小版本,约定了开发流程中,每个大版本升级需要访问不同的域名 /ContextPath 。每个大版本下的小版本流量比例合为 100 。

示例:
spec:
  service: httpbin
  rules:
  - version: "1.0"
    weight: 80
  - version: "1.1"
    weight: 20
  - version: "2.0"
    weight: 100

调整后,对服务流量监控进行可视化的效果:

104

规则灰度

按照特定的匹配规则,将服务流量定向到特定的版本。

spec:
  service: myservice1
  rules:
  - version: "2.0"
    matches:
    - headers:
        gray:
          exact: "1"
    - queryParams:
        debug:
          exact: "true"

描述了当 header 中包含 gray=1 或者 query 参数中包含 debug=true 时,流量访问到版本 1.1 。

我们通过埋在 Response 中的 header ,就可以知道灰度的效果:

105

服务安全

服务安全针对流量方向分为 Mesh 出入口的南北流量管控和 Mesh 内部的东西流量管控:
1、南北流量主要利用 Ingress Gateway 的 VS 能力管控入口流量,基于 Sidecar + Egress Gateway 管控出口流量
2、东西流量需要通过 mTLS + AuthorizationPolicy 进行控制

通过这些手段来增强集群(尤其是公有云集群)中微服务的安全性。

Ingress 入流量

入口流量的一部分管控需求,在前文「服务路由」中包含。在服务安全方面,包括了全局上的能力,例如:

  • CORS 跨域配置
  • CSRF 保护
  • 流量登录认证

CORS 和 CSRF 基于 Sidecar Filter 即可覆盖统一的通用规则,做进一步的细化和动态配置的需求不强。

流量登录认证,主要用于认证前端访问流量的身份是否合法(没有涉及权限体系),会对接各个常用的登录体系,目前支持的主要是 DataWorks 自有的登录体系。

我们设计了一套灵活的认证框架,基于Filter + 符合规范的认证服务的方式,达到登录认证的需求。

Egress 出流量

Egress 出流量是指访问Mesh网格之外的流量,例如,微服务访问阿里云 OSS 服务等操作。

为了防止服务被攻击后,访问未知的恶意网站,特别在高安全级别的集群环境,需要在默认情况下 0 信任任目标地址,再基于白名单的机制来打通特定的信任地址。

目前 Flannel 网络实现没有支持 NetworkPolicy ,阿里云 ACK 提供的集群默认是 flannel 网络(可选 terway 方式避免),所以基于 Pod 的 NetworkPolicy 不会生效,所以在 Istio 管控之外的 Pod 仍然需要防护,被 istio 管控的 pod 也暂时只有一层 istio 的安全机制保障

默认拒绝访问
配置 sidecar( mesh ) 访问所有 Service( Mesh 外部)的 outbound 流量都需要基于 ServiceEntry 注册才能够访问(即,默认拒绝所有连接)。

kind: IstioControlPlane
spec:
 gateways:
   components:
     egressGateway:
       enabled: true
 values:
   global:
     outboundTrafficPolicy:
       mode: REGISTRY_ONLY

配置生效之后,任何 pod 之间经过 SideCar 进行互相访问的流量都会检查是否注册过 ServiceEntry 。

未注册的服务效果如下:

$ kubectl exec -it sleep-788f7c9bcb-m67rh -c sleep -- curl -I www.aliyun.com
HTTP/1.1 502 Bad Gateway

502 的意思就是 DNS 和 IP 都通,但是访问会被 sidecar 拦截掉

观察流量可以看到,所有流量都到了 BlackHoleCluster ,一个专门用来接收被block的请求的内置 Cluster 。

PassthroughCluster 同理

106

白名单机制
然后,基于默认拒绝的策略,我们在这个基础之上增加白名单。

全局白名单
首先,ServiceEntry 这套 API 并没有 selector 支持对单独某些 workload 生效,一旦配置存在,就是全局有效的。它只支持 namespace 级别的隔离(基于 ExportTo 参数)。

我们将其抽象出一层动态配置,便于未来平滑支持更多的配置规则:

spec:
  service: sleep
  hosts:

  - "www.aliyun.com"

观察流量,可以看到所有流量都走了 Entry 定义的端点,访问得以放行:

107

服务访问控制

服务访问控制是指微服务之间的访问授权机制。在0信任网络中,默认是拒绝所有服务的访问。

在网格中, mTLS 机制用于服务之间身份校验,每个服务都有自己的基于 K8s 的 ServiceAccount ,根据 istio 提供的 mTLS 机制对证书进行身份校验。

因此,服务之间互相访问就有了身份的区别,那么就可以通过 AuthorizationPolicy 直接进行流量的权限控制。

配置默认拒绝:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-all
spec:
  {}

生效后:403 RBAC: access denied 。

$ kubectl exec -it sleep-788f7c9bcb-m67rh -c sleep -- curl -i httpbin:8000/get
HTTP/1.1 403 Forbidden
content-length: 19
content-type: text/plain
date: Mon, 13 Jan 2020 16:09:16 GMT
server: envoy
x-envoy-upstream-service-time: 0
RBAC: access denied

未来

我们借助 Service Mesh 技术,构建了一套 DataWorks 定制化开放 API 的微服务 DevOps 体系。

希望通过我们的努力,能够极大地降低开发门槛,让业务接入更敏捷,让开发迭代更迅速。

未来, DataWorks 团队将提供更多面向微服务生态的管控和治理能力。

作者信息:袁赓拓,花名三辰,阿里云智能-计算平台事业部技术专家,负责数加平台 &DataWorks 的微服务生态建设,目前主要关注微服务、Service Mesh 等相关技术方向。

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
一站式大数据开发治理平台DataWorks初级课程
DataWorks 从 2009 年开始,十ー年里一直支持阿里巴巴集团内部数据中台的建设,2019 年双 11 稳定支撑每日千万级的任务调度。每天阿里巴巴内部有数万名数据和算法工程师正在使用DataWorks,承了阿里巴巴 99%的据业务构建。本课程主要介绍了阿里巴巴大数据技术发展历程与 DataWorks 几大模块的基本能力。 课程目标  通过讲师的详细讲解与实际演示,学员可以一边学习一边进行实际操作,可以深入了解DataWorks各大模块的使用方式和具体功能,让学员对DataWorks数据集成、开发、分析、运维、安全、治理等方面有深刻的了解,加深对阿里云大数据产品体系的理解与认识。 适合人群  企业数据仓库开发人员  大数据平台开发人员  数据分析师  大数据运维人员  对于大数据平台、数据中台产品感兴趣的开发者
相关文章
|
16天前
|
API 持续交付 开发者
后端开发中的微服务架构实践与挑战
在数字化时代,后端服务的构建和管理变得日益复杂。本文将深入探讨微服务架构在后端开发中的应用,分析其在提高系统可扩展性、灵活性和可维护性方面的优势,同时讨论实施微服务时面临的挑战,如服务拆分、数据一致性和部署复杂性等。通过实际案例分析,本文旨在为开发者提供微服务架构的实用见解和解决策略。
|
17天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
5天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
25 5
|
8天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
6天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
8天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
9天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
12天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####
|
12天前
|
消息中间件 监控 数据管理
后端开发中的微服务架构实践与挑战####
【10月更文挑战第29天】 在当今快速发展的软件开发领域,微服务架构已成为构建高效、可扩展和易于维护应用程序的首选方案。本文探讨了微服务架构的核心概念、实施策略以及面临的主要挑战,旨在为开发者提供一份实用的指南,帮助他们在项目中成功应用微服务架构。通过具体案例分析,我们将深入了解如何克服服务划分、数据管理、通信机制等关键问题,以实现系统的高可用性和高性能。 --- ###
36 2
|
14天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;