Link Search Menu Expand Document

Elastic Container Service - に

Advanced

Nội dung

  1. Rolling Update
  2. Blue/Green Update

Sau khi xây dựng và thực thi Service trong một Cluster, chúng ta có thể thực hiện các yêu cầu thay đổi liên quan đến cấu hình như số lượng Tasks, bổ sung hoặc thay đổi Containers cùng những giá trị CPU, Memory… bên trong Task Definition Revision

Để thực hiện những thay đổi này, ECS cung cấp 3 phương pháp sau:

  • Rolling update: thực thi bởi ECS, sử dụng service scheduler để cập nhật phiên bản mới của Container. Trong quá trình cập nhật, số lượng Tasks thêm vào hoặc loại bỏ được cấu hình thông qua những giá trị:

    • Minimum healthy percent: giá trị cận dưới của Tasks cần duy trì ở trạng thái RUNNING / so với Tasks mong muốn (khai báo trong Auto Scaling)
    • Maximum percent: giá trị cận trên của Tasks cần duy trì ở trạng thái RUNNING hoặc PENDING / so với Tasks muong muốn (khai báo trong Auto Scaling)

Clusters Service Rolling Update Ouput Cluster Service Rolling Update Parameters

  • Blue/Green: thực thi bởi CodeDeploy, duy trì hai phiên bản: product (BLUE) / test (GREEN). Trong quá trình triển khai, lưu lượng dữ liệu gửi đến servie dần dịch chuyển từ BLUE sang GREEN theo một trong những cách thức:
    • Canary: chia lưu lượng thành 2 phần và xác định khoảng thời gian thực thi quá trình chuyển đổi. Ví dụ:
      • CodeDeployDefault.ECSCanary10Percent5Minutes: chuyển 10% trong phần đầu tiên, và 90% còn lại sau 5 phút
      • CodeDeployDefault.ECSCanary10Percent15Minutes: chuyển 10% trong phần đầu tiên, và 90% còn lại sau 15 phút
    • Linear: chia lưu lượng thành các phần bằng nhau và xác định khoảng thời gian. Ví dụ:
      • CodeDeployDefault.ECSLinear10PercentEvery1Minutes: chuyển 10% sau mỗi 1 phút cho đến khi kết thúc toàn bộ
      • CodeDeployDefault.ECSLinear10PercentEvery3Minutes: chuyển 10% sau mỗi 3 phút cho đến khi kết thúc toàn bộ
    • All-at-one
      • Toàn bộ lưu lượng được chuyển dịch từ BLUE sang GREEN cùng lúc
  • External: thực thi bởi deployment controller từ một bên thứ ba (third-party) dựa trên các Service/Task APIs

Rolling Update

Việc cập nhật Service dựa trên phương pháp Rolling được thực hiện qua các bước sau:

Bước 1: Tạo Task Definition Revision

Cập nhật khai báo và cấu hình của Task Definition được quản lý thông qua các Task Definition Revision.

Trên AWS Console, Elastic Container Service -> Task Definitions, chúng ta có danh sách các Task Definitions khai báo:

Clusters Task Definition Cluster Task Definition List

Lựa chọn link liên kết của remindersmgtfargate để hiển thị danh sách Task Revisions:

Clusters Task Definition Revision List Cluster Task Definition Revisions List

Lựa chọn phiên bản Task Definition mới nhất - remindersmgtfargate:8 và click button Create new revision để tạo Revision mới dựa trên phiên bản đang được lựa chọn.

Trên màn hình Create new revision of Task Definition, giữ nguyên các cấu hình hiện tại, ngoại trừ thay đổi trong phần Task size:

  • Task memory (GB): 2Gb -> 4Gb
  • Task CPU (vCPU): 1 vCPU -> 2 vCPU

Clusters Task Size Update Cluster Task Size Update

Click button Create tại vị trí cuối màn hình. Cửa sổ mới xuất hiện thông báo Revision remindersmgtfargate:9 được đã tạo ra thành công.

Clusters Task Definition Revision Created Cluster Task Definition Revisions Created

Bước 2: Cập nhật Service

Trên cùng màn hình thông báo trạng thái tạo mới của remindersmgtfargate:9, sử dụng Selection Actions và lựa chọn Option Update Service.

Clusters Task Definition Revision Created Cluster Task Definition Revisions Created and Update Service

Quá trình xác nhận các mục thông tin tương ứng với các màn hình:

  • Configure service
  • Configure network
  • Service Auto Scaling (optional)
  • Review

Trong mỗi bước xác nhận, giữ nguyên thông tin và click button Next step. Trong màn hình Review, click button Update Service để cập nhật service theo khai báo của Task Definition Revision remindersmgtfargate:9.

Màn hình Launch Status xác nhận quá trình cập nhật đang được thực hiện.

Clusters Fargate Service Task Definition Revision Apply Applying new Task Definition Revision in Fargate Service

Bước 3: Xác nhận quá trình cập nhật

Trong quá trình cập nhật, trên màn hình Service : remindersmgt, danh sách Tasks hiển thị 4 đối tượng Tasks tương ứng với các cấu hình

  • remindersmgtfargate:8
  • remindersmgtfargate:9

Số lượng Tasks được duy trì tương ứng với giá trị 200% trong khai báo của Maximum percent / Number of Task.

Clusters Fargate Service Rolling Update Cluster Fargate Service Rolling Update

Sau một khoảng thời gian nhất định, khi hệ thống hoạt động ổn định, các Tasks sử dụng Revision cũ - remindersmgtfargate:8 sẽ được loại bỏ khỏi Cluster.

Clusters Fargate Service Rolling Update Cluster Fargate Service Rolling Update Completed

Kết luận

Việc cập nhật Cluster Service dựa trên Task Definition Revision theo cách thức trên vẫn còn điểm hạn chế do phải tiến hành một số bước thủ công. Để quá trình cập nhật được thực hiện tự động, có thể kết hợp mô hình Rolling Update với dịch vụ AWS Pipeline: mỗi khi source code trên CodeCommit thay đổi, AWS Pipeline sẽ được kích hoạt, thực hiện quá trình Build với CodeBuild, cập nhật Docker Image trên Elastic Container Registry và yêu cầu ECS cập nhật service với Docker Image mới được tạo ra. Qui trình này có thể tham khảo thực hành AWS CodePipeline.

Quá trình thiết lập cấu hình và thực hiện Rolling Update đối với ECS Fargate Service được thực hiện khá đơn giản, dễ dàng áp dụng. Tuy nhiên, quá trình này có điểm hạn chế khi chỉ được thực hiện trong 1 môi trường duy nhất do vậy chúng ta không có khả năng huỷ bỏ hoặc quay ngược lại quá trình khi phát hiện ra lỗi bất thường trong quá trình chuyển đổi (tất nhiên, có thể chờ đợi khi quá trình kết thúc, và sử dụng revision cũ để tiếp tục một quá trình khác quay về phiên bản cũ đó). Để khắc phục nhược điểm này, phương pháp Blue/Green Update sử dụng 2 môi trường khác nhau Test & Product, kết hợp quá trình dịch chuyển lưu lượng yêu cầu giữa hai môi trường này với những Hook functions (lambda funcitons) cho phép kiểm thử, đảm bảo chất lượng môi trường Test trước khi đưa vào môi trường sản phẩm.

Chú ý:

Do không thể thay đổi cách thức cập nhật của một Service sau khi đã tạo ra, chúng ta cần xoá bỏ Service remindersmgt cùng các Tasks liên quan trong Cluster friendreminders trước khi bắt đầu phần thực hành tiếp theo.


Blue/Green Update

Việc cập nhật Service theo phương pháp Blue/Green được thực hiện qua các bước sau:

Bước 1: Tạo Target Groups và liên kết với Load Balancer

Do phương pháp Blue/Green Update sử dụng hai môi trường khác nhau cho quá trình chuyển đổi, chúng ta cần khai báo và sử dụng 2 Target Groups khác nhau, sau đó liên kết Target Group với Application Load Balancer remindersmgtlb.

  • Trên AWS Console, chuyển đến màn hình EC2 -> Target groups. Danh sách hiển thị remindersmgttg đã được tạo ra trong bước thực hành trước.

Target Group List Target Groups List

Click button Create target group để tạo Target Group mới.

  • Trong màn hình cấu hình thông tin Target Group - Specify group details, thực hiện các thiết lập:
    • Basic configuration
      • Choose a target type: IP addresses
      • Target group name: remindersmgttgB
      • Protocol: HTTP
      • Port: 80
      • VPC: Lựa chọn ECS Cluster VPC ID đã tạo trong bước trước
    • Health checks
      • Health check protocol: HTTP
      • Health check path: /health - Health Check endpoint của RemindersManagement Service

Target Group Basic Configuration Target Groups Basic Configuration

Target Group Health Check Target Groups Health Check

Click button Next để chuyển sang màn hình tiếp theo.

  • Trên màn hình Register targets, giữ nguyên các thông tin theo mặc định ngoại trừ thay đổi giá trị Port 8000 theo giao tiếp với RemindersManagement Service Containers.

Target Group Registers Target Groups Registers

Click button Create target group để thực hiện việc cài đặt.

  • Áp dụng tương tự quá trình trên để tạo Target Group thứ 2. Tuy nhiên, cần chú ý các thông tin khác biệt sau:
    • Trong màn hình Specify group details
      • Basic configuration
        • Target group name: remindersmgttgG
        • Port: 8080

Các thông tin cấu hình còn lại của remindersmgttgG hoàn toàn giống với remindersmgttgB.

  • Danh sách Target Groups sau khi tạo mới:

Target Group List Target Groups List Updated

Dựa theo danh sách này, chúng ta thấy remindersmgttg đang liên kết với Application Load Balancer remindersmgtlb. Trong bước tiếp theo, chúng ta sẽ cập nhật lại liên kết này.

Bước 2: Liên kết Target Group và Load Balancer

  • Trên AWS Console, chuyển đến màn hình EC2 -> Load Balancers, hiển thị remindersmgtlb đã được tạo ra trong bước thực hành trước.

Click vào mục Listeners, chúng ta có danh sách Listeners liên kết với Load Balancer.

Load Balancer Listeners Load Balancer Listeners

  • Lựa chọn Listener ID liên kết với remindersmgttg, click vào button Delete và xác nhận Yes, Delete trên pop-up windows để xoá bỏ liên kết này.

Load Balancer Listeners Delete Load Balancer Listener Delete

  • Click button Add listener để thực hiện liên kết Load Balancer với Target Groups mới được tạo ra - remindersmgttgB. Trên màn hình Add listener, thực hiện cấu hình:
    • Protocol : port
      • HTTP : 80
    • Default action(s). Lựa chọn Forward to...
        1. Forward to…
          • remindersmgttgB

Click icon Tick và button Save để lưu lại thay đổi.

  • Click button Add listener để thực hiện liên kết Load Balancer với Target Groups mới được tạo ra - remindersmgttgG. Trên màn hình Add listener, thực hiện cấu hình:
    • Protocol : port
      • HTTP : 8080
    • Default action(s). Lựa chọn Forward to...
        1. Forward to…
          • remindersmgttgG

Click icon Tick và button Save để lưu lại thay đổi.

  • Sau khi liên kết Load Balancer với hai Target Groups remindersmgttgBremindersmgttgG, chúng ta có kết quả:

Load Balancer Listeners Load Balancer Listeners Update

Bươc 4: Thay đổi cấu hình Security Group

Do Load Balancer sử dụng cổng 8080 cho Target Group remindersmgttgG, chúng ta cần thay đổi Security Group của Cluster VPC để cho phép lưu lượng đi vào trong cổng này.

  • Trên AWS Console, chuyển đến màn hình EC2 -> Security Groups, hiển thị EcsVpcSg đã được tạo ra trong bước thực hành trước. Click vào link liên kết của EcsVpcSg để chuyển đến màn hình hiển thị thông tin chi tiết của Security Group.

Security Group Details Security Group Details

  • Click button Edit Inbound rules để hiển thị màn hình Edit. Click button Add rule để bổ sung Inbound rule tương ứng Port 8080 với giá trị Source Anywhere:

Security Group Inbound Rule Security Group Inbound Rule

Click button Save rule để lưu lại thay đổi.

Xác nhận Inbound Rules được cập nhật:

Security Group Details Updated Security Group Updated

Bước 5: Tạo Service Role cho CodeDeploy

Phương pháp Blue/Green Update sử dụng dịch vụ AWS CodeDeploy để cập nhật các tài nguyên trong ESC Cluster. Do vậy chúng ta cũng cần tạo Service Role cho phép CodeDeploy thực hiện được điều này. Cách thực hiện tương tự như khai báo Service Role cho ECS Task trong phần thực hành trước đây.

  • Trên AWS Console, chuyển đến màn hình IAM -> Roles và click button Create role để tạo Role mới.
  • Trên màn hình Select type of trusted entity’:
    • Or select a service to view its use cases: CodeDeploy
    • Select your use case: CodeDeploy - ECS.

Click button Next: Permissions để chuyển sang bước tiếp theo.

  • Trên màn hình Attached permissions policies: giữ nguyên policy được liên kết mặc định AWSCodeDeployRoleForECS.

Click button Next: Tags để chuyển sang màn hình khai báo danh sách Tags. Do không sử dụng khai báo này, chúng ta click button Next: Review.

  • Trên màn hình Review, khai báo các cấu hình
    • Role name*: codedeploy-FriendRemindersBuild-service-role
    • Role description: Allow CodeDeploy to update ECS Service with Blue/Green Update

Create CodeDeploy ESC Service Role Create CodeDeploy ESC Service Role

Click button Create role để thực thi quá trình tạo Role mới.

Bước 6: Tạo Cluster Service với Blue/Green Update

Quá trình tạo mới một Cluster Service dựa trên việc triển khai Blue/Green Update tương tự như Rolling Update đã thực hiện trong các phần trước, ngoại trừ các điểm khác biệt cần chú ý sau đây.

  • Trên màn hình Configure service, trong mục Deployments, chúng ta có lựa chọn cấu hình:
    • Deployment type*: Blue/green deployment (powered by AWS CodeDeploy
    • Deployment configuration*: CodeDeployDefault.ECSLinear10PercentEvery1Minutes
    • Service role for CodeDeploy*: codedeploy-FriendRemindersBuild-service-role

Create Fargate Service with Blue/Green Update Create Fargate Service with Blue/Green Update

  • Trên màn hình Configure network, sau khi áp dụng các giá trị VPC, Subnets, Security Group, Application Load Balancer tương tự như các phần trước. Chúng ta sử dụng cấu hình mới cho các phần sau:
    • Container to load balance
      • Production listener port*: 80:HTTP
      • Production listener protocol*: HTTP
      • Test listener: Lựa chọn Checked box
      • Test listener port*: 8080:HTTP
      • Test listener protocol*: HTTP
    • Additional configuration
      • Target group 1 name*: remindersmgttgB
      • Target group 2 name*: remindersmgttgG

Network Configuration for Containers and Load Balancer Network Configuration for Containers and Load Balancer

Additional Configuration for Target Groups Additional Configuration for Target Groups

  • Trên màn hình Review, sau khi xác nhận các thông tin, click button Create Service để tạo Service mới.

  • Kết quả trên màn hình Launch Status thông báo Service đã được tạo ra thành công và sử dụng CodeDeploy cho việc triển khai Blue/Green Update cùng các thông tin:

    • CodeDeploy application: AppECS-friendreminders-remindersmgt
    • Deployment group: DgpECS-friendreminders-remindersmgt
    • Deployment configuration: CodeDeployDefault.ECSLinear10PercentEvery1Minutes
    • Traffic shifting %: 10%
    • Traffic shifting interval: 1 minute

Service Deployment Blue Green Launch Status Service Deployment Blue Green Launch Status

Bước 7: Thực hiện và xác nhận quá trình cập nhật

  • Trên màn hình Service : remindersmgt, click vào mục thông tin Tasks để xác nhận trạng thái Tasks - RUNNING trong Service:

Tasks Status in ECS Fargate Service Tasks Status in ECS Fargate Service

Click button Update để kiểm tra việc cập nhật Service.

  • Trên màn hình Configure service, thay đổi giá trị Revision từ 9 -> 8, giữ nguyên các lựa chọn khác và click button Next step.

Update Task Defintinion Revision Update Task Defintiion Revision

  • Giữ nguyên lựa chọn mặc định trên các màn hình tiếp theo, click button Next step.
    • Configure deployments
    • Configure network
    • Set Auto Scaling (optional)
    • Review

Click button Update Service trên màn hình Review để xác nhận thực hiện việc thay đổi.

  • Màn hình Launch Status thông báo quá trình thay đổi đang được thực hiện liên kết CodeDeploy ID d-7L8VE2HV5. Click vào link liên kết này để chuyển sang màn hình theo dõi trạng thái chuyển đổi thực hiện bởi CodeDeploy service.

Update Service Launch Status Update Service Launch Status

CodeDeploy Traffic shifting progres CodeDeploy Traffic shifting progress

Trong thời điểm chuyển đổi này, chúng ta có thể sử dụng giá trị DNS của Application Load Balancer kết hợp với các Port 808080 để xác nhận dịch vụ RemindersManagement đang được thực thi đồng thời trên cả 2 Target Group remindersmgttgBremindersmgttgG.

Load Balancers DNS in Product Application Load Balancers DNS in Product

Load Balancers DNS in Test Application Load Balancers DNS in Test

Để quá trình cập nhật được thực hiện tự động, có thể kết hợp mô hình Blue/Green Update với dịch vụ AWS Pipeline: mỗi khi source code trên CodeCommit thay đổi, AWS Pipeline sẽ được kích hoạt, thực hiện quá trình Build với CodeBuild, cập nhật Docker Image trên Elastic Container Registry và yêu cầu ECS cập nhật service với Docker Image mới được tạo ra. Qui trình này có thể tham khảo thực hành AWS CodePipeline.


Copyright © 2019-2022 Tuan Anh Le.