你好springcloudkubernetes开源项目

2023年 7月 9日 30.1k 0

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

关于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上下载本次实战的源码,地址和链接信息如下表所示:

    名称 链接 备注
    项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
    git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
    git仓库地址(ssh) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议

    这个git项目中有多个文件夹,本章源码在springcloudk8sdiscovery这个文件夹下,如下图红框所示: 你好spring-cloud-kubernetes开源项目-1

    开发应用

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

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

    
    
    
        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;
    
    
    
    @SpringBootApplication
    
    @EnableDiscoveryClient
    
    public class Springcloudk8sdiscoveryApplication {
    
    
    
        public static void main(String[] args) {
    
            SpringApplication.run(Springcloudk8sdiscoveryApplication.class, args);
    
        }
    
    }

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

    @RestController
    
    public 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]

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论