Ease Mesh
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. 关联项目
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 安装
注册 K8s mesh-deployment CRD,用以下命令启动 EaseMesh 控制面板 和 入口流量网关。
$ cd ./install $ ./egctl mesh install
注意: EaseMesh的安装需要easegress和EaseAgent的镜像。它们是在Docker Hub中提供的。如果你想从你的私人镜像库中获取它们,请运行
./egctl mesh install --image-registry-url ${your_image-registry-url}
代替。检查控制面板和入口网关的状态
$ 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
验证 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
运行
./example/mesh-app-petclinic/deploy.sh
。使用PetClinic范例中的DB表方案和记录来设置你的数据库
- 运行
kubectl get svc mesh-ingress
,然后将NodPort的IP地址和端口号配置到你的流量网关的路由地址中,例如,将配置添加到NGINX中。
location /pet/ { proxy_pass http://$NodePortIP:$NodePortNum/; ... }
- 运行
通过
$your_domain/pet/#!/welcome
访问 PetClinic 应用网页
7.2 Canary部署
通过使用 Chrome 浏览器的 ModHeader 插件,用HTTP头
X-Canary: lv1
给流量着色。然后EaseMesh将把这些着色的流量路由到客户服务的canary版本实例。开发客户服务的灰度版本,为每条记录的城市字段添加一个额外的后缀。 相关补丁如下所示:
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
创建灰度的 Customer 微服务镜像,并将其更新到
./example/mesh-app-petclinic/canary/customers-service-deployment-canary.yaml
文件的第 #L22 行。运行命令
kubectl apply -f ./example/mesh-app-petclinic/canary/customers-service-deployment-canary.yaml
打开 Chrome 的 ModHeader 插件,对流量进行着色,然后访问 PetClinic 网站。你可以看到表格的变化,它为每条城市记录添加了一个"-US “后缀。
7.3 清除
- 运行命令
./example/mesh-app-petclinic/undeploy.sh
.
8. 许可证
EaseMesh 采用 Apache 2.0 许可证。详情请见 LICENSE 文件。