こんにちはspring-cloud-kubernetes

19522 ワード

spring-cloud-kubernetesについて
Spring-cloud-kubernetesはspringcloudが公式に発表したオープンソースプロジェクトで、Spring CloudとSpring Bootアプリケーションをkubernetes環境で実行し、共通のインタフェースを提供してkubernetesサービスを呼び出し、GitHubの公式アドレスは:https://github.com/spring-clo...
このプロジェクトの提出者の一人はSpringCloudの著者の一人Spencer Gibbです.
シリーズ記事リスト
本文は『spring-cloud-kubernetes実戦シリーズ』の第2編で、全文リンクは以下の通りである.
  • 『spring-cloud-kubernetes公式demo実行実戦』
  • 『こんにちはspring-cloud-kubernetes』
  • 『spring-cloud-kubernetesの背後にある3つの重要な知識点』
  • 『spring-cloud-kubernetesのサービス発見とポーリング実戦(溶断を含む)』
  • 『spring-cloud-kubernetesとSpringCloud Gateway』
  • 『spring-cloud-kubernetesとk 8 sのconfigmap』
  • 公式demoでspring-cloud-kubernetesを知る
    Spring-cloud-kubernetesプロジェクトは、開発者がspring-cloud-kubernetesを理解し、学習するのに役立つ豊富な公式demoを提供しています.
    実戦spring-cloud-kubernetes
    今日の実戦の内容は簡単なjavaアプリケーションを開発し、spring-cloud-kubernetesを通じて現在のkubernetesのサービスを呼び出すkubernetes環境(minikube 1.1.1)に配備することです.
    環境情報
    今回の実戦の環境とバージョン情報は以下の通りです.
  • オペレーティングシステム:CentOS Linux release 7.6.1810
  • minikube:1.1.1
  • Java:1.8.0_191
  • Maven:3.6.0
  • fabric 8-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/blo...
    このプロジェクトはGitHubのホームページにあります.
    git倉庫アドレス(https)
    https://github.com/zq2599/blo...
    このプロジェクトのソースコードの倉庫アドレス、httpsプロトコル
    git倉庫アドレス(ssh)
    [email protected]:zq2599/blog_demos.git
    このプロジェクトのソースコードの倉庫アドレス、sshプロトコル
    このgitプロジェクトには複数のフォルダがあります.この章のソースコードはspringcloudk 8 sdiscoveryというフォルダの下にあります.下の図の赤いボックスに示します.
    アプリケーションの開発
  • mavenに基づいてspringbootアプリケーションを作成します.springcloudk 8 sdiscoveryと呼ばれます.
  • このアプリケーションの完全な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の次の2つのライブラリに直接依存しています.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.プラグインfabric 8-maven-pluginを使用してミラーを構築し、minikube環境に配置します.
    
      io.fabric8
      fabric8-maven-plugin
      ${fabric8.maven.plugin.version}
      
        
          fmp
          
            resource
          
        
      
    

    c.fabric 8-maven-pluginプラグインのために3つのprofileを用意し、今回の実戦では主にkubernetesを使用した.
     
      kubernetes  
       
         
           
            io.fabric8  
            fabric8-maven-plugin  
            ${fabric8.maven.plugin.version}  
             
               
                fmp  
                
                  resource  
                  build 
                 
               
              
             
               
                 
                  
                     
                    NodePort 
                   
                 
               
             
           
         
       
    

    以上pom.xmlの内容は、主にspring-cloud-kubernetesの依存を追加し、fabric 8を使用して構築と導入します.
  • はアプリケーションにあります.propertiesファイルでのアプリケーション名の設定:
  • spring.application.name=springcloudk8sdiscovery
  • アプリケーション起動クラスSpringcloudk 8 sdiscoveryApplicationを作成します.これは一般的な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);
        }
    }
  • 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環境への構築と導入を適用します.
    ビルドのコンパイル
  • 現在のパソコンでjava、maven、minikubeが正常であることを確認してください.
  • は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] ------------------------------------------------------------------------
  • kubectlコマンドでデプロイメントとサービスを表示します.いずれも正常です.
  • [root@minikube springcloudk8sdiscovery]# kubectl get deployments
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
    springcloudk8sdiscovery   1/1     1            1           75m
    [root@minikube 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
  • コマンドminikubeサービスspringcloudk 8 sdiscovery--urlを実行し、外部からアクセス可能なサービスアドレスを取得します.http://192.168.121.133:31583このうち192.168.121.1133はホストIPアドレスである.
  • ブラウザでのアドレスへのアクセスhttp://192.168.121.133:31583/services次の図に示すように、返される「すべてのサービス」は、実際にはkubernetesのすべてのサービス:
  • です.
  • 現在の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

    ミラーをダウンロードするには一定の時間がかかるため、少し待つ必要があります.
  • 再アクセスアドレスhttp://192.168.121.133:31583/services、次の図、my-tomcatは列にあります:
  • アクセスアドレス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の「サービス」リソースをSpringCloudのサービスに対応していることがわかります.このDiscoveryClientがあれば、kubernetes環境ではeurekaを登録する必要がなく、kubernetesのサービスメカニズムを直接使用しています.この時SpringCloudのDiscoveryClientのデザインがこんなに素晴らしいと感慨せざるを得ません.
    これでspring-cloud-kubernetesの初体験は終わり、私たちのプログラムを簡単にコードすることでkubernetes環境でサービス資源の情報を得ることができ、学習が深まるにつれて、私たちはより多くのspring-cloud-kubernetes能力を使うことができ、spring-cloud-kubernetesの設計者に感謝し、私たちのSpringCloudアプリケーションをkubernetes世界で楽しむことができます.
    疑惑が解けない
    上記のコードはSpringCloudに関連しており、spring-cloud-kubernetesとは関係ありません.なぜプログラムが実行されるとkubernetes環境のサービス情報を取得できるのでしょうか.この問題を明らかにしなければ、後の学習は展開しにくい.私たちは自分のコードがkubernetes環境と何の関係があるのか分からないので、kubernetesと対話しているかどうか分からないからだ.
    以上の質問は、「spring-cloud-kubernetesの背後にある3つの重要な知識点」にアクセスしてください.詳細な分析があります.
    私の公衆番号に注目してください.