Đang dần nóng lên. Vài ngày trước, tôi giới thiệu Vagrant – giải pháp ảo hóa nhằm lớn bằng cách trở thành một "wrapper" gọn gàng cho các phần mềm phức tạp hơn như VirtualBox, KVM... Hơn thế, nó chơi ở "đẳng cấp cao" với hỗ trợ container Docker và môi trường cloud server. Mở rộng mô hình đó, hôm nay chúng ta thảo luận một use-case hơi khác, rất "cloud". CoreOS – đã dùng trong bài trước – là một player khác tận dụng cơn sốt cloud, cung cấp tính năng cluster và automation rất đẹp. Chúng ta sẽ học cách khởi động cluster và thảo luận phần networking – phần bị bỏ qua, giải thích không rõ ràng ngay cả trong tài liệu gốc. Hãy theo dõi.
Thiết lập Discovery Token
Khác với lần trước (thử Vagrant trên Windows qua PowerShell để minh chứng tính đa dạng), bài tập này diễn ra trên Linux, cụ thể Xubuntu Vivid. Theo hướng dẫn chính thức, setup CoreOS cho Vagrant không quá khó nhưng cũng không tầm thường như tài liệu online khiến bạn nghĩ. Có sự thiếu kiên nhẫn rõ rệt trong việc bắt đầu.
Sau khi clone repo, bạn có vài file cần chỉnh sửa để khởi động Vagrant. Đầu tiên, sửa file user-data.sample và đổi tên thành user-data. Quan trọng nhất là phần token:
#cloud-config
coreos:
etcd:
# generate a new token for each unique cluster from
https://discovery.etcd.io/new?size=3
# specify the intial size of your cluster with ?size=X
# WARNING: replace each time you 'vagrant destroy'
discovery: https://discovery.etcd.io/<token>
CoreOS dùng định danh duy nhất (token) để các instance nhận diện nhau. Tất cả host cùng token thuộc cùng một swarm, được quản lý tập trung qua dịch vụ cấu hình và discovery chia sẻ etcd.
Tạo token mới: https://discovery.etcd.io/new?size=<size>. Mặc định 3 host. Ghi token và thêm vào file cấu hình, ví dụ: https://discovery.etcd.io/21e4099c23b52a8403640c2d48cdca6f. Sẽ thấy tầm quan trọng sau.
Cài đặt Cluster
Phần hai: định nghĩa số instance CoreOS muốn chạy khi Vagrant khởi động. Cấu hình đơn giản. Thay đổi trong file config.rb.sample (trong thư mục Git clone), đổi tên thành config.rb. Thử với 4 instance để "độc đáo":
# Size of the CoreOS cluster created by Vagrant $num_instances=X
Khởi động Cluster
Chạy Vagrant. Nếu đã clone repo online, sẵn file Vagrantfile mặc định, chạy vagrant init sẽ lỗi:
vagrant init `Vagrantfile` already exists in this directory. Remove it before running `vagrant init`.
Nếu chưa cài VirtualBox hoặc phần mềm ảo hóa khác, sẽ lỗi khi start. Hãy giải quyết trước.
vagrant up The provider 'virtualbox' that was requested to back the machine 'core-01' is reporting that it isn't usable on this system... Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed...
Nếu thành công, Vagrant tạo các instance CoreOS lần lượt. Cần băng thông mạng tốt và RAM nhiều cho cluster lớn.
vagrant up Bringing machine 'core-01' up with 'virtualbox' provider... Bringing machine 'core-02' up with 'virtualbox' provider... ... ==> core-04: Importing base box 'coreos-alpha'... ==> core-04: Matching MAC address for NAT networking... ==> core-04: Checking if box 'coreos-alpha' is up to date... ==> core-04: Setting the name of the VM: coreos-vagrant_core-04_1431799934824_55775 ==> core-04: Fixed port collision for 22 => 2222. Now on port 2202. ==> core-04: Clearing any previously set network interfaces... ==> core-04: Preparing network interfaces based on configuration... core-04: Adapter 1: nat core-04: Adapter 2: hostonly ==> core-04: Forwarding ports... core-04: 22 => 2202 (adapter 1) ==> core-04: Running 'pre-boot' VM customizations... ==> core-04: Booting VM... ==> core-04: Waiting for machine to boot. This may take a few minutes... core-04: SSH address: 127.0.0.1:2202 core-04: SSH username: core core-04: SSH auth method: private key core-04: Warning: Connection timeout. Retrying... ==> core-04: Machine booted and ready! ==> core-04: Setting hostname... ==> core-04: Configuring and enabling network interfaces... ==> core-04: Running provisioner: file... ==> core-04: Running provisioner: shell... core-04: Running: inline script
Sau khi tạo xong, chạy vagrant status để xem thông tin máy và trạng thái.
Networking
Phần thú vị: có 4 VM, làm sao kết nối? Tương tự Docker, ta tìm cách giải quyết. Trước tiên, dùng vagrant ssh để kết nối từng máy (loại bỏ key phiền toái). Phải chạy từ thư mục clone, nếu không sẽ lỗi:
vagrant ssh core-02 -- -A A Vagrant environment or target machine is required to run this command...
Ở thư mục đúng, chạy tốt. Chạy ifconfig thấy tất cả máy có cùng IP, không route giữa nhau. Interface VirtualBox chạy trên segment 172.0.0.1, gây khó khăn. Giống Docker.
Có thể dùng dải mạng internal VirtualBox và điều chỉnh firewall/routing, nhưng cách này không cho biết VM nào dùng IP nào, khó xác định động. Cần cách thanh lịch hơn.
Kết nối qua localhost
Như đã thấy khi khởi động, Vagrant setup SSH cho mỗi VM chạy trên localhost, các port khác nhau bắt đầu từ 2200. SSH vào client:
ssh 127.0.0.1 -p 2202 The authenticity of host '[127.0.0.1]:2202 ([127.0.0.1]:2202)' can't be established. ED25519 key fingerprint is 32:a0:57:58:b3:55:fc:03:c8:89:7d:7c:cc:6f:85:9d. Are you sure you want to continue connecting (yes/no)?
Kết nối qua IP address bất kỳ đâu
Cách trên không dùng cho giao tiếp VM-VM. Đây là lúc discovery token phát huy tác dụng. Khi cluster chạy, truy cập lại URL discovery, giờ sẽ có JSON hữu ích:
Mỗi entry có IP address (ví dụ 172.17.8.103), có thể parse từ output. Bây giờ biết địa chỉ internal, có thể kết nối trực tiếp cho client giao tiếp với peer.
Thiếu một mảnh nhỏ: không biết mật khẩu user core, dùng key cung cấp trong thư mục con vagrant.d. Thêm key và kết nối liền mạch (đã thấy ở hướng dẫn đầu).
Port Forwarding
Chưa đi sâu vào cấu hình box, nhưng biết IP instance rồi có thể sáng tạo. Port forwarding rất giá trị cho VM chạy dịch vụ. Thay đổi trong Vagrantfile. Có thể nhiều cấu hình cho nhiều setup – giống Dockerfile. Ví dụ forward port HTTPS:
config.vm.forward_port 443, <host port>
Nếu theo dõi bài Docker của tôi, mọi thứ dễ dàng: host port, client port, xong. Có thể khai báo nhiều cho mỗi box. Cũng có thể cấu hình thủ công firewall nếu muốn kiểm soát tuyệt đối. Chỉ là "teaser", sau sẽ đi sâu hơn.
Bước tiếp theo: gắn Docker vào, với dải mặc định tương tự (chắc không ngẫu nhiên), bắt đầu chơi với cluster, container, thực thi song song... Vagrant có plugin, sẽ bàn sau. Xong việc, destroy instance.
Tài liệu tham khảo thêm
- CoreOS quickstart guide (có thể hơi nặng)
- Hướng dẫn supervisord (tương tự etcd)
- Cấu hình KVM & VirtualBox song song
Kết luận
Vagrant và CoreOS như những ý tưởng thú vị, hoang dại, phản kháng. Tôi chưa tin chắc giá trị của chúng trong môi trường kinh doanh, tuy nhiên công nghệ wrapper che giấu chi tiết xấu xí đang trỗi dậy và phổ biến. Mọi người muốn công cụ frontend và orchestration, vấn đề là thị trường biến động, không có tiêu chuẩn, dùng thứ xấu như Python, Ruby, JSON. Thôi kệ.
Chúng ta đã chinh phục thêm một mảnh "terror incognita", bạn quen hơn với Vagrant và CoreOS. Tốt đấy, vì bài sau sẽ chơi với các dịch vụ cluster. Chỉ mới bắt đầu.
Nhớ là tôi phải làm tất cả, nên trong vài tháng tới sẽ khám phá hầu như mọi thứ: Fleet, Kubernetes, Mesos, Etcd, và nhiều dự án cool khác. Cũng sẽ tích hợp CoreOS vào cloud provider, chơi với distributed/parallel filesystem, automation như Jenkins, Ansible, thêm name-dropping và buzz để bạn... nôn mửa, và hơn thế nữa. Stay tuned.
Cheers.