本文介紹如何使用toolkit-maven-plugin插件分批發布已經部署在EDAS的Spring Cloud、Dubbo和HSF應用。
自動化部署
通過toolkit-maven-plugin插件自動化部署應用的流程為:添加插件依賴,配置插件,構建部署。
添加插件依賴
在pom.xml文件中增加如下所示的插件依賴。
<build> <plugins> <plugin> <groupId>com.alibaba.cloud</groupId> <artifactId>toolkit-maven-plugin</artifactId> <version>1.1.9</version> </plugin> </plugins> </build>
說明toolkit-maven-plugin建議使用最近版本。
配置插件
賬號配置
在打包工程的根目錄下創建文件格式為
YAML
的賬號配置文件,命名為toolkit_profile.yaml
并填入如下信息:regionId: # 應用所在區域,如北京為"cn-beijing",上海為"cn-shanghai",杭州為"cn-hangzhou"。 jarPath: # 部署包路徑,配置該參數可忽略Maven打包流程從而直接使用配置路徑內的包部署,您可配置絕對路徑和相對路徑。 accessKeyId: # 訪問阿里云資源的AccessKey ID,建議使用子賬號或RAM用戶的AccessKey ID,以降低安全風險。 accessKeySecret: # 訪問阿里云資源的AccessKey Secret,建議使用子賬號或RAM用戶的AccessKey Secret,以降低安全風險。
打包配置
在打包工程的根目錄下創建文件格式為
YAML
的打包配置文件。如果打包工程為Maven的子模塊,則需要在子模塊的目錄下創建該文件,并命名為toolkit_package.yaml
,填入如下信息:apiVersion: V1 kind: AppPackage spec: packageType: # 應用部署包類型,支持War、FatJar、Image、url;您只有在該處配置了URL,那么packageUrl才能生效。 packageUrl: # 如果應用部署包類型為War或FatJar,可填入此字段,不填則使用當前Maven構建的包進行部署。 imageUrl: # 如果部署包類型為Image,可填入此字段;Image類型也可以在本地構建Docker鏡像進行部署。
部署配置
在打包工程的根目錄下創建文件格式為
YAML
的部署文件,命名為toolkit_deploy.yaml
,并填入如下信息:apiVersion: V1 kind: AppDeployment spec: type: kubernetes target: appId: # 部署應用的ID。如果配置了appId,則無需配置namespaceId和appName。 namespaceId: # 應用所屬的微服務空間ID。如果不清楚appId,可使用namespaceId和appName(應用名稱)進行部署。 appName: # 應用名稱。如果不清楚appId,可使用namespaceId和appName進行部署。 updateStrategy: type: GrayBatchUpdate # 灰度分批發布。 grayUpdate: # 灰度設置。 gray: x # 整數值,含義為灰度實例數量。 batchUpdate: # 分批設置。 batch: x # 整數值,含義為批次數量。 releaseType: xxx # 發布方式:auto表示自動發布,manual表示手動發布。 batchWaitTime: x # 整數值,含義為批次間隔時間,單位分鐘。
構建部署
進入
pom.xml
所在的目錄(如果部署Maven子模塊,則進入子模塊pom.xml
所在的目錄),執行如下命令。mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml
命令參數含義為:
toolkit:deploy
:在打包完成后進行應用部署。-Dtoolkit_profile
:指定賬號配置文件。如果賬號文件跟pom.xml
在同一個目錄下,且名字為.toolkit_profile.yaml
(注意:文件名最前面有個小數點),可不填此參數,插件會自動獲取。-Dtoolkit_package
:指定打包文件。如果打包文件跟pom.xml
在同一個目錄下,且名字為.toolkit_package.yaml
(注意:文件名最前面有個小數點),可不填此參數,插件會自動獲取。-Dtoolkit_deploy
:指定部署文件。如果部署文件跟pom.xml
在同一個目錄下,且名字為.toolkit_deploy.yaml
(注意:文件名最前面有個小數點),可不填此參數,插件會自動獲取。-Ddeploy_version
:指定部署的版本號,優先級高于部署配置文件中的version配置。說明toolkit-maven-plugin插件1.0.6及以后版本支持配置該參數。
執行該打包命令后,系統顯示如下結果,當回顯信息中顯示BUILD SUCCESS表示部署成功。
更多配置項
打包參數
打包文件支持的參數如下所示。
apiVersion: V1 kind: AppPackage spec: packageType: # 應用部署包類型,支持War、FatJar、Image、url;您只有在該處配置了URL,那么packageUrl才能生效。 imageUrl: # 鏡像地址,Image包類型應用可填入。 packageUrl: # 包地址,War、FatJar類型應用可填入。 build: docker: dockerfile: # Docker鏡像構建文件。如您希望在本地構建鏡像部署,需填入此字段。 imageRepoAddress: # 阿里云鏡像倉庫地址。如您希望在本地構建鏡像部署,需填入此字段。 imageTag: # 鏡像Tag。如您希望在本地構建鏡像部署,需填入此字段。 imageRepoUser: # 阿里云鏡像倉庫用戶名。如您希望在本地構建鏡像部署,需填入此字段。 imageRepoPassword: # 阿里云鏡像倉庫密碼。如您希望在本地構建鏡像部署,需填入此字段。 oss: bucket: # 目標存儲桶名稱。如您希望使用自定義的OSS倉庫存儲部署包,需填入此字段。 key: # OSS自定義路徑。如您希望使用自定義的OSS倉庫存儲部署包,需填入此字段。 accessKeyId: # OSS賬號。如您希望使用自定義的OSS倉庫存儲包,需填入此字段。 accessKeySecret: # OSS密碼。如您希望使用自定義的OSS倉庫存儲包,可填入此字段。
部署參數
apiVersion: V1 kind: AppDeployment spec: type: kubernetes target: appName: # 應用名稱。 namespaceId: # 應用所在微服務空間。 appId: # 應用ID。插件會使用此應用進行部署,如未填入則使用namespaceId和appName來查找應用進行部署。 version: # 部署版本號,默認使用日時分秒格式。 jdk: # 部署的包依賴的JDK版本,JDK支持版本為Open JDK 7和Open JDK 8。鏡像不支持。 webContainer: # 部署的包依賴的Tomcat版本,WebContainer支持apache-tomcat-7.0.91。鏡像不支持。 batchWaitTime: # 分批等待時間。 command: # 鏡像啟動命令。該命令必須為容器內存在的可執行的對象。例如: sleep。設置該命令將導致鏡像原本的啟動命令失效。 commandArgs: # 鏡像啟動命令參數。上述啟動命令所需參數。 - 1d envs: # 容器環境變量參數。 - name: envtmp0 value: '0' - name: envtmp1 value: '1' liveness: # 容器健康檢查,健康檢查失敗的容器將停止運行并恢復。 exec: # exec、tcpSocket和httpGet三者選其一配置 command: - sleep - 1s tcpSocket: # exec、tcpSocket和httpGet三者選其一配置 host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) httpGet: # exec、tcpSocket和httpGet三者選其一配置 host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) path: "/health" scheme: "HTTP" # 可選值為HTTP、HTTPS httpHeaders: - name: "color" value: "blue" initialDelaySeconds: 5 timeoutSeconds: 11 periodSeconds: 5 successThreshold: 1 # 固定為1,不可修改 failureThreshold: 3 readiness: # 應用啟動狀態檢查,多次健康檢查失敗的容器將停止運行并重啟。不通過健康檢查的容器將不會有SLB流量進入。 exec: # exec、tcpSocket和httpGet三者選其一配置 command: - sleep - 1s tcpSocket: #exec、tcpSocket和httpGet三者選其一配置 host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) httpGet: #exec、tcpSocket和httpGet三者選其一配置 host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) path: "/health" scheme: "HTTP" # 可選值為HTTP、HTTPS httpHeaders: - name: "color" value: "blue" initialDelaySeconds: 5 timeoutSeconds: 11 periodSeconds: 5 successThreshold: 2 failureThreshold: 3 preStop: # 生命周期掛鉤,在容器刪除前觸發執行 exec: command: - /bin/bash - -c - ls /tmp httpGet: host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) path: "/health" scheme: "HTTP" # 可選值為HTTP、HTTPS httpHeaders: - name: "color" value: "blue" postStart: # 生命周期掛鉤,在容器創建后立即執行 exec: command: - /bin/bash - -c - ls /tmp httpGet: host: "192.168.1.109" # 此配置項可選,如未設置則默認為Pod IP port: "18081" # 端口(注意,此處為字符串類型) path: "/health" scheme: "HTTP" # 可選值為HTTP、HTTPS httpHeaders: - name: "color" value: "blue" configMountDescs: # 配置管理 - type: "ConfigMap" # 可選值為 ConfigMap、Secret name: "configtest" mountPath: "/home/admin" # 如此值為目錄,則需配置mountItems來掛載到文件 mountItems: # 掛載到文件 - key: "test-name" path: "test" useSubPath: true # 當掛載到文件時,此值為true表示保留源文件,為false表示覆蓋源文件 javaStartUpConfig: # Java啟動參數配置,根據實際情況設置相應值 initialHeapSize: # 初始堆內存 original: 1000 startup: "-Xms1000m" maxHeapSize: # 最大堆內存 original: 1000 startup: "-Xmx1000m" newSize: # 初始新生代 original: 200 startup: "-XX:NewSize=200m" maxNewSize: # 最大新生代 original: 200 startup: "-XX:MaxNewSize=200m" survivorRatio: # Eden/Survivor比例 original: 2 startup: "-XX:SurvivorRatio=2" newRatio: # 老年代/新生代比例 original: 8 startup: "-XX:NewRatio=8" permSize: # 持久代內存 original: 512 startup: "-XX:PermSize=512m" maxPermSize: # 最大持久代內存 original: 512 startup: "-XX:MaxPermSize=200m" maxDirectMemorySize: # 直接內存 original: 100 startup: "-XX:MaxDirectMemorySize=100m" threadStackSize: # 棧大小 original: 500 startup: "-XX:ThreadStackSize=500" hsfserverPort: # HSF端口 original: 12200 startup: "-Dhsf.server.port=12200" hsfserverMinPoolSize: # HSF最小線程池 original: 50 startup: "-Dhsf.server.min.poolsize=50" hsfserverMaxPoolSize: # HSF最大線程池 original: 720 startup: "-Dhsf.server.max.poolsize=720" youngGarbageCollector: # 年輕代GC策略 original: "UseSerialGC" #可選值為 UseSerialGC、UseG1GC、UseParNewGC、UseParallelGC startup: "-XX:+UseSerialGC" # 當值為UseG1GC、UseParNewGC 或 UseParallelGC 時,此值為空字符串 oldGarbageCollector: # 老年代GC策略 original: "UseConcMarkSweepGC" # 可選值為 UseConcMarkSweepGC、UseSerialGC、UseG1GC、UseConcMarkSweepGC、UseParNewGC、UseParallelOldGC、UseParallelGC startup: "-XX:+UseConcMarkSweepGC" # 格式為-XX:+<GC策略> concGCThreads: # 并發GC線程數 original: 5 startup: "-XX:ConcGCThreads=5" parallelGCThreads: # 并行GC線程數 original: 5 startup: "-XX:ParallelGCThreads=5" g1HeapRegionSize: # G1 Region文件大小 original: 50 startup: "-XX:G1HeapRegionSize=50m" gclogFilePath: # gc日志目錄 original: "/tmp/" startup: "-Xloggc:/tmp/" useGCLogFileRotation: # GC日志滾動 original: true startup: "-XX:+UseGCLogFileRotation" numberOfGCLogFiles: # GC日志數量 original: 5 startup: "-XX:NumberOfGCLogFiles=5" gclogFileSize: # GC日志大小 original: 100 startup: "-XX:GCLogFileSize=100m" heapDumpOnOutOfMemoryError: # 打開OOM Dump original: true startup: "-XX:+HeapDumpOnOutOfMemoryError" heapDumpPath: #OOM Dump文件路徑 original: "/tmp/dumpfile" startup: "-XX:HeapDumpPath=/tmp/dumpfile" customParams: # 自定義參數 original: "-Dtest=true" startup: "-Dtest=true" deployAcrossZones: "true" # 盡量多可用區部署(注意,此值為字符串類型) deployAcrossNodes: "true" # 盡量多節點部署(注意,此值為字符串類型) customTolerations: # 調度容忍 - key: aa operator: Exists effect: NoSchedule - key: bb operator: Equal value: "111" effect: "NoExecute" tolerationSeconds: 111 customAffinity: # 自定義調度規則 nodeAffinity: # 節點親和性規則 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "beta.kubernetes.io/arch" operator: "Gt" values: - "11" preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: "beta.kubernetes.io/arch" operator: "Gt" values: - "11" podAffinity: # 應用(Pod)親和性規則 requiredDuringSchedulingIgnoredDuringExecution: - namespaces: - "default" topologyKey: "failure-domain.beta.kubernetes.io/zone" labelSelector: matchExpressions: - key: "beta.kubernetes.io/arch" operator: "In" values: - "11" preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podAffinityTerm: namespaces: - "default" topologyKey: "failure-domain.beta.kubernetes.io/region" labelSelector: matchExpressions: - key: "beta.kubernetes.io/arch" operator: "Exists" values: [] podAntiAffinity: # 應用(Pod)反親和性規則 requiredDuringSchedulingIgnoredDuringExecution: - namespaces: - "default" topologyKey: "kubernetes.io/hostname" labelSelector: matchExpressions: - key: "beta.kubernetes.io/arch" operator: "In" values: - "11" preferredDuringSchedulingIgnoredDuringExecution: - weight: 2 podAffinityTerm: namespaces: - "default" topologyKey: "kubernetes.io/hostname" labelSelector: matchExpressions: - key: "beta.kubernetes.io/arch" operator: "In" values: - "11"
典型場景示例
典型部署場景及相關配置示例。
場景一:本地構建War(或FatJar)包進行部署
假設您在北京環境有WAR(或FatJar)類型的EDAS應用,期望本地構建WAR(或FatJar)進行部署。打包配置和部署配置如下所示:
打包文件:
apiVersion: V1 kind: AppPackage spec: packageType: War
部署文件:
apiVersion: V1 kind: AppDeployment spec: type: kubernetes target: appId: # 應用ID。插件會使用此應用進行部署,如未填入則使用namespaceId和appName來查找應用進行部署。 namespaceId: # 【可選】微服務空間,如不清楚appId,可使用此微服務空間及應用名稱進行部署。 appName: # 【可選】應用名稱,如不清楚appId,可使用此微服務空間及應用名稱進行部署。
場景二:使用已有鏡像地址部署鏡像類型應用
假設您在北京環境有一個鏡像類型應用,期望使用已有的鏡像(registry.cn-beijing.aliyuncs.com/test/gateway:latest )部署應用。打包配置和部署配置如下所示:
打包文件:
apiVersion: V1 kind: AppPackage spec: packageType: Image imageUrl: registry.cn-beijing.aliyuncs.com/test/gateway:latest
部署文件:
apiVersion: V1 kind: AppDeployment spec: type: kubernetes target: appId: # 應用ID。插件會使用此應用進行部署,如未填入則使用namespaceId和appName來查找應用進行部署。 namespaceId: # 【可選】微服務空間,如不清楚appId,可使用此微服務空間及應用名稱進行部署。 appName: # 【可選】應用名稱,如不清楚appId,可使用此微服務空間及應用名稱進行部署。
場景三:本地構建鏡像上傳至倉庫并部署應用
假設您在北京環境有鏡像類型應用,期望在本地編譯并構建為鏡像,并上傳到阿里云鏡像倉庫進行部署,打包配置和部署配置如下所示:
打包文件:
apiVersion: V1 kind: AppPackage spec: packageType: Image build: docker: dockerfile: Dockerfile # 指定Dockerfile。 imageRepoAddress: # 鏡像倉庫地址。 imageTag: # 鏡像Tag。 imageRepoUser: # 鏡像倉庫用戶名。 imageRepoPassword: # 鏡像倉庫密碼。
部署文件:
apiVersion: V1 kind: AppDeployment spec: type: kubernetes target: appId: # 應用ID。插件會使用此應用進行部署,如未填入則使用namespaceId和appName來查找應用進行部署。 namespaceId: # 【可選】微服務空間,如不清楚appId,可使用此微服務空間及應用名稱進行部署。 appName: # 【可選】應用名稱,如不清楚appId,可使用此微服務空間及應用名稱進行部署。