APP下载

你好spring-cloud-kubernetes开源专案

消息来源:baojiabao.com 作者: 发布时间:2026-05-16

报价宝综合消息你好spring-cloud-kubernetes开源专案

作者:欣宸,前阿里工程师

关于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.1810minikube:1.1.1Java:1.8.0_191Maven:3.6.0fabric8-maven-plugin外挂:3.5.37spring-cloud-kubernetes:1.0.1.RELEASE上面的linux、minikube、java、maven,请确保已准备好,linux环境下minikube的安装和启动请参考《Linux安装minikube指南 》。

准备工作已经OK,开始编码吧。

源代码下载

如果您不打算写程式码,也可以从GitHub上下载本次实战的源代码,地址和连结资讯如下表所示:

名称连结备注专案主页https://github.com/zq2599/blog_demos该专案在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该专案源代码的仓库地址,https协议git仓库地址(ssh)[email protected]:zq2599/blog_demos.git该专案源代码的仓库地址,ssh协议

这个git专案中有多个资料夹,本章源代码在springcloudk8sdiscovery这个资料夹下,如下图红框所示:

开发应用

1.基于maven建立一个springboot应用,名为springcloudk8sdiscovery;

2.该应用完整的pom.xml内容如下:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.1.1.RELEASE

com.bolingcavalry

springcloudk8sdiscovery

0.0.1-SNAPSHOT

springcloudk8sdiscovery

Demo project for Spring Boot

1.8

2.1.1.RELEASE

3.5

2.8.2

2.18.1

2.21.0

3.5.37

org.springframework.boot

spring-boot-dependencies

pom

import

${spring-boot.version}

org.springframework.cloud

spring-cloud-kubernetes-core

1.0.1.RELEASE

org.springframework.cloud

spring-cloud-kubernetes-discovery

1.0.1.RELEASE

org.springframework.cloud

spring-cloud-commons

2.1.1.RELEASE

org.springframework.boot

spring-boot-starter

2.1.1.RELEASE

org.springframework.boot

spring-boot-starter-web

2.1.1.RELEASE

org.springframework.boot

spring-boot-starter-actuator

2.1.1.RELEASE

com.alibaba

fastjson

1.2.28

org.springframework.boot

spring-boot-maven-plugin

${spring-boot.version}

repackage

org.apache.maven.plugins

maven-deploy-plugin

${maven-deploy-plugin.version}

true

org.apache.maven.plugins

maven-surefire-plugin

${maven-surefire-plugin.version}

true

false

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

kubernetes

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

build

NodePort

release

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

helm

integration

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

build

org.apache.maven.plugins

maven-failsafe-plugin

${maven-failsafe-plugin.version}

run-integration-tests

integration-test

integration-test

verify

false

false

上述pom.xml档案有几处需要关注: a. 直接依赖了spring-cloud-kubernetes的以下两个库,后面才能使用spring-cloud-kubernetes的服务:

org.springframework.cloud:spring-cloud-kubernetes-core:1.0.1.RELEASE

org.springframework.cloud:spring-cloud-kubernetes-discovery:1.0.1.RELEASE

b. 使用外挂fabric8-maven-plugin来构建映象并部署到minikube环境:

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

c. 为fabric8-maven-plugin外挂准备了三个profile,本次实战主要用到kubernetes这个:

kubernetes

io.fabric8

fabric8-maven-plugin

${fabric8.maven.plugin.version}

fmp

resource

build

NodePort

以上就是pom.xml的内容了,主要是新增spring-cloud-kubernetes的依赖,以及使用fabric8来构建和部署;

3.在application.properties档案中设定应用名称:

spring.application.name=springcloudk8sdiscovery

4.建立应用启动类Springcloudk8sdiscoveryApplication,可见这是个很普通的springboot启动类:

package com.bolingcavalry.springcloudk8sdiscovery;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@[email protected] class Springcloudk8sdiscoveryApplication {

public static void main(String[] args) {

SpringApplication.run(Springcloudk8sdiscoveryApplication.class, args);

}}

5.建立controller类,对外提供http服务,部署完成后通过这些http服务来验证功能:

@RestControllerpublic class DiscoveryController {

@Autowired

private DiscoveryClient discoveryClient;

/**

* 探针检查响应类

* @return

*/

@RequestMapping("/health")

public String health() {

return "health";

}

/**

* 返回远端呼叫的结果

* @return

*/

@RequestMapping("/getservicedetail")

public String getservicedetail(

@RequestParam(value = "servicename", defaultValue = "") String servicename) {

return "Service [" + servicename + "]\'s instance list : " + JSON.toJSONString(discoveryClient.getInstances(servicename));

}

/**

* 返回发现的所有服务

* @return

*/

@RequestMapping("/services")

public String services() {

return this.discoveryClient.getServices().toString()

+ ", "

+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

}}上述程式码有几点需要注意: a. health方法用于响应kubernetes的探针检查; b. getservicedetail方法接收名为servicename的引数,然后去服务列表中检查对应的服务物件并返回; c. services方法返回的是所有服务的名称;

以上就是所有程式码了,功能是通过autowire得到DiscoveryClient例项,再呼叫该例项的API取得服务资讯。

接下来我们将应用构建并部署到minikube环境;

编译构建

1.请确保当前电脑上java、maven、minikube都是正常的;

2.在pom.xml档案所在目录执行以下命令,即可编译构建部署一次性完成:

mvn clean package fabric8:deploy -Pkubernetes

构建成功后,控制台输出资讯如下:

...[INFO]

[INFO] [INFO]

[INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ springcloudk8sdiscovery ---[INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/demo/springcloudk8sdiscovery/target/classes/META-INF/fabric8/kubernetes.yml [INFO] Using namespace: default[INFO] Updating a Service from kubernetes.yml

[INFO] Updated Service: target/fabric8/applyJson/default/service-springcloudk8sdiscovery.json

[INFO] Using namespace: default[INFO] Updating Deployment from kubernetes.yml

[INFO] Updated Deployment: target/fabric8/applyJson/default/deployment-springcloudk8sdiscovery.json

[INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up

[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------[INFO] Total time: 11.207 s

[INFO] Finished at: 2019-06-09T18:50:09+08:00

[INFO] ————————————————————————

3.用kubectl命令检视部署和服务,都处于正常状态:

[[email protected] springcloudk8sdiscovery]# kubectl get deployments

NAME READY UP-TO-DATE AVAILABLE AGE

springcloudk8sdiscovery 1/1 1 1 75m[[email protected] springcloudk8sdiscovery]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 33h

springcloudk8sdiscovery NodePort 10.102.167.79 8080:31583/TCP 75m

4.执行命令minikube service springcloudk8sdiscovery –url,得到的是可以从外部访问的服务地址:http://192.168.121.133:31583 ,其中192.168.121.133是宿主机IP地址;

5.在浏览器上访问地址http://192.168.121.133:31583/services ,如下图,返回的”所有服务”其实是kubernetes中的所有service:

6.为了验证当前namespace下的所有服务都能被发现,我们再建立个服务实施,执行以下命令,会建立名为my-tomcat的部署和服务:

kubectl run my-tomcat --image=tomcat:7.0.94-jre7-alpine --replicas=2 --port=8080

&& kubectl expose deployment my-tomcat --port=8080 --target-port=8080 --external-ip=192.168.50.7 --type=LoadBalancer

由于下载映象需要一定时间,所以需要稍作等待;

7. 再去访问地址http://192.168.121.133:31583/services ,如下图,my-tomcat赫然在列:

8.访问地址http://192.168.121.133:31583/getservicedetail?servicename=my-tomcat ,会得到名为my-tomcat的服务资讯,该资讯格式化后的内容如下所示:

[

{

"host": "172.17.0.4",

"instanceId": "91201db9-8aa6-11e9-a5b5-000c29fd2001",

"metadata": {

"run": "my-tomcat"

},

"port": 8080,

"scheme": "http://",

"secure": false,

"serviceId": "my-tomcat",

"uri": "http://172.17.0.4:8080"

},

{

"host": "172.17.0.5",

"instanceId": "91223cda-8aa6-11e9-a5b5-000c29fd2001",

"metadata": {

"$ref": "$[0].metadata"

},

"port": 8080,

"scheme": "http://",

"secure": false,

"serviceId": "my-tomcat",

"uri": "http://172.17.0.5:8080"

}]

可见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世界。

来源:K8S中文社群

2020-01-13 04:50:00

相关文章