ECS Service Discovery
- Là một dịch vụ tự động đăng ký các địa chỉ Private IP của ECS Task lên trên Route 53 Private Hosted Zone dưới dạng A Record.
- Nhờ có hành động này mà nội bộ các Container trong ECS CLuster có thể giao tiếp với nhau thông qua một Private Domain.
- Cụ thể các bạn có thể tham khảo tại: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
- Chúng ta cùng đến với 2 ví dụ cụ thể dưới đây để có cái nhìn rõ hơn về ECS Service Discovery.
1. Phương pháp Access đến Container từ trước tới nay
- Chúng ta có thể tham khảo một cấu trúc điển hình cho việc kết nối tới các Container như hình dưới đây:
- ①: Sau khi Container của các Service phía Backend được tạo ra chúng sẽ được tiến hành gắn vào Load Balancer. Tại Route 53 sẽ tiến hành đăng ký một Record mới để phân giải Private Hosted Zone Domain (Private Domain) đến Load Balancer.
- Tại Route 53 các Record được đăng ký như ví dụ dưới đây:
Name | Type | Value |
---|---|---|
front.example.internal | A (Alias) | DNS của front-alb |
back.example.internal | A (Alias) | DNS của back-alb |
- ②: Các Service khác muốn giao tiếp với các Service phía Backend sẽ gọi thông qua Private Domain -> Route 53 sẽ phân giải Private Domain sang ALB DNS -> ALB DNS sẽ được đổi về IP của Container, và cuối cùng các Connection sẽ được hình thành.
2. Phương pháp Access đến Container sử dụng ECS Service Discovery
- Sau khi sử dụng ECS Service Discovery hệ thống chúng ta sẽ được cấu trúc như sau:
- ①: Khác với việc sử dụng Load Balancer, địa chỉ IP của các Container được tạo ra sẽ được Cloud Map (ECS Service Discovery) tự động đăng ký lên trên Route 53 dưới dạng A Type.
- Tại Route 53 các Record được đăng ký như ví dụ dưới đây:
Name | Type | Value |
---|---|---|
front.example.internal | A (Alias) | DNS của front-alb |
back.example.internal | A | Private IP của Container 03 |
back.example.internal | A | Private IP của Container 04 |
-
②: Các Service khác muốn giao tiếp với các Service phía Backend sẽ gọi thông qua Private Domain -> Route 53 sẽ phân giải Private Domain sang IP của Container, và cuối cùng các Connection sẽ được hình thành. Đến đây chúng ta thấy đã giảm được 1 bước phân giải DNS, đâu đó hệ thống cũng nhanh hơn được một chút rồi.
-
Note: Trường hợp Serivce tiến hành Auto-Scale hay tăng giảm số lượng task, các địa chỉ IP cũng sẽ được tự động đăng ký thông tin tương ứng lên trên Route 53.
II. Ưu nhược điểm của ECS Service Discovery với Load Balancer
1. Ưu điểm của ECS Service Discovery
- Điều chúng ta dễ nhìn thấy nhất là việc sử dụng ECS Service Discovery sẽ giảm được chi phí của Load Balancer. Bao gồm những chi phí sử dụng dịch vụ Load Balancer, chi phí cấu trúc ALB, Security Group …
- Chúng ta có thể cấu trúc các service một cách độc lập hơn. Ví dụ, chúng ta thường gộp một vài service vào ALB, sử dụng chức năng PATH PROXY của ALB để tận dụng 1 ALB cho nhiều serivce. Giờ chúng ta có thể cài đặt cho mỗi service là một private domain để sử dụng.
- Trước thay đổi:
- alb.internal/service_A -> Serivce A
- alb.internal/service_B -> Serivce B
- alb.internal/service_C -> Serivce C
- Sau thay đổi:
- alb-a.internal -> Serivce A
- alb-b.internal -> Serivce B
- alb-c.internal -> Serivce C
- Về cơ bản việc đổi từ PATH sang domain riêng biệt cũng không khác nhau nhiều. Tuy nhiên khi các serivce tăng lên, các bạn đều mong muốn chúng độc lập. Nếu ai sửa sai Security Group của ALB sẽ ảnh hưởng tới các Serivce khác không liên quan …
2. Nhược điểm của ECS Service Discovery
- Do đơn thuần là việc Mapping IP với một Private DNS nên ECS Service Discovery không sử dụng được các chức năng của ALB (hoặc NLB) như PATH PROXY, Authentication, Fixed-response, Stickiness Session, Blue/Green Deploy …
- Chỉ hỗ trợ Health Check ở Level Container. Thay vì từ ALB sẽ gọi đến Endpoint Health Check của container, chúng ta phải tự setting health-check khi trong bản thân của Container.
- Về những Quotar và những cân nhắc khi bạn sử dụng ECS Service Discovery các bạn có thể tham khảo tại: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
III. Handson
- Trong khuôn khổ bài viết mình không lấy lại evidence nhưng các bạn có thể làm theo các bước dưới đây.
1. Setting VPC ID
VPC_IP=vpc-aaabbbccc
2. Tạo Security Group cho ECS Service
aws ec2 create-security-group \
--group-name cloudmap-handson-sg-container \
--description "The security group for containers used in cloud map hands-on." \
--vpc-id $VPC_IP
3. Thao tác với Security Discovery
3.1 Tạo Security Discovery DNS NameSpace
aws servicediscovery create-private-dns-namespace \ --name httpd-service-discovery.internal \ --vpc $VPC_IP
- Đến đây các bạn có thể xem setting trong Route 53 có một Private Hosted Zones đã được tạo ra
3.2 Lấy thông tin namespace và tạo Service trong Service Discovery
aws servicediscovery create-service \ --name cloudmap-handson \ --dns-config 'NamespaceId="ns-aaabbbcccddd",DnsRecords=[{Type="A",TTL="300"}]' \ --health-check-custom-config FailureThreshold=1
4. Thao tác với ECS
4.1 Tạo ECS Cluser
aws ecs create-cluster --cluster-name cloudmap-handson-cluster
4.2 Tạo ECS Task Definition
-
Tạo file task-definition.json
{ "family": "httpd-task", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "httpd-container", "image": "httpd:2.4.41-alpine", "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ] } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }
-
Đăng ký Task Definition
aws ecs register-task-definition --cli-input-json file://task-definition.json
4.3 Tạo ECS Service
-
Lấy các thông tin như Serivce ARN (Service Discovery) đã tạo ở trên, Security Group ID, Subnet ID và tạo file service-definition.json
{ "cluster": "cloudmap-handson-cluster", "serviceName": "cloudmap-handson-httpd-service", "taskDefinition": "httpd-task:1", "serviceRegistries": [ { "registryArn": "arn:aws:servicediscovery:ap-northeast-1:123456789012:service/srv-aabbbcccdddeee" } ], "desiredCount": 1, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-aaa", "subnet-bbb" ], "securityGroups": [ "sg-aaabbbccc" ], "assignPublicIp": "DISABLED" } } }
- Tạo ECS Service
aws ecs create-service --cli-input-json file://service-definition.json
V. Kết luận
Hi vọng qua bài viết này các bạn có thêm một option để thiết kế hệ thống network cho ECS. Chúng ta có thể ứng dụng ECS Service Discovery để tiến hành việc cost optimize.
VI. Về VTI Cloud
VTI Cloud là Đối tác cấp cao (Advanced Consulting Partner) của AWS, với đội ngũ hơn 50+ kỹ sư về giải pháp được chứng nhận bởi AWS. Với mong muốn hỗ trợ khách hàng trong hành trình chuyển đổi số và dịch chuyển lên đám mây AWS, VTI Cloud tự hào là đơn vị tiên phong trong việc tư vấn giải pháp, phát triển phần mềm và triển khai hạ tầng AWS cho khách hàng tại Việt Nam và Nhật Bản.
Xây dựng các kiến trúc an toàn, hiệu suất cao, linh hoạt, và tối ưu chi phí cho khách hàng là nhiệm vụ hàng đầu của VTI Cloud trong sứ mệnh công nghệ hóa doanh nghiệp.
Nguồn: Duy Nam – VTITECH.VN