Cloud-init là gì?
Cloud-init là một dịch vụ dùng để cấu hình cá nhân hóa các máy chủ đám mây dựa trên linux. Nó được hầu hết các bản phân phối linux và các nhà cung cấp đám mây công cộng hỗ trợ, và là tiêu chuẩn ngành để khởi tạo các máy ảo trên đám mây. Canonical đã tạo ra cloud-init hơn một thập kỷ trước cho Ubuntu, và kể từ đó, tất cả các đám mây công cộng lớn cũng như hầu hết các bản phân phối linux đều tích hợp hỗ trợ cloud-init.
Bạn đang tìm hiểu cách triển khai máy chủ hiệu quả? Với VPS server từ DataOnline, bạn có thể dễ dàng cấu hình và quản lý tài nguyên theo nhu cầu. Khám phá các giải pháp VPS server mạnh mẽ tại DataOnline để tối ưu hóa dự án công nghệ của bạn ngay hôm nay!
Tại sao DataOnline chuyển sang sử dụng cloud-init?
Trước năm 2022, DataOnline sử dụng các script độc quyền có tên imageboot để triển khai các instance máy chủ. Các script này thiết lập địa chỉ IP, hostname, mật khẩu root và các yêu cầu khác khi bạn triển khai máy chủ.
Các image cho BSD và Windows của DataOnline vẫn sử dụng script imageboot. Nếu bạn sử dụng các hệ điều hành đó, vui lòng xem hướng dẫn nhanh về startup script.
Mặc dù các script này có sức mạnh, nhưng chúng không tương thích với các nhà cung cấp đám mây công cộng khác và không đáp ứng được nhu cầu của các sản phẩm mới như Marketplace, VKE, Managed Databases và DataOnline Cloud GPU.
Để giải quyết vấn đề này, chúng tôi đã làm việc cùng Canonical để thêm datasource của DataOnline vào cloud-init, và sau quá trình kiểm tra nội bộ kỹ lưỡng, chúng tôi đã tích hợp hỗ trợ cloud-init vào các image linux của chúng tôi.
Hướng dẫn này giải thích những lợi ích của cloud-init và cách sử dụng nó, kèm theo các ví dụ cho những tác vụ phổ biến. Đây không phải là một hướng dẫn toàn diện về tất cả các tính năng của cloud-init. Vui lòng tham khảo tài liệu chính thức để tìm hiểu đầy đủ khả năng của cloud-init.
Ưu điểm của cloud-init
Khi bắt đầu sử dụng cloud-init, bạn sẽ khám phá ra nhiều ưu điểm. Trước hết, nó có tính di động cao. Nếu bạn đã phát triển các script trên một đám mây công cộng khác, bạn có thể triển khai chúng trên DataOnline mà không cần thay đổi.
Ngoài ra, với cloud-init bạn có thể làm được nhiều việc mà các script imageboot khó thực hiện, như:
-
Bạn có thể ghi đè vendor-data của DataOnline bằng user-data của bạn.
-
Bạn có thể chèn các script shell chạy một lần mỗi khi khởi động hoặc mỗi instance.
-
Bạn có được các công cụ ghi log và gỡ lỗi tiên tiến với lệnh cloud-init analyze.
-
Rất dễ để đặt lại một instance và chạy lại cloud-init mà không cần cài đặt lại hoàn toàn.
Cách hoạt động của cloud-init
Trên các hệ thống linux sử dụng systemd như Arch, Debian, Fedora, RHEL và Ubuntu, dịch vụ cloud-init.service sẽ chạy dưới dạng oneshot ngay sau khi khởi động, trước khi các dịch vụ như networking, SSH và các dịch vụ khác bắt đầu. Để triển khai một instance tùy chỉnh, cloud-init sẽ chỉnh sửa một image hệ điều hành chung bằng cách kết hợp vendor-data của DataOnline và user-data của bạn.
User-data script là gì?
User-data script luôn bắt đầu bằng một shebang hợp lệ. Ví dụ, dưới đây là một script bash user-data:
Script này chạy với quyền root và chỉ chạy ở lần khởi động đầu tiên. Nó sẽ không chạy lại ở các lần khởi động sau. Để kiểm tra, hãy triển khai một máy chủ với user-data script này và khởi động lại nhiều lần. Bạn sẽ thấy rằng cloud-init tạo ra file trên lần khởi động đầu tiên nhưng không cập nhật nó ở các lần sau.
Nhược điểm của user-data scripts
User-data scripts có một số nhược điểm. Đầu tiên, việc viết một script bash để xử lý tất cả các điều kiện lỗi có thể xảy ra là khó khăn. Việc làm cho script có tính di động giữa các bản phân phối linux cũng gặp nhiều khó khăn. Hơn nữa, không phải hệ thống nào cũng sử dụng cùng một phiên bản bash. Bạn có thể thử giải quyết vấn đề này bằng cách sử dụng một thông dịch viên khác như Python:
Tuy nhiên, ví dụ trên có những vấn đề khác. Nó chạy trên Ubuntu với Python 3, nhưng không di động đối với hệ thống Python 2 hoặc khi Python được cài đặt khác đi.
Ngoài ra, các script khởi động di động cần phải phát hiện được bản phân phối mà chúng chạy trên đó và sử dụng trình quản lý gói phù hợp như apt, yum, dnf hoặc dpkg.
Cloud-config khác gì so với user-data scripts?
User-data định dạng cloud-config bắt đầu với #cloud-config
thay vì một shebang, để phân biệt với các script shell. Nó có tính di động, đáng tin cậy và có xử lý lỗi tốt hơn so với các script shell. Thay vì viết một script dễ gãy vỡ, bạn chỉ cần khai báo các module và chỉ dẫn bằng định dạng YAML. Cloud-init sẽ xử lý cloud-config của bạn và chạy các module tương ứng để cung cấp cấu hình mà bạn đã khai báo. Nhiều module cloud-config có tính di động cao giữa các bản phân phối linux và tự động sử dụng lệnh phù hợp cho từng trường hợp, chẳng hạn như apt so với yum. Với ít code và không gặp rắc rối khi viết script shell, bạn có thể chạy các module để thiết lập người dùng và SSH keys, cài đặt phần mềm, ghi các file tùy ý, chạy các lệnh bên ngoài, và thực hiện hơn 50 tác vụ khác.
Cách sử dụng cloud-config
Trong phần này là một số ví dụ thực tế mà bạn có thể sử dụng trong file cloud-config của mình. Những ví dụ này đã được kiểm tra trên ít nhất một bản phân phối, nhưng bạn có thể cần sửa đổi cho phù hợp với mục đích của mình. Nếu bạn copy và dán từ các ví dụ này, chỉ nên bao gồm dòng #cloud-config
một lần duy nhất trong file.
Cách cài đặt các gói
Dưới đây là một file cloud-config cài đặt gói cơ sở dữ liệu. Lưu ý rằng nó không định nghĩa trình quản lý gói nào để sử dụng, nên nó có tính di động giữa các bản phân phối.
Cách cài đặt Docker
Ví dụ dưới đây dành cho các bản phân phối dựa trên apt như Debian và Ubuntu; nó sẽ không hoạt động với các bản dựa trên yum như CentOS hay RHEL.
Giả sử bạn muốn cài đặt Docker trên một máy chủ đám mây Ubuntu mới. Thông thường, để cài Docker, bạn cần:
-
Thêm repository của Docker vào nguồn của apt.
-
Xác thực các keys.
-
Cập nhật danh sách gói.
-
Cài đặt Docker.
-
Khởi động lại máy chủ.
Bạn có thể viết một script shell để thực hiện 5 bước này. Tuy nhiên, điều đó cũng cần xử lý lỗi, vòng lặp chờ và logic thử lại. Mặc dù không khó đối với một chuyên gia, nhưng đây là nhiệm vụ tốt hơn khi sử dụng cloud-config. Thay vì viết code theo trình tự, hãy mô tả kết quả mong muốn và để cloud-init lo việc đó. Dưới đây là file cloud-config cài đặt Docker theo đúng 5 bước trên. Lưu ý bạn cần:
Khi cloud-init xử lý file cloud-config này, nó sẽ thực hiện các bước sau theo thứ tự:
-
Cập nhật các gói đã cài đặt.
-
Thêm repository của Docker vào nguồn apt.
-
Cài đặt Docker CE.
-
Khởi động lại máy chủ.
Cách ghi đè người dùng mặc định
Bạn có thể sử dụng cloud-init để thay đổi cấu hình người dùng mặc định. Ví dụ dưới đây tạo ra một người dùng mặc định tên là steve
thay vì người dùng mặc định của bản phân phối (như root hoặc ubuntu), và loại bỏ yêu cầu nhập mật khẩu khi sử dụng sudo.
Module default_user hỗ trợ các tùy chọn khác như cài đặt SSH keys, đặt ngày hết hạn và định nghĩa chính sách mật khẩu cho người dùng.
Cách ghi các file tùy ý
Bạn có thể ghi các file tùy ý bằng cloud-config. Nội dung file có thể được mã hóa dưới dạng base64 hoặc gzip và sẽ được giải mã trước khi ghi vào file. Nội dung có thể là văn bản thuần hoặc nhị phân. Nếu bạn sử dụng dữ liệu nhị phân, hãy đảm bảo sử dụng tùy chọn YAML !!!binary. Dưới đây là ví dụ về một số định dạng khác nhau.
Xem tài liệu write_files để biết thêm thông tin.
Cách thêm một repository mới
Việc thêm Extra Packages for Enterprise Linux (EPEL) cho các bản phân phối dựa trên yum là một tác vụ phổ biến. Sử dụng file cloud-config sau để tự động thêm repository EPEL 8 vào file /etc/yum.repos.d/epel_example.repo
.
Xem tài liệu yum-add-repo để biết thêm chi tiết.
Cách đặt hostname
Bạn có thể sử dụng module hostname để đặt hostname của hệ thống và tên miền đầy đủ (FQDN).
Xem tài liệu set-hostname để tìm hiểu thêm về module này.
Cách khởi động lại instance
Đôi khi, sau khi triển khai, khởi động lại instance là điều cần thiết. Nếu bạn chèn đoạn sau vào cuối file cloud-config, instance sẽ khởi động lại sau 10 phút kể từ khi cloud-init hoàn thành.
Cách ghi đè vendor-data của DataOnline
Khi bạn triển khai một instance mới, cloud-init sẽ cập nhật tất cả các gói hệ thống trước khi kích hoạt SSH. Quá trình này mất vài phút. Các chỉ thị này được đặt trong vendor-data của DataOnline, nhưng bạn có thể muốn bỏ qua chúng để kết nối SSH đến instance càng sớm càng tốt. May mắn thay, bạn có thể ghi đè các chỉ thị vendor-data đó trong cloud-config. Để vô hiệu hóa việc cập nhật, hãy đặt hai giá trị sau thành false trong cloud-config của bạn.
Chúng tôi không khuyến nghị làm như vậy, nhưng điều đó là có thể. Nếu bạn vô hiệu hóa các bản cập nhật ban đầu như vậy, hãy thực hiện chúng theo cách khác ngay sau khi triển khai.
Đó chỉ là một ví dụ, nhưng bạn có thể ghi đè bất kỳ giá trị vendor-data nào. Nếu bạn tò mò về các giá trị hiện có, hãy đăng nhập vào một instance với quyền root và truy vấn cloud-init. Lệnh sau sẽ in ra tất cả metadata của instance, bao gồm cả vendor-data đã sử dụng:
Hãy cẩn thận: Ghi đè quá nhiều giá trị có thể làm hỏng instance của bạn, và một số có thể ngăn instance khởi động hoàn toàn.
Các ví dụ cloud-config khác
Canonical công bố một số ví dụ cloud-config hữu ích trên GitHub, nơi bạn có thể tìm thấy các ví dụ hoạt động như:
Bạn có thể tìm thấy thêm các ví dụ trong tài liệu cloud-init.
Các lệnh cloud-init hữu ích khác
Bạn có thể sử dụng cloud-init sau khi instance được triển khai để thực hiện nhiều tác vụ hữu ích. Sử dụng một trong các subcommand dưới đây kèm tham số --help
để biết thêm chi tiết:
-
init
Khởi tạo cloud-init và thực hiện các module khởi tạo ban đầu. -
modules
Kích hoạt các module với cấu hình đã cho. -
single
Chạy một module đơn lẻ. -
query
Truy vấn metadata chuẩn hóa của instance từ dòng lệnh. -
dhclient-hook
Chạy hook của dhclient để ghi lại thông tin mạng. -
features
Liệt kê các tính năng đã định nghĩa. -
analyze
Công cụ phát triển: phân tích logs và dữ liệu của cloud-init. -
devel
Chạy các công cụ phát triển. -
collect-logs
Thu thập và nén tất cả thông tin debug của cloud-init. -
clean
Xóa logs và các artifact để cloud-init có thể chạy lại.
Ví dụ, để phát hiện đám mây mà instance được triển khai, hãy sử dụng:
Kết quả sẽ trả về, ví dụ: dataonline
.
Để xóa cloud-init, buộc nó chạy lại ở lần khởi động tiếp theo, sử dụng:
Cách cung cấp user-data khi triển khai instance
Bạn có thể cung cấp user-data thông qua cổng khách hàng (customer portal), API của DataOnline hoặc dataonline-cli (trong trường hợp này cũng sẽ được thay thế bởi DataOnline nếu cần). Để minh họa cho từng phương pháp, giả sử bạn muốn triển khai một máy chủ Rocky Linux 8 tại New Jersey.
User-data này cài đặt MySQL sử dụng định dạng cloud-config.
Cách sử dụng customer portal
Để thêm user-data vào instance của bạn, hãy truy cập trang triển khai trong customer portal. Khi bạn thực hiện các lựa chọn, tích vào ô Enable Cloud-Init User-Data trong mục Additional Features. Ô này sẽ hiện ra trường nhập liệu, nơi bạn dán user-data dưới dạng văn bản thuần.
Hoàn tất các lựa chọn của bạn, sau đó nhấn Deploy Now.
Cách sử dụng dataonline-cli
Khi triển khai máy chủ với dataonline-cli, bạn phải cung cấp vị trí, plan và hệ điều hành. Dưới đây là một ví dụ tối giản cho Rocky Linux 8 với 1GB RAM tại New Jersey, không có user-data.
Để thêm user-data vào instance đó, hãy làm theo các bước sau:
-
Tạo file user-data với tên
myconfig.txt
. -
Gán nội dung file cho một biến tạm:
-
Truyền biến đó cho dataonline-cli với tham số
--userdata
:
Sau khi dataonline-cli triển khai instance, nó sẽ trả về ID của instance, bạn có thể dùng ID đó để kiểm tra user-data:
Kết quả trả về sẽ giống như nội dung file gốc, chứng tỏ user-data đã được gán thành công cho instance.
Cách sử dụng DataOnline API
Khác với customer portal và dataonline-cli, API của DataOnline yêu cầu user-data được mã hóa base64 trong payload JSON của header request. Dưới đây là cách thực hiện qua dòng lệnh với curl.
Bước 1: Mã hóa user-data
Sử dụng file myconfig.txt
đã tạo ở ví dụ trước.
Mã hóa file với base64 và sao chép kết quả ra clipboard:
Bước 2: Tạo file payload cho curl
Tạo file có tên payload.txt
với nội dung là user-data đã mã hóa base64, dùng cùng region, plan và os như ví dụ trước. Ví dụ:
Bước 3: Tạo instance mới bằng cách gọi endpoint create-instance với curl
Lệnh dưới đây sẽ đọc file payload và gửi request:
Lệnh trên sẽ trả về một đối tượng JSON chứa ID của instance. Dùng ID đó để truy xuất user-data:
Kết quả trả về sẽ là một đối tượng JSON, dữ liệu bên trong khớp với user-data đã mã hóa bạn cung cấp.
{"user_data":{"data":"I2Nsb3VkLWNvbmZpZwoKcGFja2FnZXM6CiAgLSBteXNxbC1zZXJ2ZXIK"}}
Cách gỡ lỗi cloud-init
Nếu cloud-init không hoạt động như mong đợi, đã đến lúc bạn cần xem xét các log của cloud-init.
Vị trí log
Các log chính là:
-
/var/log/cloud-init.log
-
/var/log/cloud-init-output.log
Bạn cũng có thể tìm thêm các log nội bộ của cloud-init trong thư mục /run/cloud-init
.
Ngoài việc xem trực tiếp các log này, bạn có thể sử dụng lệnh cloud-init analyze
để phân tích các log.
Một nguồn thông tin khác hữu ích là file /var/lib/cloud/status.json
, ghi lại các giai đoạn đã chạy và thời gian bắt đầu, kết thúc của từng giai đoạn.
File cấu hình
Các file cấu hình nằm ở:
-
/etc/cloud/cloud.cfg
-
/etc/cloud/cloud.cfg.d/*.cfg
Chúng định nghĩa các module chạy trong quá trình khởi tạo instance, datasource được đánh giá khi khởi động, và các cài đặt khác.
File dữ liệu
Bên trong thư mục /var/lib/cloud/
, có hai thư mục con quan trọng:
-
/var/lib/cloud/instance
Đây là một liên kết tượng trưng trỏ tới thư mục instance-id được sử dụng gần nhất, chứa:-
Vendor-data và user-data của cloud-init, rất hữu ích để xem lại.
-
Thông tin đầy đủ về datasource đã được dùng để thiết lập hệ thống.
-
File boot-finished, là bước cuối cùng cloud-init thực hiện.
-
-
/var/lib/cloud/data
Chứa thông tin liên quan đến lần khởi động trước:-
instance-id
: ID của instance được cloud-init phát hiện. Thay đổi file này không có tác dụng. -
result.json
: Hiển thị datasource được dùng để thiết lập instance và nếu có lỗi xảy ra. -
status.json
: Hiển thị datasource đã dùng, phân tích chi tiết các module (nếu có lỗi) và thời gian bắt đầu, kết thúc.
-
Thông tin bổ sung
Cloud-init rất mạnh mẽ và thường xuyên được cập nhật với các module mới và các datasource của nhà cung cấp.
Việc triển khai máy chủ trở nên dễ dàng hơn với DataOnline, nhưng bạn đã biết giá thuê VPS cạnh tranh chưa? Chỉ từ 54.000 VNĐ/tháng, bạn sở hữu VPS chất lượng cao. Tìm hiểu chi tiết bảng giá thuê VPS tại DataOnline để chọn gói phù hợp nhất!