spring-cloud-kubernetes 与 k8s 的 configmap
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本文是《spring-cloud-kubernetes 实战系列》的第六篇,主要内容是在 kubernetes 上部署一个 java web 应用,该应用使用了 spring-cloud-kubernetes 框架,可以使用 kubernetes 的 configmap;
关于 SpringCloud Config
如果您开发过 SpringCloud 应用,相信您对 SpringCloud Config 不会陌生,在微服务环境中,业务应用可以从 config server 获取所需的配置信息,如下图所示:
关于 kubernetes 的 configmap
这是 kubernetes 提供的基本服务之一,创建一个 configmap 资源,对应着一份配置文件,可以将该资源通过数据卷的形式映射到 Pod 上,这样 Pod 就能用上这个配置文件了,如下图:
spring-cloud-kubernetes 带来的礼物
spring-cloud-starter-kubernetes-config 是 spring-cloud-starter-kubernetes 框架下的一个库,作用是将 kubernetes 的 configmap 与 SpringCloud Config 结合起来,通过 spring-cloud-starter-kubernetes-config,我们的应用就像在通过 SpringCloud Config 取得配置信息,只不过这里的配置信息来自 kubernetes 的 configmap,而不是 SpringCloud Config server,如下图所示:
理论上的准备工作已经差不多了,接下来通过实战来展示 spring-cloud-starter-kubernetes-config 的神奇之处;
源码下载
如果您不打算写代码,也可以从 GitHub 上下载本次实战的源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章的应用在 springcloudk8sconfigdemo 文件夹下,如下图所示:
环境信息
本次实战的环境和版本信息如下:
操作系统: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
springboot:2.1.6.RELEASE
准备完毕,可以开始实战啦!
编码
通过 maven 创建名为 springcloudk8sconfigdemo 的 springboot 工程,pom.xml 内容如下,要注意的是新增了依赖 spring-cloud-starter-kubernetes-config,这是本次实战的重点:
项目的 src\main\resources 路径下不要创建 application.yml 文件,只创建名为 bootstrap.yml 的文件,内容如下:
可见新增了配置项 spring.cloud.kubernetes.config.source.name 和 spring.cloud.kubernetes.config.source.namespace,用于配置信息来源于 kubernetes 的哪个 namespace 下的哪个 configmap;
增加一个配置类 DummyConfig.java,注解 ConfigurationProperties 的 prefix="greeting"表示该类用到的配置项都是名为"greeting"的配置项的子内容 :
启动类 Springcloudk8sconfigdemoApplication.java,简单起见,将用于验证配置项是否生效的 web 接口也写在了这里面,即 hello 方法 :
以上就是实战工程的所有代码了,仅仅只是引入了 spring-cloud-kubernetes-config 的依赖,以及在启动配置文件中指定了 configmap 的信息,即完成了获取配置文件的所有操作,至于代码中用到配置文件的地方,和使用 SpringCloud Config 并无差别。
解决权限问题
我这里的是 minikube,在部署了应用之后,默认的 serviceaccount 是没有权限访问 K8S 的 API Server 资源的,执行以下命令可以提升权限:
注意:以上办法只能用于开发和测试环境,不要用在生产环境,生产环境应参考 Kubernetes 的 RBAC 授权相关设置来处理,步骤如下:
创建 role:
创建 ServiceAccount:
绑定 Role 和 ServiceAccount:
在 deployment 中指定上面的 ServiceAccount;
验证
接下来我们在 kubernetes 环境创建 configmap,再将 springcloudk8sconfigdemo 在 kubernetes 部署和启动,通过 springcloudk8sconfigdemo 提供的 http 接口验证应用是否已经从 configmap 中取得指定的配置;
在 kubernetes 环境新建名为 springcloudk8sconfigdemo.yml 的文件,内容如下:
在 springcloudk8sconfigdemo.yml 文件所在目录执行以下命令,即可在 kubernetes 创建名为的 configmap 的资源:
在 springcloudk8sconfigdemo 项目的 pom.xml 文件所在目录,执行以下命令,即可编译构建部署全部完成:
操作成功后的控制台信息如下:
如果您的环境也是 minikube,可以执行以下命令查看服务地址:
得到服务地址是:http://192.168.121.133:31646
浏览器访问地址:http://192.168.121.133:31646/hello ,得到响应如下图,可见已经从 configmap 取得了配置文件,并且加载成功:
修改 profile
前面的实战没有指定 springboot 工程的 profile,接下来指定 profile 为 development,看能否加载到配置文件中指定的配置,如下图红框所示:
修改项目的 src\main\resources 路径下的 bootstrap.yml 文件,增加配置项 spring.profiles.active,修改后的完整内容如下:
在 springcloudk8sconfigdemo 项目的 pom.xml 文件所在目录,执行以下命令,即可编译构建部署全部完成:
如果您的环境也是 minikube,可以执行以下命令查看服务地址:
得到服务地址是:http://192.168.121.133:30659
浏览器访问地址:http://192.168.121.133:30659/hello ,得到响应如下图,可见已经从 configmap 取得了指定 profile 的配置文件,并且加载成功:
至此,spring-cloud-kubernetes 与 k8s 的 configmap 的实战就完成了,我们可以发现借助 spring-cloud-kubernetes-config 的神奇能力,曾经使用 SpringCloud Config 来配置的应用几乎不用修改代码,仅仅调整了配置和依赖,就能顺利迁移到 kubernetes 之上,直接使用原生的配置服务,并且 SpringCloud Config Server 也可以不用在 kubernetes 上部署了,再次感受到 SpringCloud 设计的前瞻性。
一点遗憾
虽然我们的应用已经成功从 configmap 取得配置信息,但遗憾的是,configmap 的配置信息被修改后,这些修改是无法实时同步到我们的应用的,只能重启应用来重现获取配置,为了解决这个问题,请参考本系列的下一篇 《spring-cloud-kubernetes 自动同步 k8s 的 configmap 更新》
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/164a4dbcce4f3ac73d4354c59】。文章转载请联系作者。
评论