このトピックでは、Enterprise Distributed Application Service (EDAS) SDK for Java を使用して API オペレーションを呼び出し、Kubernetes クラスタ内の JAR、WAR、またはイメージファイルを使用してアプリケーションのカナリアリリースを実装する方法について説明します。
前提条件
背景情報
API オペレーションを呼び出してアプリケーションのカナリアリリースを実装する場合、カナリアリリースの最初のフェーズの Pod が更新された後、残りのフェーズの更新を進めることを手動で確認する必要があります。残りのフェーズの Pod を更新することを確認する前に、少数の Pod で更新を検証できます。検証が成功した場合は、残りのフェーズの更新に進むことができます。このようにして、アプリケーションのすべての Pod を新しいバージョンに更新できます。
API オペレーションを呼び出してアプリケーションのカナリアリリースを実装する場合、カナリアリリースの最初のフェーズの Pod を除き、残りのフェーズの Pod を自動的に更新する方法を使用することをお勧めします。残りのフェーズの Pod を手動で更新する場合は、ContinuePipeline オペレーションを呼び出して、残りのフェーズの Pod を更新することを手動で確認する必要があります。
このトピックでは、カナリアリリースのサンプルポリシーを 2 つ提供しています。ビジネス要件に基づいてポリシーを選択および変更できます。
カナリアリリースの最初のフェーズで 2 つの Pod を更新し、1 分間隔で 2 つのフェーズで残りの Pod を自動的に更新するようにシステムを構成します。
{"type":"GrayBatchUpdate","batchUpdate":{"batch":2,"releaseType":"auto","batchWaitTime":1},"grayUpdate":{"gray":2}}カナリアリリースの最初のフェーズで 2 つの Pod を更新し、2 つのフェーズで残りの Pod を手動で更新します。
{"type":"GrayBatchUpdate","batchUpdate":{"batch":2,"releaseType":"manual"},"grayUpdate":{"gray":2}}
JAR ファイルまたは WAR ファイルを使用してアプリケーションのカナリアリリースを実装する
次のサンプルコードを実行して、JAR ファイルまたは WAR ファイルを使用してアプリケーションのカナリアリリースを実装します。
次のサンプルコードは、JAR ファイルを使用して EDAS Kubernetes でアプリケーションのカナリアリリースを実装する方法の例を示しています。スケジューリングルール、起動コマンド、および環境変数に関連する高度なパラメータは、コードには含まれていません。API パラメータの詳細については、DeployK8sApplication をご参照ください。
説明WAR ファイルを使用してアプリケーションのカナリアリリースを実装する場合は、ビジネス要件に基づいて次のパラメータをサンプルコードに追加します。
// デプロイおよび更新パッケージが依存する Tomcat のバージョン。このパラメータは、WAR ファイルを使用してデプロイされた Spring Cloud および Apache Dubbo アプリケーションに適用されます。 request.setWebContainer("apache-tomcat-7.0.91"); // デプロイおよび更新パッケージが依存する EDAS Container のバージョン。このパラメータは、WAR ファイルを使用してデプロイされた High-speed Service Framework (HSF) アプリケーションに適用されます。 request.setEdasContainerVersion("3.5.9");import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationRequest; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationResponse; public class DeployK8sApplication { public static void main(String[] args) { // Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持っています。これらの資格情報を使用して EDAS で操作を実行することは、リスクの高い操作です。API オペレーションの呼び出しや日常的な O&M の実行には、Resource Access Management (RAM) ユーザーを使用することをお勧めします。RAM ユーザーを作成するには、RAM コンソールにログオンします。 // このサンプルコードでは、AccessKey ID と AccessKey シークレットは環境変数に含まれています。AccessKey ID と AccessKey シークレットは構成ファイルに保存できます。 // キーの漏洩を防ぐため、コードに AccessKey ID と AccessKey シークレットを含めないことをお勧めします。 String aliyun_user_ak = System.getenv("ACCESS_KEY_ID"); String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET"); // アプリケーションのカナリアリリースを実装するリージョンの ID。 String region_id = "cn-hangzhou"; DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk); DefaultAcsClient client = new DefaultAcsClient(defaultProfile); // API リクエストを開始し、関連パラメータを構成します。 DeployK8sApplicationRequest request = new DeployK8sApplicationRequest(); // アプリケーションの ID。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); // JAR ファイルまたは WAR ファイルの URL とバージョン。 request.setPackageUrl("https:doc***.oss-cn-hangzhou.aliyuncs.com/sc-****-D-0.0.2-SNAPSHOT.jar"); request.setPackageVersion("2021-04-15 16:41:52"); // デプロイおよび更新パッケージが依存する Java Development Kit (JDK) のバージョン。有効な値:Open JDK 7 および Open JDK 8。 request.setJDK("Open JDK 8"); // 段階的リリースのカスタムポリシー。この例では、次のポリシーが使用されます。カナリアリリースの最初のフェーズで 2 つの Pod を更新し、1 分間隔で 2 つのフェーズで残りの Pod を自動的に更新するようにシステムを構成します。 request.setUpdateStrategy("{\"type\":\"GrayBatchUpdate\",\"batchUpdate\":{\"batch\":2,\"releaseType\":\"auto\",\"batchWaitTime\":1},\"grayUpdate\":{\"gray\":2}}"); // カナリアリリースのトラフィック調整ポリシー。この例では、次のトラフィック調整ポリシーが使用されます。トラフィックの 50% をカナリアグループに転送します。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); // Pod の数。 request.setReplicas(4); // Pod の CPU クォータとメモリクォータ。値 0 は、制限が指定されていないことを示します。 request.setCpuLimit(0); request.setMemoryLimit(0); request.setCpuRequest(0); request.setMemoryRequest(0); // 必要な CPU コア数の最小値。単位:コア。値 0 は、CPU コア数の最小値に制限がないことを示します。 request.setMcpuRequest(0); // 許可される CPU コア数の最大値。単位:コア。値 0 は、CPU コア数の最大値に制限がないことを示します。 request.setMcpuLimit(0); // 変更レコードの説明。 request.setChangeOrderDesc("カナリアリリース (JAR ファイル)"); try { DeployK8sApplicationResponse response = client.getAcsResponse(request); System.out.println("ChangeOrderId=" + response.getChangeOrderId() + "\nMessage=" + response.getMessage()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }サンプルレスポンス:
ChangeOrderId=5886e6f9-05b1-42f0-a3d4-5d90558e**** Message=successGetChangeOrderInfo オペレーションを呼び出して、カナリアリリースのフェーズに一致するパイプライン (PipelineId) の ID をクエリします。
GetChangeOrderInfo オペレーションを呼び出した後のサンプルレスポンス:
{ "Message": "success", "RequestId": "19C54DC3-C66C-40D0-AEED-8D5A1F00F3BA", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "カナリアリリース (JAR ファイル)", "PipelineInfoList": { "PipelineInfo": [ { "PipelineStatus": 2, "PipelineName": "Canary Change", ...... "PipelineId": "ca7221a6-2c39-40b5-b40a-53fd3d99****" ...... "PipelineId": "e228e628-f722-43bc-9c2b-45076c3a****" ...... "PipelineId": "d6dcb857-2ff0-4db9-90fa-a2d9db7b****" ...... // サンプルレスポンスは不完全であり、参考用です。説明サンプルコードでは、次のカナリアリリースポリシーを使用しています: カナリアリリースの最初のフェーズで 2 つの Pod を更新し、1 分間隔で 2 つのフェーズで残りの Pod を自動的に更新するようにシステムを構成します。カナリアリリースの最初のフェーズの 2 つの Pod が更新された後、残りのフェーズの更新を進めることを手動で確認する必要があります。GetChangeOrderInfo オペレーションを呼び出した後、3 つのパイプライン ID (PipelineId) が返されます。2 番目のパイプライン ID (PipelineId) は、残りのフェーズの更新を進めることを手動で確認する必要があることを示します。
カナリアリリースポリシーでは、残りの Pod は 1 分間隔で 2 つのフェーズで自動的に更新されると指定されています。したがって、残りのフェーズの更新を進めることを手動で確認する必要はありません。代わりに、システムが自動的に残りの Pod を更新します。
ContinuePipeline オペレーションを呼び出して、残りのフェーズの Pod を更新することを手動で確認します。
サンプルレスポンス:
{ "Message": "success", "RequestId": "050392EE-959D-4144-AA02-3A1E7CE2F736", "Code": 200 }
イメージを使用してアプリケーションのカナリアリリースを実装する
次のサンプルコードを実行して、イメージを使用してアプリケーションのカナリアリリースを実装します。
次のサンプルコードは、イメージを使用して EDAS Kubernetes クラスタでアプリケーションのカナリアリリースを実装する方法の例を示しています。スケジューリングルール、起動コマンド、および環境変数に関連する高度なパラメータは、コードには含まれていません。API パラメータの詳細については、DeployK8sApplication をご参照ください。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationRequest; import com.aliyuncs.edas.model.v20170801.DeployK8sApplicationResponse; public class DeployK8sApplication { public static void main(String[] args) { // Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する権限を持っています。これらの資格情報を使用して EDAS で操作を実行することは、リスクの高い操作です。API オペレーションの呼び出しや日常的な O&M の実行には、RAM ユーザーを使用することをお勧めします。RAM ユーザーを作成するには、RAM コンソールにログオンします。 // このサンプルコードでは、AccessKey ID と AccessKey シークレットは環境変数に含まれています。AccessKey ID と AccessKey シークレットは構成ファイルに保存できます。 // キーの漏洩を防ぐため、コードに AccessKey ID と AccessKey シークレットを含めないことをお勧めします。 String aliyun_user_ak = System.getenv("ACCESS_KEY_ID"); String aliyun_user_sk = System.getenv("ACCESS_KEY_SECRET"); // アプリケーションが存在するリージョンの ID。 String region_id = "cn-hangzhou"; DefaultProfile defaultProfile = DefaultProfile.getProfile(region_id, aliyun_user_ak, aliyun_user_sk); DefaultAcsClient client = new DefaultAcsClient(defaultProfile); // API リクエストを開始し、関連パラメータを構成します。 DeployK8sApplicationRequest request = new DeployK8sApplicationRequest(); // アプリケーションの ID。 request.setAppId("6bbc57a2-a017-4bec-b521-49a15bd3****"); // イメージのアドレス。 request.setImage("registry-vpc.cn-hangzhou.aliyuncs.com/image-demo-project/provider:2.0"); // カナリアリリースのカスタムポリシー。この例では、次のポリシーが使用されます。カナリアリリースの最初のフェーズで 2 つの Pod を更新し、2 つのフェーズで残りの Pod を手動で更新します。 request.setUpdateStrategy("{\"type\":\"GrayBatchUpdate\",\"batchUpdate\":{\"batch\":2,\"releaseType\":\"manual\"},\"grayUpdate\":{\"gray\":2}}"); // カナリアリリースのトラフィック調整ポリシー。この例では、次のトラフィック調整ポリシーが使用されます。トラフィックの 50% をカナリアグループに転送します。 request.setTrafficControlStrategy("{\"http\":{\"rules\":[{\"conditionType\":\"percent\",\"percent\":50}]}}"); // Pod の数。 request.setReplicas(4); // Pod の CPU クォータとメモリクォータ。値 0 は、制限が指定されていないことを示します。 request.setCpuLimit(0); request.setMemoryLimit(0); request.setCpuRequest(0); request.setMemoryRequest(0); // 必要な CPU コア数の最小値。単位:コア。値 0 は、CPU コア数の最小値に制限がないことを示します。 request.setMcpuRequest(0); // 許可される CPU コア数の最大値。単位:コア。値 0 は、CPU コア数の最大値に制限がないことを示します。 request.setMcpuLimit(0); // 変更レコードの説明。 request.setChangeOrderDesc("カナリアリリース (イメージ)"); try { DeployK8sApplicationResponse response = client.getAcsResponse(request); System.out.println("ChangeOrderId=" + response.getChangeOrderId() + "\nMessage=" + response.getMessage()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }サンプルレスポンス:
ChangeOrderId=a7431f9e-7e05-4590-aef8-17088f0**** Message=successGetChangeOrderInfo オペレーションを呼び出して、カナリアリリースのフェーズに一致するパイプライン (PipelineId) の ID をクエリできます。
GetChangeOrderInfo オペレーションを呼び出した後のサンプルレスポンス:
{ "Message": "success", "RequestId": "1B1127FB-251C-4946-AA20-D4FF5DF4788F", "Code": 200, "changeOrderInfo": { "Status": 8, "Desc": "カナリアリリース (JAR ファイル)", "PipelineInfoList": { "PipelineInfo": [ { "PipelineStatus": 2, "PipelineName": "Canary Change", ...... "PipelineId": "09e7d9aa-e79d-49ef-99b9-5405532d****" ...... "PipelineId": "1ea53844-2c60-46f1-b46d-df3b34d0****" ...... "PipelineId": "d99da075-b87d-4fe7-bbb6-ae1c6c26****" ...... // サンプルレスポンスは不完全であり、参考用です。説明サンプルコードでは、次のカナリアリリースポリシーを使用しています: カナリアリリースの最初のフェーズで 2 つの Pod を更新し、2 つのフェーズで残りの Pod を手動で更新します。カナリアリリースの最初のフェーズの 2 つの Pod が更新された後、残りのフェーズの更新を進めることを手動で確認する必要があります。GetChangeOrderInfo オペレーションを呼び出した後、3 つのパイプライン ID (PipelineId) が返されます。2 番目のパイプライン ID (PipelineId) は、残りのフェーズの更新を進めることを手動で確認する必要があることを示します。3 番目のパイプライン ID は、残りのフェーズの最初のフェーズの Pod が更新された後、次のフェーズの Pod を更新することを手動で確認する必要があることを示します。
ContinuePipeline オペレーションを呼び出して、残りのフェーズの Pod を更新することを手動で確認します。
サンプルレスポンス:
{ "Message": "success", "RequestId": "B8ECF6F7-672D-40E9-91DD-1C33F06D4FD8", "Code": 200 }ContinuePipeline オペレーションを呼び出して、次のフェーズの Pod を更新することを手動で確認します。
サンプルレスポンス:
{ "Message": "success", "RequestId": "7BB4F043-7C28-4A0E-B6A5-D4023EB24388", "Code": 200 }説明サンプルコードでは、次のカナリアリリースポリシーを使用しています: カナリアリリースの最初のフェーズで 2 つの Pod を更新し、2 つのフェーズで残りの Pod を手動で更新します。カナリアリリースの最初のフェーズを除く残りのフェーズを更新する場合は、単一フェーズの Pod を更新することを手動で確認する必要があります。カナリアリリースポリシーで、残りのフェーズの複数のフェーズの Pod を更新することを手動で確認する必要がある場合は、正しいパイプライン ID (PipelineId) を指定して、この手順を繰り返す必要があります。
この手順を繰り返す前に、2 つのフェーズの間隔に注意してください。間隔が経過した後でのみ、次のフェーズを手動で確認できます。デフォルトでは、2 つのフェーズの間隔は 10 秒です。
結果を確認する
アプリケーションのカナリアリリースを実装した後、GetChangeOrderInfo オペレーションを呼び出して、アプリケーションの変更の詳細と変更ステータスを表示できます。特定の API パラメータの詳細については、GetChangeOrderInfo をご参照ください。
GetChangeOrderInfo オペレーションを呼び出した後のサンプルレスポンス:
{
"Message": "success",
"RequestId": "10DA427D-AF74-4ECE-BB0A-EECC0EBF7548",
"Code": 200,
"changeOrderInfo": {
"Status": 2,
"Desc": "カナリアリリース (***)",
"PipelineInfoList": {
"PipelineInfo": [
{
......
// サンプルレスポンスは不完全であり、参考用です。
changeOrderInfo.Status パラメータの値に基づいて、アプリケーションのカナリアリリースが成功したかどうかを確認できます。changeOrderInfo.Status パラメータの有効な値:
0: 準備完了
1: 処理中
2: 成功
3: 失敗
6: 終了
8: 手動段階的リリース中に次のフェーズを手動で確認するのを待機中
9: 自動段階的リリース中に次のフェーズを自動的に確認するのを待機中
10: システム例外により失敗