javascript
在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics
阿里云Kubernetes服務運行SpringCloud
osswangxining大俠在 阿里云Kubernetes SpringCloud 實踐進行時 系列文章中系統地介紹了如何在阿里云Kubernetes容器服務上搭建基于SpringCloud的微服務應用,其中涉及了從Eureka注冊,配置中心,網關Zuul,到服務追蹤和容錯等諸多內容,洋洋灑灑六篇文章,讓你充分領略在阿里云Kubernetes上運行SpringCloud的風采。
實踐進行時系列展示了SpringCloud的基本組件及如何部署和使用,本文則是從另外一個角度讓大家了解一個具有一定復雜度的應用是如何部署到阿里云Kubernetes容器服務上的。我們準備從基礎設施和應用部署的不同組合方式上來展示一個復雜的SpringCloud應用是如何部署到容器服務上的。
(一)基礎設施(Eureka,ConfigServer)和應用一起部署。
(二)在容器服務上搭建好基礎設施后,再部署應用
示例應用PiggyMetrics
PiggyMetrics是github上的一個SpringCloud應用項目,Star數目3400多。這個項目主體DockerCompose部署,包含了完整的源代碼以及構建好的容器鏡像,是非常不錯的SpringCloud容器化示例。
這個項目包含了3個業務微服務,分別是統計服務(Statistics Service)、賬戶服務(Account Service)和通知服務(Notification Service)。每個服務分別對應一個獨立的MongoDB。微服務架構圖示(采用作者原圖)如下:
SpringCloud基礎組件為負責服務注冊和registry服務(Eureka服務注冊),config服務(配置管理),gateway(API網關,同時也是JavaScript Web界面),monitor服務(Hystrix Dashboard/Turbine)等。
本文所用到的部署描述文件地址在github上,感興趣的讀者請移步 https://github.com/binblee/PiggyMetrics/tree/master/charts。
(一)用helm部署一鍵部署所有服務
PiggyMetrics的部署采用docker-compose YAML部署到單機,如果要部署到Kubernetes上,需要轉換成為K8S deployment YAML。社區有個docker compose轉k8s的轉換工具kompose,可以一鍵將compose文件轉換為k8s部署文件。
PiggyMetrics中的docker compose模版為2.1版kompose不支持,所以需要把compose文件改為版本2,去除kompose不支持的語法,如
depends_on:config:condition: service_healthy # 不支持 condition增加k8s server type annotation:
labels: kompose.service.type: loadbalancer讀者可以參考已經更改好的compose文件 https://github.com/binblee/PiggyMetrics/blob/master/charts/docker-compose.yml。
在執行kompose之前還需要設定PiggyMetrics部署所需的環境變量。
$ export NOTIFICATION_SERVICE_PASSWORD=passw0rd $ export CONFIG_SERVICE_PASSWORD=passw0rd $ export STATISTICS_SERVICE_PASSWORD=passw0rd $ export ACCOUNT_SERVICE_PASSWORD=passw0rd $ export MONGODB_PASSWORD=passw0rd $ kompose convert -f docker-compose.yml -o piggymetrics -ckompose的選項-c可以生成helm chart格式目錄結果,讀者可以用helm命令行把所有服務全部部署上去。
charts $ helm install -n piggymetrics piggymetrics/部署后可以看到類似如下輸出:
NAME: piggymetrics LAST DEPLOYED: Fri Jul 13 23:20:30 2018 NAMESPACE: default STATUS: DEPLOYEDRESOURCES: ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE account-mongodb ClusterIP 172.19.12.220 <none> 27017/TCP 1s account-service ClusterIP 172.19.3.168 <none> 6000/TCP 1s auth-mongodb ClusterIP 172.19.10.232 <none> 27017/TCP 1s auth-service ClusterIP 172.19.7.184 <none> 5000/TCP 1s config ClusterIP 172.19.7.86 <none> 8888/TCP 1s gateway LoadBalancer 172.19.7.183 <pending> 4000:32457/TCP 1s monitoring NodePort 172.19.8.129 <none> 9000:30688/TCP,8989:30437/TCP 1s notification-mongodb ClusterIP 172.19.0.154 <none> 27017/TCP 1s notification-service ClusterIP 172.19.8.69 <none> 8000/TCP 1s rabbitmq NodePort 172.19.8.192 <none> 5672:31438/TCP,15672:30001/TCP 1s registry LoadBalancer 172.19.12.23 <pending> 8761:32224/TCP 1s statistics-mongodb ClusterIP 172.19.7.53 <none> 27017/TCP 1s statistics-service ClusterIP 172.19.13.210 <none> 8888/TCP 1s==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE account-mongodb 1 0 0 0 1s account-service 1 0 0 0 1s auth-mongodb 1 0 0 0 1s auth-service 1 0 0 0 1s config 1 0 0 0 1s gateway 1 0 0 0 1s monitoring 1 0 0 0 1s notification-mongodb 1 0 0 0 1s notification-service 1 0 0 0 1s rabbitmq 1 0 0 0 1s registry 1 0 0 0 1s statistics-mongodb 1 0 0 0 1s statistics-service 1 0 0 0 1s==> v1/Pod(related) NAME READY STATUS RESTARTS AGE account-mongodb-5c5dbb6d6c-b66r2 0/1 ContainerCreating 0 1s account-service-7fd4976bfc-rngk5 0/1 ContainerCreating 0 1s auth-mongodb-6555c4b88-d7mw4 0/1 ContainerCreating 0 1s auth-service-7bdb99b5dc-l8sl5 0/1 ContainerCreating 0 1s config-8555868f45-qsclf 0/1 ContainerCreating 0 1s gateway-77857d9c49-dj7nt 0/1 ContainerCreating 0 1s monitoring-85d97bcff5-lvl9w 0/1 ContainerCreating 0 1s notification-mongodb-599648788-zfcl2 0/1 ContainerCreating 0 1s notification-service-5d5859d7-q8x4g 0/1 ContainerCreating 0 1s rabbitmq-545b846656-8mjpb 0/1 ContainerCreating 0 1s registry-757db89bb4-2g9hh 0/1 ContainerCreating 0 1scharts $讀者可以在自己的Minikube上嘗試,或者部署到阿里云容器服務Kubernetes版:https://www.aliyun.com/product/kubernetes。部署完成后進入服務列表頁面,可以看到所有服務以及對應LoadBalancer類型Service對外暴露的訪問地址及端口號。
點擊registry service可以進入到PiggyMetrics的界面。
PiggyMetrics是個人理財服務,用戶輸入收入和支出后可以展現漂亮的報表。不過現在使用會有一個問題:在使用過程中會出現“An error during data saving. Please, try again later”的錯誤提示,原因是PiggyMetrics所依賴匯率計算http://api.fixer.io API發生變化,而PiggyMetrics鏡像還沒有更新的緣故。
訪問registry service,可以看到所有注冊到Eureka Server上的服務。
將PiggyMetrics刪除,為下個實驗做準備:
charts $ helm delete --purge piggymetrics release "piggymetrics" deleted(二)部署應用到已有SpringCloud基礎組件的環境中
上面我們看到的是如何將全部基礎組件(Eureka,Zuul,ConfigServer,Hystrix Dashboard)和業務應用(gateway,notification,statistics)都統一用一個helm chart部署成功。在實際工作中,更常見的情況是在集群中已經有了Eureka等基礎組件,用戶日志只需部署和升級維護業務應用。
在阿里云Kubernetes版中的應用目錄中包含了SpringCloud基本組件。
我們可以先從應用目錄部署好Eureka服務。點擊ack-springcloud-eureka組件,進入如下界面:
讀者也可以進入參數頁面,查看或更改配置:
在這里選擇不改變任何參數直接部署。部署成功后進入阿里云Kubernetes控制臺服務頁面,可以看到,EurekaServer有兩個示例,對外暴露的服務地址為ack-springcloud-eureka-default-ack-springcloud-eureka-svc。
回想起在PiggyMetrics中,所有容器啟動時自動訪問的的Eureka服務名為registry。一般情況下,可以在鏡像中把Eureka服務名做為參數傳遞,但是在這個實驗中我們不準備改變任何代碼和鏡像,所以可以采取另外一個措施,那就是為把Eureka再多暴露一個叫registry的服務。
利用容器服務部署如下YAML文件,注意,如果讀者在應用目錄部署過程中更改了發布名稱,下面的內容也要做相應調整。
apiVersion: v1 kind: Service metadata:name: registry spec:type: LoadBalancerports:- port: 8761targetPort: 8761selector:app: ack-springcloud-eureka-default-ack-springcloud-eurekarelease: ack-springcloud-eureka-default您可以利用kubectl命令行:
$ kubectl apply -f registry-svc.yml或者容器服務控制臺界面完成:
部署完成后再次進入服務頁面,可以看到reigstry創建成功:
好了,下面我們把PiggyMetrics的helm chart目錄拷貝到一個新的目錄piggymetrics-no-eureka,刪除以下兩個文件。
templates/registry-deployment.yaml templates/registry-service.yaml這兩個文件是分別部署Eureka deployment/svc的YAML文件,由于我們在前面已經用應用目錄部署成功了一個新的registry服務作為基礎SpringCloud組件,這里就不要再重復部署了。
執行helm命令再次部署PiggyMetrics。
$ helm install -n piggymetrics piggymetrics-no-eureka/所有服務啟動成功后,訪問registry服務,可以看到所有PiggyMetrics服務均已正確地注冊到了EurekaServer中。
BINGO!PiggyMetrics應用已經部署到了含EurekaServer的環境上。訪問gateway,讀者可以看到熟悉的登陸界面。
示例代碼
本文所用到的部署描述文件地址https://github.com/binblee/PiggyMetrics/tree/master/charts。
PiggyMetrics 代碼地址在 https://github.com/sqshq/PiggyMetrics。
討論: 可以考慮修改源代碼中的調用解決api.fixer.io調用失敗的問題。例如把https://github.com/sqshq/PiggyMetrics/blob/master/gateway/src/main/resources/static/js/launch.js 中的
$.getJSON("http://api.fixer.io/latest?base=RUB", function( data ) {
改為對exchangeratesapi.io調用
$.getJSON("https://exchangeratesapi.io/api/latest?base=RUB", function( data ) {。
不過這個改動超越了本文的范圍,感興趣的讀者可以自行修改并重新構建鏡像再測試。
小結
本文展示了將PiggyMetrics SpringCloud應用部署到阿里云容器服務上。阿里云容器服務的應用目錄中提供常見的SpringCloud基礎組件,用戶可以很方便的部署一個SpringCloud環境。關于更多阿里云容器服務Kubernetes的內容,讀者可以訪問https://www.aliyun.com/product/kubernetes。
總結
以上是生活随笔為你收集整理的在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现Java集合迭代的高性能
- 下一篇: 配置MongoDB复制集