Ease Mesh

Easegress

Ease Mesh 是一个与 Spring Cloud 生态系统兼容的服务网格。它使用Easegress作为服务管理的边车和EaseAgent作为服务观察的监视器。

1. 目的

我们为什么要重新发明一个轮子?

  • 服务网格与Spring Cloud生态系统兼容: 在Spring Cloud生态系统中开发的微服务有自己的服务注册/发现系统,这与使用 DNS 作为服务发现的 Kubernetes 生态系统完全不同。目前,主要的服务网格解决方案(如:Istio)使用 Kubernetes 领域技术。因此,与 Java Spring Cloud 领域有冲突,并让 Java 的开发者需要放弃Java的相关生态。EaseMesh 旨在使 Service Mesh 与 Java Spring Cloud 完全兼容。

  • 集成的可观察性:目前基于 Kubernetes 的服务网格只能看到入口/出口流量,它不知道服务/应用中发生了什么。因此,结合Java Agent技术,我们可以拥有观察服务/应用内部和外部的全部能力。

简而言之,EashMesh 利用 Kubernetes sidecar 和 Java Agent 技术,使 Java 应用具有服务治理和综合观察能力,而无需改变任何一行源代码

2. 原则

  • Spring Cloud兼容性: Spring Cloud 领域服务治理和弹力容错设计。
  • 无需修改代码: 使用Sidecar和JavaAgent来完成服务治理和综合观测。
  • 完整的服务观测性: 服务运行指标/跟踪/日志监控。

3. 架构

架构图

4. 功能

  • 非侵入式设计。对Java Spring Cloud应用程序的迁移不做任何代码修改,只需要进行小规模的配置更新。
  • Java注册/发现。与流行的Java Spring Cloud生态系统的服务注册/发现(Eureka/Consul/Nacos)兼容。)
  • 流量协调。进行流量着色,并调度东西向和南北向流量到配置好的服务。
  • 资源管理。依靠Kubernetes平台来管理CPU/内存资源。
  • 灰度发布。根据着色流量和不同版本的服务来进行用户请求路由。
  • 弹力设计。包括 Timeout / CircuitBreaker /Retryer / Limiter,完全遵循 Spring Java生态的弹力设计。
  • 可观察性。包括指标/追踪/日志,例如HTTP响应代码分布,JVM GC计数,JDBC完全SQL句子,Kafka/RabbitMQ/Redis 指标,open tracing 调用链,访问日志,等等。有了这些丰富的、面向服务的数据,开发者/操作者可以诊断出真正的问题发生在哪里,并立即采取相应的行动。

5. 关联项目

  1. MegaEase EaseAgent
  2. MegaEase Easegress

6. 快速上手

6.1 环境要求

  • Linux kernel version 4.15+
  • Kubernetes version 1.18+
  • Mysql version 14.14+

6.2 基本环境检查

  • 运行 kubectl get nodes 来检查你的 Kubernetes 集群是否健康。
  • 运行 mysql -u$your_db_user -p$your_db_pass 来检查与数据库的连接情况。

6.3 安装

  1. 注册 K8s mesh-deployment CRD,用以下命令启动 EaseMesh 控制面板 和 入口流量网关。

    $ cd ./install
    $ ./egctl mesh install
    

    注意: EaseMesh的安装需要easegressEaseAgent的镜像。它们是在Docker Hub中提供的。如果你想从你的私人镜像库中获取它们,请运行./egctl mesh install --image-registry-url ${your_image-registry-url}代替。

  2. 检查控制面板和入口网关的状态

    $ kubectl get pod mesh-ingress-${random-suffix}
    NAME              READY  STATUS  RESTARTS  AGE
    mesh-ingress-${random-suffix}  1/1   Running  0     18h
    
    $ kubectl get pod easegress-cluster-0-${random-suffix}
    NAME              READY  STATUS  RESTARTS  AGE
    easegress-cluster-0-${random-suffix}  1/1   Running  0     18h
    
    $ kubectl get pod easegress-cluster-1-${random-suffix}
    NAME              READY  STATUS  RESTARTS  AGE
    easegress-cluster-1-${random-suffix}  1/1   Running  0     18h
    
    $ kubectl get pod easegress-cluster-2-${random-suffix}
    NAME              READY  STATUS  RESTARTS  AGE
    easegress-cluster-2-${random-suffix}  1/1   Running  0     18h
    
  3. 验证 EaseMesh 的 Operator

    $ kubectl get crd | grep meshdeployment
    meshdeployments.mesh.megaease.com       2021-03-18T02:54:15Z
    

7. 演示应用

  • Spring Cloud PetClinic 微服务示例。

  • 它使用了Spring Cloud Gateway、Spring Cloud Circuit Breaker、Spring Cloud Config、Spring Cloud Sleuth、Resilience4j、Micrometer和Spring Cloud Netflix技术栈的Eureka Service Discovery。

    迁移图

7.1 在EaseMesh中启动PetClinic

  1. 运行 ./example/mesh-app-petclinic/deploy.sh

  2. 使用PetClinic范例中的DB表方案和记录来设置你的数据库

    1. 运行kubectl get svc mesh-ingress,然后将NodPort的IP地址和端口号配置到你的流量网关的路由地址中,例如,将配置添加到NGINX中。
    location /pet/ {
            proxy_pass http://$NodePortIP:$NodePortNum/;
                ...
    }
    
  3. 通过 $your_domain/pet/#!/welcome 访问 PetClinic 应用网页

7.2 Canary部署

EaseMesh Canary拓扑结构

  1. 通过使用 Chrome 浏览器的 ModHeader 插件,用HTTP头 X-Canary: lv1 给流量着色。然后EaseMesh将把这些着色的流量路由到客户服务的canary版本实例。

  2. 开发客户服务的灰度版本,为每条记录的城市字段添加一个额外的后缀。 相关补丁如下所示:

    diff --git a/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/Owner.java b/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/Owner.java
    index 360e765..cc2df3d 100644
    --- a/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/Owner.java
    +++ b/spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/Owner.java
    @@ -99,7 +99,7 @@ public class Owner {
        }
    
        public String getAddress() {
    -        return this.address;
    +        return this.address + " - US";
        }
    
        public void setAddress(String address) {k
    
  3. 创建灰度的 Customer 微服务镜像,并将其更新到 ./example/mesh-app-petclinic/canary/customers-service-deployment-canary.yaml 文件的第 #L22 行。

  4. 运行命令 kubectl apply -f ./example/mesh-app-petclinic/canary/customers-service-deployment-canary.yaml

  5. 打开 Chrome 的 ModHeader 插件,对流量进行着色,然后访问 PetClinic 网站。你可以看到表格的变化,它为每条城市记录添加了一个"-US “后缀。

    plugin

7.3 清除

  • 运行命令 ./example/mesh-app-petclinic/undeploy.sh.

8. 许可证

EaseMesh 采用 Apache 2.0 许可证。详情请见 LICENSE 文件。