管理服務發布作業

本頁面說明如何使用服務基礎架構逐步推行服務設定。

更新實際工作環境服務的設定是一項有風險的作業,可能導致服務中斷。Service Management API 可讓您逐步推行設定異動,進而減輕不良的服務設定所造成的影響。

您可以部署多個服務設定版本,並定義這些版本在執行階段的使用方式,方法是呼叫 services.rollouts.create 方法來啟動推出程序。您一次最多可以同時推行 5 種服務設定。

事前準備

如要執行本指南中的範例程式碼,請務必先參閱開始使用 Service Management API 一文,並按照其中說明完成初始設定。

執行推行活動

假設您是採用 Service Management API 建構 代管服務 endpointsapis.appspot.com,可以執行下列步驟,在受控制的情況下分階段推行服務設定異動。

舉例來說,endpointsapis.appspot.com 目前使用服務設定 old,您想將其變更為使用服務設定 new。您不需讓所有生產流量都立刻使用新的服務設定,只要建立推行活動來透過 10% 的總流量測試新服務設定即可:

# Create rollout to test the new configuration with 10% traffic.
$ gcurl -d '{
  "rolloutId": "canary-rollout",
  "serviceName": "endpointsapis.appspot.com",
  "trafficPercentStrategy": {
    "percentages": {
      "new": 10,
      "old": 90
    }
  }
}' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts
{
  "name": "operations/rollouts.endpointsapis.appspot.com:canary-rollout"
  "metadata": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata",
    "resourceNames": [
      "services/endpointsapis.appspot.com/rollouts/canary-rollout"
    ],
    "startTime": ...
  },
  "response": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout",
    "rolloutId": "canary-rollout",
    "createTime": ...
    "trafficPercentStrategy": {
      "percentages": {
        "old": 90,
        "new": 10,
      }
    },
    "serviceName": "endpointsapis.appspot.com"
  }
}

建立推出作業後,您可以執行下列指令並代入自己的推出作業 ID,取得推出作業的狀態:

# Get rollout status of `operations/rollouts.endpointsapis.appspot.com:canary-rollout`.
$ gcurl https://servicemanagement.googleapis.com/v1/operations/rollouts.endpointsapis.appspot.com:canary-rollout
{
  "name": "operations/rollouts.endpointsapis.appspot.com:canary-rollout",
  "metadata": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata",
    "resourceNames": [
      "services/endpointsapis.appspot.com/rollouts/canary-rollout"
    ],
    "steps": [
      {
        "description": "update Service Controller",
        "status": "DONE"
      }
    ],
    "progressPercentage": 100,
    "startTime": ...
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout",
    "rolloutId": "canary-rollout",
    "createTime": ...
    "status": "SUCCESS",
    "trafficPercentStrategy": {
      "percentages": {
        "old": 90,
        "new": 10,
      }
    },
    "serviceName": "endpointsapis.appspot.com"
  }
}

確認初期測試推出作業已完成,且新服務設定良好後,即可建立推出作業,讓新服務處理 100% 的流量:

# Create rollout to let new configuration serve 100% traffic.
$ gcurl -d '{
  "rolloutId": "full-rollout",
  "serviceName": "endpointsapis.appspot.com",
  "trafficPercentStrategy": {
    "percentages": {
      "new": 100,
    }
  }
}' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts
{
  "name": "operations/rollouts.endpointsapis.appspot.com:full-rollout",
  "metadata": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata",
    "resourceNames": [
      "services/endpointsapis.appspot.com/rollouts/full-rollout"
    ],
    "startTime": ...
  },
  "response": {
    "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout",
    "rolloutId": "full-rollout",
    "createTime": ...
    "trafficPercentStrategy": {
      "percentages": {
        "new": 100,
      }
    },
    "serviceName": "endpointsapis.appspot.com"
  }
}

如果在測試階段發現問題,您可以透過下列操作復原至舊的設定:

# Rollback to the old configuration.
$ gcurl -d '{
  "rolloutId": "rollout-to-old",
  "serviceName": "endpointsapis.appspot.com",
  "trafficPercentStrategy": {
    "percentages": {
      "old": 100,
    }
  }
}' https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts
{
 "name": "operations/rollouts.endpointsapis.appspot.com:rollout-to-old",
 "metadata": {
   "@type": "type.googleapis.com/google.api.servicemanagement.v1.OperationMetadata",
   "resourceNames": [
     "services/endpointsapis.appspot.com/rollouts/rollout-to-old"
   ],
   "startTime": ...
 },
 "response": {
   "@type": "type.googleapis.com/google.api.servicemanagement.v1.Rollout",
   "rolloutId": "rollout-to-old",
   "createTime": ...
   "trafficPercentStrategy": {
     "percentages": {
       "old": 100,
     }
   },
   "serviceName": "endpointsapis.appspot.com"
 }

}

查看推行記錄

Service Management API 會逐一記錄推行活動。如要查看 endpointsapis.appspot.com 的推行記錄,您可以使用以下指令:

# List rollout history for `endpointsapis.appspot.com`.
$ gcurl https://servicemanagement.googleapis.com/v1/services/endpointsapis.appspot.com/rollouts
{
  "rollouts": [
    {
      "rolloutId": "canary-rollout",
      "createTime": ...
      "status": "IN_PROGRESS",
      "trafficPercentStrategy": {
        "percentages": {
          "old": 90,
          "new": 10
         }
      },
      "serviceName": "endpointsapis.appspot.com"
    },
    {
      "rolloutId": "old-rollout",
      "createTime": ...
      "status": "SUCCESS",
      "trafficPercentStrategy": {
        "percentages": {
          "old": 100
         }
      },
      "serviceName": "endpointsapis.appspot.com"
    },
    ...
  ]
}