spring cloud简介
spring cloud是当前的主流微服务框架之一,虽然目前官方已经推出了spring-cloud-kubernetes开源项目,用于将Spring Cloud应用更方便地运行在kubernetes环境,但考虑到目前有些spring cloud项目还是基于非k8s环境运行,一旦迁移至k8s环境需要尽可能保留原有的架构,因此本项目仍然采用eureka作为服务注册发现组件、spring-cloud-config作为配置中心。
安装准备
- 树莓派k8s集群
root@pi4-master01:~# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
pi4-master01 Ready master 4d18h v1.15.10 192.168.5.18 <none> Ubuntu 20.04 LTS 5.4.0-1011-raspi docker://18.9.9
pi4-node01 Ready node 4d17h v1.15.10 192.168.5.19 <none> Ubuntu 20.04 LTS 5.4.0-1011-raspi docker://18.9.9
pi4-node02 Ready node 4d17h v1.15.10 192.168.5.20 <none> Ubuntu 20.04 LTS 5.4.0-1011-raspi docker://18.9.9
- 树莓派k8s集群已安装helm
root@pi4-master01:~/k8s/cluster-monitoring-0.37.0# helm version
Client: &version.Version{SemVer:"v2.15.0", GitCommit:"c2440264ca6c078a06e088a838b0476d2fc14750", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.15.0+unreleased", GitCommit:"9668ad4d90c5e95bd520e58e7387607be6b63bb6", GitTreeState:"dirty"}
对了,如果你还没有树莓派k8s集群,这里有一篇树莓派 k8s 集群入坑指南可以参考,欢迎入坑。
spring cloud示例项目镜像
以下是本实践用到的镜像,其源码和Dockerfile在https://gitee.com/pi4k8s/springcloud-simple.git ,具体代码就不介绍了,有兴趣的同学可以自行调整。
- 调用链查看系统(zipkin-server):pi4k8s/spring-cloud-zipkin:0.0.1
- 服务发现注册中心(eureka):pi4k8s/spring-cloud-eureka:0.0.1
- 配置中心(config-server):pi4k8s/spring-cloud-config-server:0.0.1
- 聚合断路器面板(hystrix-dashboard):pi4k8s/spring-cloud-hystrix-dashboard:0.0.1
- 服务提供示例组件(provider):pi4k8s/spring-cloud-provider:0.0.1
- 服务消费示例组件(consumer):pi4k8s/spring-cloud-consumer:0.0.1
- 服务器网关(gateway):pi4k8s/spring-cloud-gateway:0.0.1
spring cloud示例项目chart
- 调用链查看系统(zipkin-server):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/zipkin-server
- 服务发现注册中心(eureka):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/eureka
- 配置中心(config-server):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/config-server
- 服务提供示例组件(provider):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/provider
- 服务消费示例组件(consumer):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/consumer
- 聚合断路器面板(hystrix-dashboard):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/hystrix-dashboard
- 服务器网关(gateway):https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/charts/gateway
helm部署spring cloud示例项目
之前我们的实例文章里基本都是介绍如何使用现成的chart去安装一个应用,比如msyql、redis、kafka和consul,今天我们选择从头编写chart并用该chart安装spring cloud示例项目。
helm官方首页展现了helm的定义“the package manager for kubernetes”和进一步说明“Helm is the best way to find, share, and use software built for Kubernetes.”,翻译成中文就是“kubernetes的应用管理器”以及“Helm是发现、分享和使用为kubernetes构建的应用最好的方式”,极其精辟。一般来讲,为kubernetes构建的应用基本上就可以看做云原生应用,因为它至少符合了CNCF2015年对云原生最早的三个定义:容器化、面向微服务架构且支持容器的编排调度,由此我们看到helm在云原生领域展现的信心和实力,这点毋庸置疑,因为我们已经可以能够基于各类chart仓库很容易安装好我们需要的很多应用。但如果你真得没有找到现成的,那也没有关系,可以用helm的语法自己来定义和安装,一旦你确实这么做了,你会发现用helm来组织和定义应用是如此的简单和自然,面向容器化环境的基础设施去构架,可以让你不再纠结于服务器配置、网络配置和具体软件安装细节,只需要关注应用模块如何划分,模块之间关系如何交互即可。基于helm chart表述的软件架构视图可以充分覆盖传统软件架构的物理视图,表现内容甚至比它们还要丰富,且更具有扩展性。
我们自己编写spring cloud示例项目chart在这里:https://github.com/pi4k8s/pi4charts/tree/master/springcloud-example/
helm部署调用链查看系统(zipkin-server)
- 使用helm部署zipkin-server命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n zipkin-server ./zipkin-server --set ingress.enabled=true
通过上述命令,将在Kubernetes中部署配置中心zipkin-server。该命令将会安装部署1个zipkin-server节点,且开放了ingress访问。。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep zipkin-server
zipkin-server-0 1/1 Running 0 82s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep zipkin-server
zipkin-server ClusterIP 10.99.240.173 <none> 9411/TCP 92s
- 查看创建的ingress
root@pi4-master01:~# kubectl get ingress|grep zipkin-server
zipkin-server zipkin-server.pi4k8s.com 80 104s
- 访问zipkin-server界面
用浏览器访问http://zipkin-server.pi4k8s.com/,显示如下
不过现在系统里还没有任何请求数据。
注意:用浏览器访问zipkin-server界面之前要参考如下ip域名映射处理进行客户端设置。
ip域名映射处理
在通过浏览器访问本实践所涉及系统之前,我们需要在使用客户端访问电脑建立ip和相关域名的映射关系,类似如下,后续eureka、gateway和hystrix-dashboard均需要设置,参考本段设置即可,不再赘述:
192.168.5.18 zipkin-server.pi4k8s.com
提示:win10或win7电脑中维护ip和相关域名的文件位置在 C:\Windows\System32\drivers\etc\hosts。
helm部署服务发现注册中心(eureka)
- 使用helm部署eureka集群命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n eureka ./eureka --set ingress.enabled=true
通过上述命令,将在Kubernetes中部署eureka集群。该命令将会安装部署3个eureka节点,且开放了ingress访问。
- 查看创建的pod
root@pi4-master01:~# kubectl get po |grep eureka
eureka-0 0/1 Running 0 31s
eureka-1 0/1 Running 0 31s
eureka-2 0/1 Running 0 31s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc |grep eureka
eureka ClusterIP None <none> 8080/TCP 79s
- 查看创建的ingress
root@pi4-master01:~# kubectl get ingress |grep eureka
eureka eureka.pi4k8s.com 80 89s
-
访问eureka管理界面
访问http://eureka.pi4k8s.com/ ,页面显示如下
helm部署配置中心(config-server)
- 使用helm部署config-server命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n config-server ./config-server \
--set service.type=NodePort \
--set service.nodePort=8001
通过上述命令,将在Kubernetes中部署配置中心config-server。默认情况下service.type为ClusterIP类型,只支持k8s集群内部访问,示例命令将servcie.type修改为NodePort,且指定开放端口为8001,这样方便我们从客户端通过浏览器直接访问查看效果了。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep config-server
config-server-5896754dfc-t5sfl 1/1 Running 0 6m4s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep config-server
config-server NodePort 10.104.0.119 <none> 8001:8001/TCP 6m27s
-
访问eureka管理界面
访问http://eureka.pi4k8s.com/ 我们可以注意到配置中心已经注册到eureka如下
-
使用nodeport方式访问配置中心的配置信息
访问http://192.168.5.18:8001/config/dev,显示如下
helm部署服务提供示例组件(provider)
- 使用helm部署provider命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n provider ./provider \
--set service.type=NodePort \
--set service.nodePort=8007
通过上述命令,将在kubernetes中部署服务提供示例组件provider。默认情况下service.type为ClusterIP类型,只支持k8s集群内部访问,示例命令将servcie.type修改为NodePort,且指定开放端口为8007,这样方便我们从客户端通过浏览器直接访问查看效果了。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep provider
provider-6f7ddcdf98-c9hxd 1/1 Running 0 33s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep provider
provider NodePort 10.96.156.37 <none> 8007:8007/TCP 4m30s
-
访问eureka管理界面
访问http://eureka.pi4k8s.com/ 我们可以注意到provider已经注册到eureka如下
- 使用nodeport方式访问provider的示例接口
provider组件只提供了两个接口,其中from接口调用了配置中心的数据。
访问http://192.168.5.18:8007/hello,显示如下
访问http://192.168.5.18:8007/from,显示如下
- 访问zipkin-server界面
provider不仅接入了配置中心,也接入了调用链系统,访问http://zipkin-server.pi4k8s.com/,可以查到相关调用链访问情况如下
helm部署服务消费示例组件(consumer)
- 使用helm部署consumer命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n consumer ./consumer \
--set service.type=NodePort \
--set service.nodePort=9000
通过上述命令,将在Kubernetes中部署服务消费示例组件consumer。默认情况下service.type为ClusterIP类型,只支持k8s集群内部访问,示例命令将servcie.type修改为NodePort,且指定开放端口为9000,这样方便我们从客户端通过浏览器直接访问查看效果了。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep consumer
consumer-797656455-x2cgv 0/1 Running 2 19m
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep consumer
consumer NodePort 10.96.219.125 <none> 9000:9000/TCP 20m
-
访问eureka管理界面
访问http://eureka.pi4k8s.com/ 我们可以注意到consumer已经注册到eureka如下
- 使用nodeport方式访问consumer的示例接口
访问http://192.168.5.18:9000/hello,显示如下
- 访问zipkin-server界面
consumer接入了调用链系统,访问http://zipkin-server.pi4k8s.com/,可以查到相关调用链访问情况如下
- 访问hystrix-dashboard界面
consumer配置了断路器面板可以独立展示,访问http://192.168.5.18:9000/hystrix,显示如下
该界面文本框内输入http://192.168.5.18:9000/actuator/hystrix.stream ,然后点击“Monitor Stream”按钮,显示如下
helm部署聚合断路器面板(hystrix-dashboard)
- 使用helm部署hystrix-dashboard命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n hystrix-dashboard ./hystrix-dashboard --set ingress.enabled=true
通过上述命令,将在Kubernetes中部署断路器面板hystrix-dashboard。该命令将会安装部署1个hystrix-dashboard节点,且开放了ingress访问,该断路器目前只聚合了consumer集群断路器面板。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep hystrix-dashboard
hystrix-dashboard-6fd9b87589-65g89 0/1 Running 1 2m50s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep hystrix-dashboard
hystrix-dashboard ClusterIP 10.106.100.154 <none> 9902/TCP 18m
- 查看创建的ingress
root@pi4-master01:~# kubectl get ingress|grep hystrix-dashboard
hystrix-dashboard hystrix-dashboard.pi4k8s.com 80 18m
- 访问eureka管理界面
访问http://eureka.pi4k8s.com/ 我们可以注意到hystrix-dashboard已经注册到eureka如下
- 访问hystrix-dashboard界面
访问http://hystrix-dashboard.pi4k8s.com/hystrix,显示如下
该界面文本框内输入http://hystrix-dashboard:9902/turbine.stream ,然后点击“Monitor Stream”按钮,进入聚合监控页面,显示如下
consumer伸缩为3个后再看效果
root@pi4-master01:~# kubectl scale --replicas=3 deployment/consumer
deployment.extensions/consumer scaled
确认consumer启动3个节点成功
root@pi4-master01:~# kubectl get po|grep consumer
consumer-797656455-hsssp 1/1 Running 0 11m
consumer-797656455-wq67x 1/1 Running 0 86s
consumer-797656455-x2cgv 1/1 Running 0 28m
访问http://eureka.pi4k8s.com/ 我们可以注意到consumer在eureka注册了3个节点如下
刷新聚合监控页面,显示如下
可以看到Hosts变为3。
helm部署服务器网关(gateway)
- 使用helm部署gateway命令如下
root@pi4-master01:/home/charts# git clone https://github.com/pi4k8s/pi4charts.git
root@pi4-master01:/home/charts# cd pi4charts/springcloud-example/charts
root@pi4-master01:/home/charts/pi4charts/springcloud-example/charts# helm install -n gateway ./gateway --set ingress.enabled=true
通过上述命令,将在kubernetes中部署服务器网关gateway。该命令将会安装部署1个gateway节点,且开放了ingress访问。
- 查看创建的pod
root@pi4-master01:~# kubectl get po|grep gateway
gateway-69b9d7fb87-9zgz9 1/1 Running 0 86s
- 查看创建的svc
root@pi4-master01:~# kubectl get svc|grep gateway
gateway ClusterIP 10.103.12.68 <none> 8220/TCP 3m57s
- 查看创建的ingress
root@pi4-master01:~# kubectl get ingress|grep gateway
gateway gateway.pi4k8s.com 80 4m3s
-
访问eureka管理界面
访问http://eureka.pi4k8s.com/ 我们可以注意到gateway已经注册到eureka如下
- 基于网关访问provider和consumer的接口
这里的网关配置非常简单,通过它可以对所有注册到同一个eureka集群的服务进行代理,我们基于网关访问provider的2个接口和consumer的1个接口,看下效果。
访问http://gateway.pi4k8s.com/provider/hello,显示如下
访问http://gateway.pi4k8s.com/provider/from,显示如下
访问http://gateway.pi4k8s.com/consumer/hello,显示如下
总结
本实践简单介绍了如何使用chart在树莓派k8s集群用helm部署一个spring cloud示例项目,该spring cloud示例项目虽然简单,但相对完整地整合了注册中心、调用链、网关、配置中心、断路器面板和具体业务模块的集成,并将所有组件容器化、成功部署到树莓派k8s集群环境,对启发其它spring cloud项目容器化改造有一定参考价值。
参考:
评论区