你好 spring-cloud-kubernetes
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
关于 spring-cloud-kubernetes
spring-cloud-kubernetes 是 springcloud 官方推出的开源项目,用于将 Spring Cloud 和 Spring Boot 应用运行在 kubernetes 环境,并且提供了通用的接口来调用 kubernetes 服务,GitHub 上官方地址是:https://github.com/spring-cloud/spring-cloud-kubernetes
该项目的提交者之一,就是 SpringCloud 的作者之一 Spencer Gibb:
通过官方 demo 来了解 spring-cloud-kubernetes
spring-cloud-kubernetes 项目也提供了丰富的官方 demo 来帮助开发者了解和学习 spring-cloud-kubernetes,您可以参考《spring-cloud-kubernetes官方demo运行实战》快速体验官方 demo;
实战 spring-cloud-kubernetes
今天实战的内容是开发一个简单的 java 应用,然后将其部署在 kubernetes 环境(minikube 1.1.1),该应用通过 spring-cloud-kubernetes 调用当前 kubernetes 的服务;
环境信息
本次实战的环境和版本信息如下:
操作系统:CentOS Linux release 7.6.1810
minikube:1.1.1
Java:1.8.0_191
Maven:3.6.0
fabric8-maven-plugin 插件:3.5.37
spring-cloud-kubernetes:1.0.1.RELEASE
上面的 linux、minikube、java、maven,请确保已准备好,linux 环境下 minikube 的安装和启动请参考《Linux 安装 minikube 指南 》。
准备工作已经 OK,开始编码吧。
源码下载
如果您不打算写代码,也可以从 GitHub 上下载本次实战的源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章源码在 springcloudk8sdiscovery 这个文件夹下,如下图红框所示:
开发应用
基于 maven 创建一个 springboot 应用,名为 springcloudk8sdiscovery;
该应用完整的 pom.xml 内容如下:
上述 pom.xml 文件有几处需要关注:a. 直接依赖了 spring-cloud-kubernetes 的以下两个库,后面才能使用 spring-cloud-kubernetes 的服务:
b. 使用插件 fabric8-maven-plugin 来构建镜像并部署到 minikube 环境:
c. 为 fabric8-maven-plugin 插件准备了三个 profile,本次实战主要用到 kubernetes 这个:
以上就是 pom.xml 的内容了,主要是添加 spring-cloud-kubernetes 的依赖,以及使用 fabric8 来构建和部署;
在 application.properties 文件中设置应用名称:
创建应用启动类 Springcloudk8sdiscoveryApplication,可见这是个很普通的 springboot 启动类:
创建 controller 类,对外提供 http 服务,部署完成后通过这些 http 服务来验证功能:
上述代码有几点需要注意:a. health 方法用于响应 kubernetes 的探针检查;b. getservicedetail 方法接收名为 servicename 的参数,然后去服务列表中检查对应的服务对象并返回;c. services 方法返回的是所有服务的名称;
以上就是所有代码了,功能是通过 autowire 得到 DiscoveryClient 实例,再调用该实例的 API 取得服务信息。
接下来我们将应用构建并部署到 minikube 环境;
编译构建
请确保当前电脑上 java、maven、minikube 都是正常的;
在 pom.xml 文件所在目录执行以下命令,即可编译构建部署一次性完成:
构建成功后,控制台输出信息如下:
用 kubectl 命令查看部署和服务,都处于正常状态:
执行命令 minikube service springcloudk8sdiscovery --url,得到的是可以从外部访问的服务地址:http://192.168.121.133:31583 ,其中 192.168.121.133 是宿主机 IP 地址;
在浏览器上访问地址 http://192.168.121.133:31583/services ,如下图,返回的"所有服务"其实是 kubernetes 中的所有 service:
为了验证当前 namespace 下的所有服务都能被发现,我们再创建个服务实施,执行以下命令,会创建名为 my-tomcat 的部署和服务:
由于下载镜像需要一定时间,所以需要稍作等待;
再去访问地址 http://192.168.121.133:31583/services ,如下图,my-tomcat 赫然在列:
访问地址 http://192.168.121.133:31583/getservicedetail?servicename=my-tomcat ,会得到名为 my-tomcat 的服务信息,该信息格式化后的内容如下所示:
可见 spring-cloud-kubernetes 的 DiscoveryClient 服务将 kubernetes 中的"service"资源与 SpringCloud 中的服务对应起来了,有了这个 DiscoveryClient,我们在 kubernetes 环境就不需要 eureka 来做注册发现了,而是直接使用 kubernetes 的服务机制,此时不得不感慨 SpringCloud 的对 DiscoveryClient 的设计是如此的精妙。
至此,spring-cloud-kubernetes 的初体验就结束了,通过简单的编码我们的程序在 kubernetes 环境可以取得 service 资源的信息,随着学习的深入,我们会用到更多的 spring-cloud-kubernetes 能力,感谢 spring-cloud-kubernetes 的设计者,让我们的 SpringCloud 应用畅游在在 kubernetes 世界。
疑惑待解
您可能会有些疑惑:上面的代码都是和 SpringCloud 相关的,和 spring-cloud-kubernetes 没什么关系呀,为什么程序运行起来后就能取得 kubernetes 环境中的服务信息呢?
此问题如果不弄清楚,后面的学习很难展开,因为我们都不知道自己的代码与 kubernetes 环境有什么关系,和 kubernetes 有没有交互?
以上问题,在下一篇《spring-cloud-kubernetes 背后的三个关键知识点》会有详细的分析。
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/1c64036df7eed6bbb60b80c1e】。文章转载请联系作者。
评论