自動化部署
通過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"