本文介紹如何將一個較複雜的應用部署到阿里雲KubernetesContainer Service上,下面將從基礎設施和應用部署的不同組合方式,來部署一個複雜的SpringCloud應用。

部署方式

  1. 基礎設施(Eureka,ConfigServer)和應用一起部署。
  2. 在Container Service上搭建好基礎設施後,再部署應用。

樣本應用PiggyMetrics

PiggyMetrics是github上的一個SpringCloud應用項目,Star數目3400多。這個項目主體採用Docker Compose部署,包含了完整的原始碼以及構建好的容器鏡像,是非常不錯的SpringCloud容器化樣本。

這個項目包含了3個業務微服務,分別是統計服務(Statistics Service)、賬戶服務(Account Service)和通知服務(Notification Service)。每個服務分別對應一個獨立的MongoDB。微服務架構圖示(採用作者原圖)如下:

SpringCloud基礎組件為負責服務註冊和registry服務(Eureka服務註冊),config服務(組態管理),gateway(API Gateway,同時也是JavaScript Web介面),monitor服務(Hystrix Dashboard/Turbine)等。

本文所用到的部署描述檔案地址在github上,若您感興趣,請參考連結: https://github.com/binblee/PiggyMetrics/tree/master/charts

情境一 用helm部署一鍵部署所有服務

PiggyMetrics的部署採用docker-compose YAML部署到單機,如果要部署到Kubernetes環境中 ,需要轉換成為Kubernetes deployment YAML。社區有個docker compose轉換成Kubernetes編排的轉換工具 kompose,可以一鍵將compose檔案轉換為Kubernetes部署檔案。
说明 PiggyMetrics中的 docker compose模版為2.1版,kompose不支援該版本,所以需要把compose檔案改為版本2。
此外,還要去除kompose不支援的文法:
depends_on:
      config:
        condition: service_healthy  # 不支援 condition
增加Kubernetes 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/

部署後可以看到輸出成功資訊。

您可以在自己的Minikube上嘗試,或者部署到阿里雲Container ServiceKubernetes版:https://www.aliyun.com/product/kubernetes。部署完成後進入服務列表頁面,可以看到所有服務以及對應LoadBalancer類型Service對外暴露的訪問地址及連接埠號碼。



單擊registry service可以進入到PiggyMetrics的介面。

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等基礎組件,您只需部署和升級維護業務應用。

在阿里雲Container ServiceKubernetes版中,應用目錄中包含了SpringCloud基本組件。


我們可以先從應用目錄部署好Eureka服務。單擊ack-springcloud-eureka組件,進入如下介面:


您也可以單擊 參數,進入參數頁面,查看或更改配置:


在這裡選擇不改變任何參數,單擊右側建立,直接部署。

部署成功後,在阿里雲Container Service控制台中,單擊左側導覽列中 應用 > 服務,選擇叢集和命名空間,進入服務列表頁面。可以看到,EurekaServer有兩個樣本,對外暴露的服務地址為 ack-springcloud-eureka-default-ack-springcloud-eureka-svc


在PiggyMetrics中,所有容器啟動時自動訪問的的Eureka服務名為registry。一般情況下,可以在鏡像中把Eureka服務名作為參數傳遞,但是在這個實驗中我們不準備改變任何代碼和鏡像,所以可以採取另外一個措施,那就是為Eureka多暴露一個叫registry的服務。

利用Container Service部署如下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中。


PiggyMetrics應用已經部署到了包含EurekaServer的環境上。訪問GATEWAY即可看到熟悉的登入介面。