DSF Mesh

背景

随着微服务技术演进,越来越多的开发者和企业开始使用“微服务”的开发模式,服务网络已成为新一代微服务技术的代名词,解决了将服务路由和治理沉淀到基础设施层,对业务层透明的问题。

服务网格

服务网格隶属于基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明。

1

上图展示了服务网格的典型代理模式,即Sidecar模式,实现了“业务服务”和“基础设施”解耦,将一个微服务进程一分为二:

  • 一个进程实现业务逻辑,即上图绿色模块。
  • 一个进程实现底层技术体系,即上图蓝色模块,负载均衡、监控告警、服务发现与治理、调用链…等诸多基础设施。

istio

Istio是DSFMesh产品化应用的开源项目,通过提供完整的非侵入式的微服务治理解决方案,能够很好的解决云原生服务的管理、网络连接以及安全管理等服务网络治理问题。

Istio由控制平面和数据平面两部分组成。由于服务网格中有数量众多的网络代理,如果对每个代理分别进行设置,工作量将非常巨大。为了更方便地对服务网格中的代理进行统一集中控制,在服务网格上增加了控制平面组件。

2

DSFMesh

DSFMesh是DigitalWare面向软件业务SaaS化提供的服务网格,可无侵入的接入到现有的系统里,为系统提供服务治理,如服务发现、负载均衡、灰度路由、度量和监控等。

DSFMesh基于Istio构建,并对istio进行可信能力增强,控制平面和数据平面均和开源Istio完全兼容。

3

产品优势

DSFMesh继承了Istio的优势:

  • 真正的语言无关,服务可以用任何语言编写。
  • 对应用透明,业务无感升级。
  • 代码非入侵,屏蔽分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控追踪、流量控制等),服务只用关注业务逻辑。
  • 标准统一,协议与组件无关,实现了协议的组件互相插拔。

整体架构

image
DSFMesh在逻辑上分为数据平面(Data Plane)和控制平面(Control Plane)。

  • 数据平面:由一组以Sidecar方式部署的智能代理(Envoy)组成。这些代理负责协调和控制微服务之间的所有网络通信,同时收集和报告所有网格流量的遥测数据。
  • 控制平面:管理并配置代理来进行流量路由。

DSFMesh主要由表1中组件构成:

  • Proxy
    DSFMesh中使用带有Envoy的Sidecar模型作为Proxy代理。
    Sidecar是DSFMesh的服务治理执行组件,主要根据配置对服务实施治理,是唯一与数据平面流量交互的组件。
  • Istiod
    Pilot:Pilot为Envoy Sidecar提供服务发现、用于智能路由的流量管理功能(例如,灰度发布)以及弹性功能(超时、重试、熔断器等)。
    Citadel:Citadel通过内置身份和凭证管理赋能强大的服务间和最终用户身份验证。可用于升级服务网格中未加密的流量,并为运维人员提供基于服务标识而不是网络控制的强制执行策略的能力。
    Galley:Galley是配置验证、提取、处理和分发组件。它负责将其余的组件与从底层平台(例如Kubernetes)获取用户配置的细节隔离开来。
  • Ingress
    外部使用DSFMesh内服务的入口,主要是将外部请求转发到DSFMesh内部的服务。

系统上下文

DSFMesh系统上下文如图所示

image

图中DSFMesh由Mangement、Sidecar、Ingress三部分组成:

  • Mangement:管理面主控系统,实现产品服务无侵入完成Sidecar注入,将服务治理配置动态应用到Sidecar和Ingress,以及在用户面安全通信的证书签发,对应表1中Istiod。
  • Sidecar:用户面主控系统,无侵入拦截产品应用服务请求,进行服务治理(路由、灰度路由、重试、熔断),对应表1中Proxy。
  • Ingress:用户面入站网关主控系统。

与DSFMesh交互方主要分为:

  • 产品服务(Service):包括DSFMesh外的产品应用、DSFMesh内的产品应用/服务,通过用户面实现产品的价值。
  • K8S:DSFMesh依赖K8S,部署并运行在K8S上,同时使用K8S保存DSFMesh的服务治理配置。
  • SaaSOps:通过SaaSOps,提供DSFMesh的运维管理。

功能架构

DSFMesh功能架构如图所示
image
DSFMesh功能架构的模块说明如下

  • 服务多协议
    • 支持多协议接入接出,例如:HTTP。
    • 支持多种协议开箱即用。
    • 支持用户扩展协议接入能力。
    • 支持用户自定义编解码能力。
  • 服务访问安全控制
    支持多种方式的服务安全策略,确保服务访问安全。
    HTTPS/SSL:支持HTTPS/SSL传输,确保关键业务调用安全性。
  • 服务注册/服务发现
    基于K8S提供统一的服务注册发布机制,支持服务的动态发现和注册,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
    • 服务注册:服务框架将服务提供者发布的服务元数据信息注册到服务注册中心,实现服务的位置无关。
    • 服务发现:服务框架从服务注册中心订阅服务元数据信息,缓存到本地,供服务调用时发现服务提供者的地址。
  • 服务路由
    DSFMesh系统根据特定规则来完成同名服务调用的过程被称为服务路由,这些特定的规则称为路由策略。
    灰度路由:将一部分用户使用的服务升级成新版本的服务,其它用户的服务不升级;然后通过监测用户行为和收集体验报告,对比新旧版本的满意度。并通过此手段以逐步分阶段的达到所有用户服务升级的目的。
  • 负载均衡
    有效防止瞬间的大量请求数据对服务带来的冲击,保证服务高效而稳定运行。
  • 服务高可用
    DSFMesh提供多种服务高可用机制保障服务运行期间的可靠性保障。
    • 服务级故障隔离:支持服务通过配置的方式独占、共享线程池,对于重要的核心服务采用独占线程池的方式隔离故障。
    • 节点级故障隔离:服务提供者发生异常之后会自动从路由表中清除,恢复之后自动加入路由表中,某个服务提供者异常不会导致其它提供者不可用。
  • 服务监视
    DSFMesh提供多种服务监视能力。
    • 服务性能KPI
    • 服务访问日志
    • 辅助故障定位分析

基本概念

Sidecar模式

Sidecar也称边车,将应用程序的功能划分为单独的进程可以被视为Sidecar模式,是容器应用模式的一种,也是DSFMesh中习惯采用的模式。

如下图所示,Sidecar模式允许您在应用程序旁添加更多功能,而无需额外第三方组件配置或修改应用程序代码。
image
Kubernetes简称K8S,是用于自动部署、扩展和管理容器化应用程序的开源系统。
对于云原生应用,采用Kubernetes构建微服务部署和集群管理能力,采用Istio构建服务治理能力,逐渐成为应用微服务转型的标准配置。
Istio、微服务、容器与Kubernetes的关系如下:
image

1.容器和微服务具有共同的轻量、敏捷的特点,微服务运行在容器中日益流行。
2.Kubernetes在容器编排领域成为事实标准。
3.Istio和Kubernetes紧密结合。基于Kubernetes构建,补齐了Kubernetes的治理能力,提供了端到端的微服务运行治理平台。
4.Istio提供DSFMesh方式无侵入微服务治理能力,成为微服务治理的趋势。

Ingress 网关配置

流量统一从网关进入

image

路由配置

网关路由
image
样例网关路由

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  annotations:
    meta.helm.sh/release-name: termloan
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2024-11-04T10:27:25Z"
  generation: 1
  labels:
    app.kubernetes.io/managed-by: Helm
  name: term-loan-istio-ingress-gateway
  namespace: mpaas
  resourceVersion: "150115094"
  uid: ca2cfac8-a760-4b79-b457-fe14c44e3c0b
spec:
  gateways:
  - istio-ingress-gateway.mpaas
  hosts:
  - '*'
  http:
  - match:
    - headers:
        x-prefer-color:
          exact: gray
      uri:
        prefix: /term-loan
    retries:
      attempts: 0
      perTryTimeout: 30s
      retryOn: gateway-error,refused-stream,connect-failure
    rewrite:
      uri: /
    route:
    - destination:
        host: term-loan.mpaasblue.svc.cluster.local
        port:
          number: 8080
    timeout: 30s
  - match:
    - headers:
        x-prefer-color:
          exact: not-gray
      uri:
        prefix: /term-loan
    retries:
      attempts: 0
      perTryTimeout: 30s
      retryOn: gateway-error,refused-stream,connect-failure
    rewrite:
      uri: /
    route:
    - destination:
        host: term-loan.mpaas.svc.cluster.local
        port:
          number: 8080
    timeout: 30s
  - match:
    - uri:
        prefix: /term-loan
    retries:
      attempts: 0
      perTryTimeout: 30s
      retryOn: gateway-error,refused-stream,connect-failure
    rewrite:
      uri: /
    route:
    - destination:
        host: term-loan
        port:
          number: 8080
    timeout: 30s

边车路由
image
样例边车路由

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  annotations:
    meta.helm.sh/release-name: accessproxy
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2024-11-04T10:27:29Z"
  generation: 2
  labels:
    app.kubernetes.io/managed-by: Helm
  name: accessproxy
  namespace: mpaas
  resourceVersion: "150130832"
  uid: 0b7845f8-0095-44c4-a358-67f099a74488
spec:
  hosts:
  - accessproxy
  http:
  - match:
    - headers:
        access:
          exact: pod
        x-prefer-color:
          exact: gray
    retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy.mpaasblue.svc.cluster.local
        port:
          number: 8080
        subset: pod-access
    timeout: 7s
  - match:
    - headers:
        access:
          exact: pod
        x-prefer-color:
          exact: not-gray
    retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy.mpaas.svc.cluster.local
        port:
          number: 8080
        subset: pod-access
    timeout: 7s
  - match:
    - headers:
        x-prefer-color:
          exact: gray
    retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy.mpaasblue.svc.cluster.local
        port:
          number: 8080
    timeout: 7s
  - match:
    - headers:
        x-prefer-color:
          exact: not-gray
    retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy.mpaas.svc.cluster.local
        port:
          number: 8080
    timeout: 7s
  - match:
    - headers:
        access:
          exact: pod
    retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy
        port:
          number: 8080
        subset: pod-access
    timeout: 7s
  - retries:
      attempts: 0
      perTryTimeout: 3s
      retryOn: gateway-error,refused-stream,connect-failure
    route:
    - destination:
        host: accessproxy
        port:
          number: 8080
    timeout: 7s

说明:路由匹配规则是从上往下按依次匹配,第一个匹配的将命中路由,而非匹配条件命中最多的优先级最高。
参考:
导出边车容器内所有路由规则
exmpaas taskjob-5f69b4ddf5-lbtjs -c istio-proxy -- /home/istio-proxy/bin/admintool get config_dump > taskjob_istio_dump.yaml
其他可用命令
image
accessproxy流量走向
image
image

posted @ 2024-11-07 16:46  uvsmile9  阅读(76)  评论(0)    收藏  举报