树莓派k8s集群部署spring cloud微服务项目实践

原创
09/20 23:49
阅读数 4K

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

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界面之前要参考如下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

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

  • 使用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

  • 使用nodeport方式访问provider的示例接口

provider组件只提供了两个接口,其中from接口调用了配置中心的数据。

访问http://192.168.5.18:8007/hello,显示如下

访问http://192.168.5.18:8007/from,显示如下

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

  • 使用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

  • 访问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

  • 基于网关访问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项目容器化改造有一定参考价值。

参考:

展开阅读全文
打赏
0
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部