你好spring-cloud-kubernetes開源項目

你好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:

你好spring-cloud-kubernetes開源項目

通過官方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) [email protected]:zq2599/blog_demos.git 該項目源碼的倉庫地址,ssh協議

這個git項目中有多個文件夾,本章源碼在springcloudk8sdiscovery這個文件夾下,如下圖紅框所示: 你好spring-cloud-kubernetes開源項目

開發應用

1.基于maven創建一個springboot應用,名為springcloudk8sdiscovery;

2.該應用完整的pom.xml內容如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

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

    <modelVersion>4.0.0</modelVersion>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.1.1.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <groupId>com.bolingcavalry</groupId>

    <artifactId>springcloudk8sdiscovery</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>springcloudk8sdiscovery</name>

    <description>Demo project for Spring Boot</description>



    <properties>

        <java.version>1.8</java.version>

        <spring-boot.version>2.1.1.RELEASE</spring-boot.version>

        <maven-compiler-plugin.version>3.5</maven-compiler-plugin.version>

        <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>

        <maven-failsafe-plugin.version>2.18.1</maven-failsafe-plugin.version>

        <maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>

        <fabric8.maven.plugin.version>3.5.37</fabric8.maven.plugin.version>

    </properties>



    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-dependencies</artifactId>

                <type>pom</type>

                <scope>import</scope>

                <version>${spring-boot.version}</version>

            </dependency>

        </dependencies>

    </dependencyManagement>



    <dependencies>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-kubernetes-core</artifactId>

            <version>1.0.1.RELEASE</version>

        </dependency>



        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-kubernetes-discovery</artifactId>

            <version>1.0.1.RELEASE</version>

        </dependency>



        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-commons</artifactId>

            <version>2.1.1.RELEASE</version>

        </dependency>



        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter</artifactId>

            <version>2.1.1.RELEASE</version>

        </dependency>



        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

            <version>2.1.1.RELEASE</version>

        </dependency>



        <!--

            We need that(actuator) so that it can be used in readiness probes.

            Readiness checks are needed by arquillian, so that it

            knows when to run the actual test.

        -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-actuator</artifactId>

            <version>2.1.1.RELEASE</version>

        </dependency>



        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>fastjson</artifactId>

            <version>1.2.28</version>

        </dependency>

    </dependencies>





    <build>

        <plugins>

            <plugin>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-maven-plugin</artifactId>

                <version>${spring-boot.version}</version>

                <executions>

                    <execution>

                        <goals>

                            <goal>repackage</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>



            <plugin>

                <!--skip deploy -->

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-deploy-plugin</artifactId>

                <version>${maven-deploy-plugin.version}</version>

                <configuration>

                    <skip>true</skip>

                </configuration>

            </plugin>

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-surefire-plugin</artifactId>

                <version>${maven-surefire-plugin.version}</version>

                <configuration>

                    <skipTests>true</skipTests>

                    <!-- Workaround for https://issues.apache.org/jira/browse/SUREFIRE-1588 -->

                    <useSystemClassLoader>false</useSystemClassLoader>

                </configuration>

            </plugin>

            <plugin>

                <groupId>io.fabric8</groupId>

                <artifactId>fabric8-maven-plugin</artifactId>

                <version>${fabric8.maven.plugin.version}</version>

                <executions>

                    <execution>

                        <id>fmp</id>

                        <goals>

                            <goal>resource</goal>

                        </goals>

                    </execution>

                </executions>

            </plugin>

        </plugins>

    </build>



    <profiles>

        <profile>

            <id>kubernetes</id>

            <build>

                <plugins>

                    <plugin>

                        <groupId>io.fabric8</groupId>

                        <artifactId>fabric8-maven-plugin</artifactId>

                        <version>${fabric8.maven.plugin.version}</version>

                        <executions>

                            <execution>

                                <id>fmp</id>

                                <goals>

                                    <goal>resource</goal>

                                    <goal>build</goal>

                                </goals>

                            </execution>

                        </executions>

                        <configuration>

                            <enricher>

                                <config>

                                    <fmp-service>

                                        <type>NodePort</type>

                                    </fmp-service>

                                </config>

                            </enricher>

                        </configuration>

                    </plugin>

                </plugins>

            </build>

        </profile>

        <profile>

            <id>release</id>

            <build>

                <plugins>

                    <plugin>

                        <groupId>io.fabric8</groupId>

                        <artifactId>fabric8-maven-plugin</artifactId>

                        <version>${fabric8.maven.plugin.version}</version>

                        <executions>

                            <execution>

                                <id>fmp</id>

                                <goals>

                                    <goal>resource</goal>

                                    <goal>helm</goal>

                                </goals>

                            </execution>

                        </executions>

                    </plugin>

                </plugins>

            </build>

        </profile>



        <profile>

            <id>integration</id>

            <build>

                <plugins>

                    <plugin>

                        <groupId>io.fabric8</groupId>

                        <artifactId>fabric8-maven-plugin</artifactId>

                        <version>${fabric8.maven.plugin.version}</version>

                        <executions>

                            <execution>

                                <id>fmp</id>

                                <goals>

                                    <goal>resource</goal>

                                    <goal>build</goal>

                                </goals>

                            </execution>

                        </executions>

                    </plugin>

                    <plugin>

                        <groupId>org.apache.maven.plugins</groupId>

                        <artifactId>maven-failsafe-plugin</artifactId>

                        <version>${maven-failsafe-plugin.version}</version>

                        <executions>

                            <execution>

                                <id>run-integration-tests</id>

                                <phase>integration-test</phase>

                                <goals>

                                    <goal>integration-test</goal>

                                    <goal>verify</goal>

                                </goals>

                            </execution>

                        </executions>

                        <configuration>

                            <skipTests>false</skipTests>

                            <skipITs>false</skipITs>

                        </configuration>

                    </plugin>

                </plugins>

            </build>

        </profile>

    </profiles></project>

上述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環境:

<plugin>

  <groupId>io.fabric8</groupId>

  <artifactId>fabric8-maven-plugin</artifactId>

  <version>${fabric8.maven.plugin.version}</version>

  <executions>

    <execution>

      <id>fmp</id>

      <goals>

        <goal>resource</goal>

      </goals>

    </execution>

  </executions></plugin>

c. 為fabric8-maven-plugin插件準備了三個profile,本次實戰主要用到kubernetes這個:

<profile> 

  <id>kubernetes</id>  

  <build> 

    <plugins> 

      <plugin> 

        <groupId>io.fabric8</groupId>  

        <artifactId>fabric8-maven-plugin</artifactId>  

        <version>${fabric8.maven.plugin.version}</version>  

        <executions> 

          <execution> 

            <id>fmp</id>  

            <goals>

              <goal>resource</goal>  

              <goal>build</goal> 

            </goals> 

          </execution> 

        </executions>  

        <configuration> 

          <enricher> 

            <config> 

              <fmp-service>

                <!--部署到kubernetes后,會創建一個類型為NodePort的service--> 

                <type>NodePort</type> 

              </fmp-service> 

            </config> 

          </enricher> 

        </configuration> 

      </plugin> 

    </plugins> 

  </build> 

</profile>

以上就是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] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ springcloudk8sdiscovery <<<[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命令查看部署和服務,都處于正常狀態:

[root@minikube 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       <none>        443/TCP          33h

springcloudk8sdiscovery   NodePort    10.102.167.79   <none>        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: 你好spring-cloud-kubernetes開源項目

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赫然在列:  你好spring-cloud-kubernetes開源項目

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

疑惑待解

您可能會有些疑惑:上面的代碼都是和SpringCloud相關的,和spring-cloud-kubernetes沒什么關系呀,為什么程序運行起來后就能取得kubernetes環境中的服務信息呢? 此問題如果不弄清楚,后面的學習很難展開,因為我們都不知道自己的代碼與kubernetes環境有什么關系,和kubernetes有沒有交互?

本文只是初步了解spring-cloud-kubernetes,并不適合深入討論,這些問題還是留待下一章吧。

本文作者:欣宸,前阿里工程師

歡迎關注我的公眾號 (ID:程序員欣宸)

Service Mesh 實戰培訓

如果用一句話來解釋什么是  Service Mesh ,可以將它比作是應用程序或者說微服務間的  TCP/IP ,負責服務之間的網絡調用、限流、熔斷和監控。

目前比較熱門的 Service Mesh 開源解決方案有 Istio Istio  有著豐富的功能、設計,活躍的社區。為實現大家對 Service Mesh Istio 掌握與落地,為此我們推出 2 Service Mesh 實戰培訓班。

采用3+1+1新的培訓模式(3天線下實戰培訓,1年內可免費再次參加,每期前10名報名,可免費參加價值3600元的K8S線上直播班;),資深一線講師,實操環境實踐,現場答疑互動,培訓內容覆蓋:Istio簡介、安裝、數據平面Envoy、控制平面介紹、Mixer詳解、Pilot詳解、主要配置資源、流量管控、策略配置、遙測、落地的實戰、運維等

北京:6月22-23日

報名:https://www.bagevent.com/event/5262973

你好spring-cloud-kubernetes開源項目

推薦閱讀

  • 微服務需要拆分到什么程度?

  • Spring Cloud向Service Mesh轉變

  • 6 款最好用的數據庫監控工具

  • 從微服務到Service Mesh,企業架構演化探討

  • 5分鐘看懂Istio與給企業帶來的優勢

  • 使用Docker和Kubernetes將MongoDB作為微服務運行

  • Kubernetes 如何清理未使用的image和containe

  • 工行基于MySQL構建分布式架構的轉型之路

  • 搞搞 Prometheus: Alertmanager

  • LVS:三種負載均衡方式比較

  • 每月一次Kubernetes線上詭異事件

原文 

http://mp.weixin.qq.com/s?__biz=MzI5ODQ2MzI3NQ==&mid=2247487207&idx=1&sn=a1a659013b1f23e787f36e88ae58a3e3

本站部分文章源于互聯網,本著傳播知識、有益學習和研究的目的進行的轉載,為網友免費提供。如有著作權人或出版方提出異議,本站將立即刪除。如果您對文章轉載有任何疑問請告之我們,以便我們及時糾正。

PS:推薦一個微信公眾號: askHarries 或者qq群:474807195,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源,目前受益良多

轉載請注明原文出處:Harries Blog? » 你好spring-cloud-kubernetes開源項目

贊 (0)
分享到:更多 ()

評論 0

  • 昵稱 (必填)
  • 郵箱 (必填)
  • 網址
2013平特肖公式