阿裡雲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 -c
kompose的選項
-c
可以生成
helm chart格式目錄結果,讀者可以用
helm指令行把所有服務全部部署上去。
charts $ helm install -n piggymetrics piggymetrics/
部署後可以看到類似如下輸出:
NAME: piggymetrics
LAST DEPLOYED: Fri Jul 13 23:20:30 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> 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 1s
charts $
讀者可以在自己的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.ioAPI發生變化,而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: LoadBalancer
ports:
- port: 8761
targetPort: 8761
selector:
app: ack-springcloud-eureka-default-ack-springcloud-eureka
release: 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
,讀者可以看到熟悉的登陸界面。
示例代碼
本文所用到的部署描述檔案位址
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的内容,讀者可以通路