spring-cloud-kubernetes官方demo運行實戰

      網友投稿 772 2025-03-31

      歡迎訪問我的GitHub

      這里分類和匯總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos

      關于spring-Cloud-Kubernetes

      spring-Cloud-Kubernetes是springcloud官方推出的開源項目,用于將Spring Cloud和Spring Boot應用運行在kubernetes環境,并且提供了通用的接口來調用kubernetes服務,GitHub上官方地址是:https://github.com/spring-cloud/spring-cloud-kubernetes

      官方demo

      官方提供了簡單的demo用于快速了解spring-cloud-kubernetes,我們就來一起將此demo源碼編譯構建,然后在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指南 》

      下載源碼

      官方demo包含在整個spring-cloud-kubernetes開源項目中,因此要下載整個開源項目,由于主干的提交一直很活躍,因此最好下載個release版本,我這里下載的是

      v1.0.1.RELEASE

      ,如下圖紅框所示,地址是:https://github.com/spring-cloud/spring-cloud-kubernetes/releases

      修改maven設置

      需要事先修改maven的設置,否則編譯構建的時候會報錯:

      打開maven的配置文件settings.xml,完整路徑是apache-maven-3.6.0/conf/settings.xm;

      在settings.xml文件內,找到pluginGroups節點,在里面增加兩行,修改完成后效果如下:

      io.fabric8 org.springframework.boot

      修改完畢保存退出,maven設置完成;

      如果您想了解該錯誤的細節,請參考文章《使用fabric8-maven-plugin插件的錯誤處理(No plugin found for prefix ‘fabric8’)》

      編譯項目源碼

      將上圖中的源碼下載解壓,得到一個新的文件夾

      spring-cloud-kubernetes-1.0.1.RELEASE

      進入文件夾spring-cloud-kubernetes-1.0.1.RELEASE,執行命令

      mvn clean compile -U

      ,完全編譯整個工程,由于要下載大量依賴庫所以較為耗時,我這里是二十分鐘以上(這一步不是必須的,看個人愛好吧),構建通過后如下所示:

      [INFO] Reactor Summary for Spring Cloud Kubernetes 1.0.1.RELEASE: [INFO] [INFO] Spring Cloud Kubernetes :: Dependencies ............ SUCCESS [ 0.077 s] [INFO] Spring Cloud Kubernetes ............................ SUCCESS [ 2.575 s] [INFO] Spring Cloud Kubernetes :: Core .................... SUCCESS [01:51 min] [INFO] Spring Cloud Kubernetes :: Config .................. SUCCESS [ 21.357 s] [INFO] Spring Cloud Kubernetes :: Discovery ............... SUCCESS [ 6.473 s] [INFO] Spring Cloud Kubernetes :: Ribbon .................. SUCCESS [ 31.616 s] [INFO] Spring Cloud Kubernetes :: Starter ................. SUCCESS [ 0.558 s] [INFO] Spring Cloud Kubernetes :: Starter :: Config ....... SUCCESS [ 0.569 s] [INFO] Spring Cloud Kubernetes :: Starter :: Ribbon ....... SUCCESS [ 0.595 s] [INFO] Spring Cloud Kubernetes :: Starter :: All .......... SUCCESS [ 0.571 s] [INFO] Spring Cloud Kubernetes :: Examples ................ SUCCESS [ 0.558 s] [INFO] Spring Cloud Kubernetes :: Examples :: Reload ConfigMap SUCCESS [ 9.077 s] [INFO] Spring Cloud Kubernetes :: Examples :: Hello World . SUCCESS [ 1.323 s] [INFO] Spring Cloud Kubernetes :: Leader .................. SUCCESS [ 7.395 s] [INFO] Spring Cloud Kubernetes :: Examples :: Leader Election SUCCESS [ 0.594 s] [INFO] Spring Cloud Kubernetes :: Istio ................... SUCCESS [ 12.788 s] [INFO] Spring Cloud Kubernetes :: Integration Tests ....... SUCCESS [ 0.574 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Core SUCCESS [02:14 min] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Configmap SUCCESS [ 0.646 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Istio SUCCESS [ 0.623 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Parent SUCCESS [ 0.564 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service A SUCCESS [ 0.605 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service B SUCCESS [ 0.625 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Client SUCCESS [ 0.608 s] [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Tests SUCCESS [ 1.440 s] [INFO] Spring Cloud Kubernetes Docs ....................... SUCCESS [ 0.583 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 05:53 min [INFO] Finished at: 2019-06-08T19:32:19+08:00 [INFO] ------------------------------------------------------------------------

      進入目錄

      spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example

      ,這里面就是官方的入門demo,執行以下命令開始構建并且會部署到minikube:

      mvn clean package fabric8:deploy -Pkubernetes

      構建和部署完成后,控制臺輸出以下信息:

      ... [INFO] Installing /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/kubernetes-hello-world-1.0.1.RELEASE-sources.jar to /root/.m2/repository/org/springframework/cloud/kubernetes-hello-world/1.0.1.RELEASE/kubernetes-hello-world-1.0.1.RELEASE-sources.jar [INFO] [INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ kubernetes-hello-world <<< [INFO] [INFO] [INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ kubernetes-hello-world --- [INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/classes/META-INF/fabric8/kubernetes.yml [INFO] Using namespace: default [INFO] Creating a Service from kubernetes.yml namespace default name kubernetes-hello-world [INFO] Created Service: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/service-kubernetes-hello-world.json [INFO] Using namespace: default [INFO] Creating a Deployment from kubernetes.yml namespace default name kubernetes-hello-world [INFO] Created Deployment: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/deployment-kubernetes-hello-world.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: 16.047 s [INFO] Finished at: 2019-06-08T19:50:50+08:00 [INFO] ------------------------------------------------------------------------

      查看服務,已經創建了,類型是NodePort ,并且將8080端口映射到宿主機的30700端口,說明可以用

      http://宿主機IP:30700

      來訪問此服務:

      [root@minikube kubernetes-hello-world-example]# kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 443/TCP 10h kubernetes-hello-world NodePort 10.108.214.207 8080:30700/TCP 4m

      查看部署,

      發現始終未能進入READY狀態

      [root@minikube kubernetes-hello-world-example]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-hello-world 0/1 1 0 4m46s

      查看pod,

      發現新建的pod始終未能進入READY狀態

      [root@minikube kubernetes-hello-world-example]# kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-hello-world-7578f45c5d-hr4r7 0/1 Running 1 6m

      從上面的信息可以看出,部署雖然已經完成,但是pod是不可用的,訪問網頁試試,如下圖,果然無法訪問:

      檢查問題

      執行命令

      kubectl describe pod kubernetes-hello-world-7578f45c5d-hr4r7

      檢查pod的具體情況,如下圖紅框所示,兩個探針檢查都失敗了:

      再看看控制臺輸出的pod基本情況,里面有探針的信息,如下圖所示,兩個探針的地址都是

      spring-cloud-kubernetes官方demo運行實戰

      /health

      打開demo的源碼,如下所示,根本就沒有路徑為

      /health

      的服務:

      @RestController public class HelloController { private static final Log log = LogFactory.getLog(HelloController.class); @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/") public String hello() { return "Hello World"; } @RequestMapping("/services") public List services() { return this.discoveryClient.getServices(); } }

      現在真相大白了:部署到minikube上的pod,配置了探針地址是

      /health

      ,但是服務中并沒有此路徑,因此探針檢查一直無法通過;

      解決問題

      搞清楚問題之后就可以動手解決問題了,這里有兩種解決方式:

      第一種,修改HelloController.java,增加一個方法,對應的地址是

      /health

      的服務;

      第二種,修改deployment的配置,將探針地址改為現有的服務,例如"/",這是個可用的服務;

      第一種方法很簡單,留給讀者您來完成吧,我們來試試第二種:

      執行以下命令,開始編輯deployment:

      kubectl edit deployment kubernetes-hello-world

      在編輯頁面上找到兩個探針的配置,都從"/health"改成"/",如下圖兩個紅框所示:

      修改完畢后,像普通vim操作一樣"wq"保存退出,配置會立即生效,稍等一會兒再看pod情況,發現pod的name已經變了,并且狀態已經成為Ready,證明舊的pod已經銷毀,新的pod被創建并且探針測試通過:

      [root@minikube examples]# kubectl get pods NAME READY STATUS RESTARTS AGE kubernetes-hello-world-6c5f75ff74-dnm2q 1/1 Running 0 15s

      訪問地址http://192.168.121.133:30700 ,服務正常(192.168.121.133是宿主機IP地址),如下圖:

      官方解釋

      官方的demo無法在minikube上正常運行,還要我們自己去修改配置或者源碼,官方的demo不應該會這樣,在kubernetes-hello-world-example工程內的README.md文檔中發現了對此問題的說明,如下圖紅框所示,fabric8的maven插件在生成探針配置的是時候配錯了URL,因此官方建議我們去修改deployment的配置,將探針的地址從"/health"改為"/actuator/heath",這個問題已經被提交到了fabric8社區,并且貼出了鏈接:

      權限問題

      剛才我們看過了HelloController.java的源碼,里面還有個路徑為"/services"的接口,在minikube環境下訪問此接口可以成功返回,內容是當前minikube環境的服務信息,但是如果部署在正式的kubernetes環境,訪問此接口會返回以下錯誤:

      Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. services is forbidden: User "system:serviceaccount:default:default" cannot list resource "services" in API group "" in the namespace "default"

      也就是說當前的system:serviceaccount賬號是沒有權限通過API server訪問"services"資源的,此時最快的解決辦法是提升賬號權限:

      kubectl create clusterrolebinding permissive-binding \ --clusterrole=cluster-admin \ --user=admin \ --user=kubelet \ --group=system:serviceaccounts

      注意:以上辦法只能用于開發和測試環境,不要用在生產環境,在生產環境應該參考Kubernetes的RBAC授權相關設置來處理。

      修改源碼時遇到的錯誤怎么規避

      如果您想嘗試修改demo的源碼并且部署上去,在編譯階段可能遇到以下問題:

      [root@minikube kubernetes-hello-world-example]# mvn clean package fabric8:deploy -Pkubernetes [INFO] Scanning for projects... [INFO] [INFO] ----------< org.springframework.cloud:kubernetes-hello-world >---------- [INFO] Building Spring Cloud Kubernetes :: Examples :: Hello World 1.0.1.RELEASE [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ kubernetes-hello-world --- [INFO] Deleting /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target [INFO] [INFO] --- maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) @ kubernetes-hello-world --- [INFO] 開始檢查…… [ERROR] /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/src/main/java/org/springframework/cloud/kubernetes/examples/HelloController.java:33: 當前行匹配非法表達式: 'Trailing whitespace'。 [Regexp] 檢查完成。 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.976 s [INFO] Finished at: 2019-06-08T22:15:37+08:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) on project kubernetes-hello-world: Failed during checkstyle execution: There is 1 error reported by Checkstyle 8.12 with checkstyle.xml ruleset. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

      出現上述問題的原因是maven-checkstyle-plugin插件檢查代碼的style沒有通過,我試過在mvn命令中添加skip參數,也試過在pom.xml中添加maven-checkstyle-plugin節點并且配置為skip,結果都沒有用,最終用以下方法成功規避了此問題:

      打開pom.xml文件;

      找到節點properties(如果沒有就創建),增加以下三個屬性配置,這樣配置的作用是在style檢查失敗、校驗失敗、單元測試代碼檢查失敗這三種情況下,都不會導致整個maven構建的失敗:

      false false false

      至此,官方demo的部署和運行都完成了,對spring-cloud-kubernetes算是有了初步認識,接下來的實戰中,我們一起去深入的了解spring-cloud-kubernetes,看看kubernetes上的springcloud應用怎么開發;

      問題處理

      感謝

      jason9211

      的提醒,如果讀者您也遇到類似問題,請參考如下:

      如果在deploy時遇到 “the server could not find the requested resource”問題, 建議把fabric8.maven.plugin的版本升級到4.2.0即可。 4.2.0

      歡迎關注華為云博客:程序員欣宸

      學習路上,你不孤單,欣宸原創一路相伴…

      Kubernetes Spring Spring Cloud

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel讓新插入的列自動繼承表樣式(excel表格新增一行)
      下一篇:空白頁刪不掉(wps多出來一頁空白頁刪不掉)
      相關文章
      亚洲成人影院在线观看| 亚洲狠狠爱综合影院婷婷| 亚洲无av在线中文字幕| 一本久久综合亚洲鲁鲁五月天 | 亚洲精品天堂在线观看| 99热亚洲色精品国产88| 亚洲一区二区三区国产精品无码| 亚洲国产精品综合福利专区| 亚洲精品午夜久久久伊人| 亚洲视频欧洲视频| 亚洲精品一卡2卡3卡三卡四卡| 亚洲美女视频免费| 91亚洲自偷在线观看国产馆| 亚洲午夜久久久精品电影院| 亚洲资源最新版在线观看| 亚洲一区中文字幕| 亚洲一区二区三区成人网站| 亚洲熟妇AV一区二区三区宅男| 亚洲人成色77777在线观看| 亚洲av永久中文无码精品 | 亚洲色无码专区一区| 亚洲日本VA午夜在线电影| 亚洲欧美成aⅴ人在线观看| 鲁死你资源站亚洲av| 亚洲AⅤ永久无码精品AA| 亚洲毛片不卡av在线播放一区| 久久久青草青青国产亚洲免观 | 亚洲色欲色欲www在线播放| 色婷婷六月亚洲综合香蕉| 亚洲成年人啊啊aa在线观看| 国产午夜亚洲精品国产成人小说| 亚洲国产精品无码久久一区二区| 亚洲精品国产成人99久久| 亚洲成a人不卡在线观看| 2020亚洲男人天堂精品| 亚洲av纯肉无码精品动漫| 亚洲婷婷国产精品电影人久久| 国产亚洲成av人片在线观看| 日本久久久久亚洲中字幕| 亚洲午夜电影在线观看高清| 亚洲欧美熟妇综合久久久久|