Building a Cloud in the Cloud: Running Apache CloudStack on Amazon EC2, Part 1

Bài viết này được viết bởi Mark Rogers, SDE II – Customer Engineering AWS.

Làm thế nào để bạn đặt một cloud trong một cloud khác? Một số tính năng làm cho Amazon Elastic Compute Cloud (Amazon EC2) an toàn và tuyệt vời cũng khiến việc chạy CloudStack trở nên khó khăn. Trở ngại lớn nhất là AWS và CloudStack đều muốn quản lý tài nguyên mạng. Do đó, chúng ta phải giữ cho chúng khỏi xung đột với nhau. Điều này đòi hỏi một số bước không rõ ràng và nó mất rất nhiều thời gian để tìm ra. Tôi sẽ chia sẻ những gì tôi đã học được để bạn có thể dễ dàng điều hướng quá trình này.

Apache CloudStack là một nền tảng mã nguồn mở để triển khai và quản lý các máy ảo (VM) và cơ sở hạ tầng lưu trữ và mạng đi kèm. Bạn thường sẽ chạy nó trên phần cứng của riêng mình để tạo ra cloud của riêng bạn. Nhưng có thể có lợi thế khi chạy nó bên trong Mạng riêng ảo của Amazon (Amazon VPC), bao gồm cách nó có thể giúp bạn di chuyển ra khỏi trung tâm dữ liệu. Đó là một cách tuyệt vời để tạo ra môi trường dùng một lần cho các thí nghiệm hoặc đào tạo. Ngoài ra, đây là một cách thuận tiện để thử nghiệm tính năng hỗ trợ CloudStack mới trong Dịch vụ Kubernetes Amazon Elastic (Amazon EKS) bất cứ nơi nào. Trong trường hợp của tôi, tôi cần tạo ra các môi trường phát triển và kiểm thử cho một dự án sử dụng API CloudStack. Các môi trường cần được chia sẻ và có khả năng mở rộng. Đường ống xây dựng của chúng tôi đã có sẵn trên AWS, vì vậy đặt các môi trường mới ở đó cũng là một lựa chọn hợp lý.

CloudStack có thể hoạt động với nhiều hypervisor khác nhau. Hướng dẫn trong bài viết này sẽ sử dụng Kernel-based Virtual Machine (KVM) trên Linux. KVM sẽ quản lý các máy ảo ở mức thấp, và CloudStack sẽ quản lý KVM.

Yêu cầu tiên quyết

Hầu hết thông tin trong bài viết này có thể áp dụng cho nhiều phiên bản CloudStack khác nhau. Tôi đã nhắm mục tiêu CloudStack 4.14 trên CentOS 7. Tôi cũng đã kiểm tra CloudStack phiên bản 4.16 và 4.17, và tôi khuyến nghị sử dụng chúng.

Hình ảnh chính thức của CentOS 7 x86_64 HVM hoạt động tốt. Nếu bạn sử dụng một phiên bản hoặc phong cách Linux khác, bạn có thể phải sửa đổi một số chi tiết triển khai.

Bạn sẽ cần phải biết những kiến thức cơ bản về CloudStack. Phạm vi của bài viết này là làm cho CloudStack và AWS cùng tồn tại hòa hợp. Sau khi CloudStack đã chạy, tôi giả định rằng bạn sẽ xử lý các vấn đề từ đó. Tham khảo tài liệu AWStài liệu CloudStack để biết thông tin về an ninh và các phương pháp tốt nhất khác.

Làm cho việc dễ dàng hơn

Tôi đã viết một số kịch bản để tự động hóa việc cài đặt. Bạn có thể chạy chúng trên các trường hợp EC2 với CentOS 7, và chúng sẽ làm tất cả các cài đặt và cấu hình hệ điều hành cho bạn. Bạn có thể sử dụng chúng như chúng là, hoặc tùy chỉnh chúng để đáp ứng nhu cầu của bạn. Tôi cũng đã viết một số mẫu AWS CloudFormation mà bạn có thể sao chép để tạo môi trường demo. Tệp README có thêm thông tin chi tiết.

Các loại instance EC2 của Amazon

KVM yêu cầu hỗ trợ ảo hóa phần cứng. Hầu hết các trường hợp EC2 là các máy ảo không hỗ trợ ảo hóa lồng nhau. Để truy cập vào phần cứng trần, bạn cần một metal instance type.

Tôi thích c5.metal vì nó là một trong những loại kim loại rẻ nhất và có chi phí thấp cho mỗi vCPU. Nó có 96 vCPU và 192 GiB bộ nhớ. Nếu bạn chạy 20 máy ảo trên đó, mỗi máy với 4 lõi CPU và 8 GiB bộ nhớ, thì bạn vẫn có 16 vCPU và 32 GiB để chia sẻ giữa hệ điều hành, CloudStack và MySQL. Sử dụng tính năng overprovisioning của CloudStack, bạn có thể đưa thêm nhiều VM nữa nếu chúng đang chạy với tải nhẹ.

Mạng

Thách thức lớn nhất là mạng. AWS biết địa chỉ IP và MAC nào cần tồn tại và nó biết các máy tính nào mà chúng nên thuộc về. Nó chặn bất kỳ lưu lượng nào không phù hợp với ý tưởng của nó về cách mạng nên hoạt động. Đồng thời, CloudStack cho rằng bất kỳ địa chỉ IP hoặc MAC nào mà nó sáng tạo ra đều hoạt động tốt. Khi CloudStack gán địa chỉ cho các máy ảo trên một subnet AWS, lưu lượng mạng của chúng bị chặn.

Bạn có thể vượt qua điều này bằng cách kích hoạt chuyển đổi địa chỉ mạng (NAT) trên instance chạy CloudStack. Đó là một giải pháp tuyệt vời nếu nó phù hợp với nhu cầu của bạn, nhưng nó làm cho việc liên lạc của các máy khác trong Amazon VPC với VM của bạn khó khăn. Tôi khuyên bạn nên chọn một cách tiếp cận khác.

Mặc dù AWS hạn chế những gì bạn có thể làm với mạng tầng 2 của nó, nó hoàn toàn có thể cho phép bạn chạy bộ định tuyến tầng 3 của riêng bạn. Instance EC2 của bạn có thể hoạt động như một bộ định tuyến đến một subnet ảo mới nằm bên ngoài phạm vi của AWS. Instance tích hợp với AWS giống như một thiết bị VPN, định tuyến lưu lượng đến bất cứ đâu cần thiết. CloudStack có thể làm bất cứ điều gì nó muốn trong subnet ảo và mọi người đều hạnh phúc.

Tôi muốn nói gì về một subnet ảo? Đây là một subnet chỉ tồn tại bên trong instance EC2. Nó bao gồm các giao diện mạng logic được gắn vào một Linux bridge. Toàn bộ subnet chỉ tồn tại trong một instance EC2 duy nhất. Nó không mở rộng tốt, nhưng nó đơn giản. Trong bài viết tiếp theo của tôi, tôi sẽ đề cập đến một cài đặt phức tạp hơn với một mạng lưới chồng chéo trải dài qua nhiều instance để cho phép mở rộng theo chiều ngang.

Phương pháp đơn giản

Phương pháp đơn giản là đưa tất cả vào một EC2 instance, bao gồm cả cơ sở dữ liệu, lưu trữ file và một mạng con ảo. Vì tất cả được lưu trữ cục bộ, hãy cấp đủ dung lượng đĩa cho nhu cầu của bạn. 500GB sẽ đủ để hỗ trợ một số VM cơ bản. Tạo hoặc chọn một nhóm bảo mật cho instance của bạn cho phép người dùng truy cập vào giao diện người dùng CloudStack (cổng TCP 8080). Nhóm bảo mật cũng nên cho phép truy cập vào bất kỳ dịch vụ nào mà bạn cung cấp từ các VM của bạn.

Khi bạn có instance của mình, hãy cấu hình AWS để xem nó như một bộ định tuyến.

  1. Đi đến Amazon EC2 trong Bảng điều khiển quản lý AWS.
  2. Chọn instance của bạn và dừng kiểm tra nguồn / đích.
  1. Cập nhật bảng định tuyến của mạng con.
    1. Đi đến cài đặt VPC và chọn Bảng định tuyến.
    2. Xác định bảng cho các mạng con cần truy cập CloudStack.
    3. Trong mỗi bảng này, thêm một tuyến đến mạng con ảo mới. Đối tượng tuyến đến nên là instance EC2 của bạn.
  2. Tùy thuộc vào nhu cầu mạng của bạn, bạn cũng có thể cần thêm tuyến đường đến các cổng chuyển tiếp, điểm cuối VPN, v.v.

Bởi vì tất cả mọi thứ sẽ được đặt trên một máy chủ, việc tạo một mạng con ảo đơn giản chỉ là việc tạo một cầu Linux. CloudStack phải tìm một bộ chuyển mạng được gắn vào cầu. Do đó, thêm một giao diện giả với một tên mà CloudStack sẽ nhận ra.

Đoạn mã sau cho thấy cách tôi cấu hình mạng trong CentOS 7. Bạn phải cung cấp các giá trị cho các biến $ virutal_host_ip_address và $ virtual_netmask để phản ánh mạng con ảo mà bạn muốn tạo. Đối với $dns_address, tôi khuyến khích bạn sử dụng địa chỉ IPv4 cơ sở của mạng VPC, cộng thêm hai. Bạn không nên sử dụng 169.654.169.253 vì CloudStack dành các địa chỉ link-local để sử dụng cho riêng mình.

yum install -y bridge-utils net-tools

# The bridge must be named cloudbr0.

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-cloudbr0

DEVICE=cloudbr0

TYPE=Bridge

ONBOOT=yes

BOOTPROTO=none

IPV6INIT=no

IPV6_AUTOCONF=no

DELAY=5

STP=yes

USERCTL=no

NM_CONTROLLED=no

IPADDR=$virtual_host_ip_address

NETMASK=$virtual_netmask

DNS1=$dns_address

EOF

# Create a dummy network interface.

cat << EOF > /etc/sysconfig/modules/dummy.modules

#!/bin/sh

/sbin/modprobe dummy numdummies=1

/sbin/ip link set name ethdummy0 dev dummy0

EOF

chmod +x /etc/sysconfig/modules/dummy.modules

/etc/sysconfig/modules/dummy.modules

cat << EOF > /etc/sysconfig/network-scripts/ifcfg-ethdummy0

TYPE=Ethernet

BOOTPROTO=none

NAME=ethdummy0

DEVICE=ethdummy0

ONBOOT=yes

BRIDGE=cloudbr0

NM_CONTROLLED=no

EOF

# Turn the instance into a router

echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf

sysctl -p

# Must kill dhclient or the network service won't restart properly.

# A reboot would also work, if you’d rather do that.

pkill dhclient

systemctl restart network

CloudStack phải biết địa chỉ IP nào được sử dụng cho giao tiếp giữa các dịch vụ. Nó sẽ chọn bằng cách giải quyết tên miền đầy đủ (FQDN) của máy thành địa chỉ. Các lệnh sau sẽ giúp cho nó chọn đúng địa chỉ. Bạn phải cung cấp một giá trị cho biến $virtual_host_ip_address.

hostnamectl set-hostname cloudstack.localdomain

echo “$virtual_host_ip_address cloudstack.localdomain” >> 

/etc/hosts

Bạn có thể hoàn tất cài đặt bằng cách làm theo Hướng dẫn Cài đặt Nhanh.

Hãy nhớ rằng CloudStack chỉ kết nối trực tiếp với mạng ảo của bạn. Thành phần EC2 instance là bộ định tuyến kết nối mạng ảo với Amazon VPC. Khi bạn đang cấu hình CloudStack, hãy sử dụng địa chỉ mặc định của cổng Gateway của instance mà bạn đã tạo để kết nối đến mạng ảo đó.

Để truy cập vào CloudStack từ máy trạm của bạn, bạn cần phải kết nối với VPC của mình. Điều này có thể được thực hiện thông qua một máy chủ bastion hoặc một VPN client. Nếu bạn sử dụng máy chủ bastion, subnet của nó cần có một tuyến đường đến subnet ảo của bạn và bạn cần phải sử dụng một đường hầm SSH để trình duyệt của bạn truy cập vào giao diện người dùng CloudStack. Giao diện người dùng được đặt tại http://x.x.x.x:8080/client/, trong đó x.x.x.x là địa chỉ subnet ảo của CloudStack của bạn. Lưu ý rằng trình xem bảng điều khiển của CloudStack sẽ không hoạt động nếu bạn đang sử dụng một đường hầm SSH.

Nếu bạn chỉ đang thử nghiệm CloudStack, tôi đề xuất bạn tiết kiệm tiền bằng cách tắt instance khi không cần thiết. Cách an toàn để làm điều đó là:

  1. Tắt vùng của bạn trong giao diện người dùng CloudStack.
  2. Đặt lưu trữ chính vào chế độ bảo trì.
  3. Chờ cho chuyển đổi sang chế độ bảo trì hoàn tất.
  4. Dừng EC2 instance.

Khi bạn sẵn sàng khởi động lại mọi thứ, chỉ cần đảo ngược các bước đó. Nếu bạn có bất kỳ bộ định tuyến ảo nào trong CloudStack, thì bạn có thể cần phải bắt đầu chúng.

Dọn dẹp

Nếu bạn đã sử dụng mẫu CloudFormation của tôi, hãy xóa stackxóa bỏ bất kỳ mục nhập bảng định tuyến nào bạn đã thêm. Nếu bạn không sử dụng CloudFormation, hãy chấm dứt EC2 instance, xóa bỏ nhóm bảo mật mà bạn đã tạo cho nó, và xóa bỏ bất kỳ mục nhập bảng định tuyến nào bạn đã thêm.

Kết luận

Cho chạy CloudStack trên AWS không khó. Phần khó nhất chỉ là biết cách thôi. Thiết lập được giải thích ở đây rất tốt cho các cài đặt nhỏ, nhưng chỉ có thể tăng tỷ lệ theo chiều dọc. Trong bài đăng tiếp theo của tôi, tôi sẽ chỉ cho bạn cách tạo một cài đặt tăng tỷ lệ theo chiều ngang. Thay vì sử dụng một virtual subnet tồn tại trong một EC2 instance duy nhất, chúng tôi sẽ xây dựng một mạng chồng chéo (overlay network) trải dài trên nhiều instance. Nó sẽ sử dụng nhiều thành phần và tính năng hơn, bao gồm một số tính năng có thể mới với bạn. Tôi hy vọng bạn sẽ thấy nó thú vị!

Bây giờ bạn có thể tạo một thiết lập đơn giản, hãy thử nó! Tôi hy vọng bạn có thể vui và học hỏi thêm điều gì đó mới trong quá trình. Bình luận với kết quả của thí nghiệm của bạn.

“Apache”, “Apache CloudStack”, và “CloudStack” là các thương hiệu của Apache Software Foundation.