全部產品
Search
文件中心

Enterprise Distributed Application Service:使用toolkit-maven-plugin外掛程式分批發布應用(K8s)

更新時間:Jun 30, 2024

本文介紹如何使用toolkit-maven-plugin外掛程式分批發布已經部署在EDAS的Spring Cloud、Dubbo和HSF應用。

自動化部署

通過toolkit-maven-plugin外掛程式自動化部署應用的流程為:添加外掛程式依賴,配置外掛程式,構建部署。

  1. 添加外掛程式依賴

    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建議使用最近版本。

  2. 配置外掛程式

    配置外掛程式主要包含帳號配置,打包配置及部署配置。如果需要更多自訂配置項,請參見打包參數部署參數

    1. 帳號配置

      在打包工程的根目錄下建立檔案格式為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,以降低安全風險。
    2. 打包配置

      在打包工程的根目錄下建立檔案格式為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鏡像進行部署。
    3. 部署配置

      在打包工程的根目錄下建立檔案格式為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        # 整數值,含義為批次間隔時間,單位分鐘。
  3. 構建部署

    進入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表示部署成功。

更多配置項

  1. 打包參數

    打包檔案支援的參數如下所示。

    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倉庫儲存包,可填入此欄位。
  2. 部署參數

    單擊此處展開部署檔案支援的參數。

    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,可使用此微服務空間及應用程式名稱進行部署。