0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Giải Quyết Vấn Đề Cấu Hình VM với Eryph và Docker

Đăng vào 2 tuần trước

• 7 phút đọc

Vấn Đề Cấu Hình VM

Trong thế giới phát triển phần mềm, vấn đề "chạy trên máy của tôi" đã được Docker giải quyết hiệu quả. Tuy nhiên, với các máy ảo (VM), chúng ta thường phải xây dựng lại môi trường hai lần: một lần cho phát triển và một lần cho sản xuất. Không chỉ vậy, bạn còn có thể cần phải xây dựng lại cho CI, kiểm thử, và nhiều môi trường khác.

Bạn dành cả tuần để thiết lập môi trường phát triển hoàn hảo - cấu hình dịch vụ, tinh chỉnh cơ sở dữ liệu, mọi thứ hoạt động cùng nhau. Nhưng khi đến lúc triển khai, những tiện ích trong môi trường phát triển như người dùng mặc định, khóa không an toàn, công cụ gỡ lỗi thì không thể sử dụng. Bạn phải bắt đầu lại từ một hình ảnh cơ sở sạch và viết lại hoàn toàn các kịch bản cấp phát, tái xây dựng mọi thứ bạn đã hoàn thành.

Các VM phát triển trở thành những hộp cát không thể tái sử dụng ở nơi khác. Bạn hoàn thiện một thứ gì đó trong phát triển, và sau đó bắt đầu lại cho sản xuất với các công cụ khác, cấu hình khác, mọi thứ đều khác.

Điều này tạo ra một sự ngắt quãng cơ bản. Môi trường phát triển của bạn được tối ưu hóa cho sự tiện lợi của nhà phát triển - người dùng mặc định, công cụ gỡ lỗi, mạng lưới thân thiện với phát triển. Ngược lại, môi trường sản xuất cần được tăng cường bảo mật, giám sát và cấu hình tuân thủ.

Các công cụ hiện tại xử lý vấn đề này bằng cách tách biệt hoàn toàn giữa phát triển và sản xuất. Vagrant nổi bật với các môi trường phát triển thông qua các hộp tiện lợi và phối hợp đơn giản. Mặt khác, sản xuất lại sử dụng các công cụ hoàn toàn khác - Terraform, cloud-init, và các nền tảng phối hợp doanh nghiệp.

Kết quả? Bạn tốn thời gian để hoàn thiện các cấu hình mà cần các giải pháp phức tạp để tái sử dụng. Kiến thức không chuyển giao dễ dàng giữa các môi trường. Phát triển trở thành một hộp cát cần phải dịch thuật cho sản xuất.

Mô Hình Docker cho Cấu Hình VM

Có một công cụ mới mang tên eryph, mà có cách tiếp cận khác biệt.

Docker cho phép bạn xây dựng một hình ảnh tại chỗ, đẩy nó lên registry, sau đó kéo chính xác hình ảnh đó trong sản xuất. Cùng các lớp, cùng cấu hình, mọi thứ giống hệt nhau.

Eryph làm điều tương tự, nhưng cho các cấu hình VM thay vì hình ảnh container. Bạn tạo ra những thứ gọi là "gene" - những khối cấu hình VM có thể tái sử dụng. Một gene có thể cấu hình nginx, một gene khác có thể thiết lập ngăn xếp ứng dụng của bạn. Bạn kết hợp chúng lại với nhau như các lớp Docker.

Nhưng không giống như các hộp Vagrant mà phụ thuộc vào môi trường, các gene của eryph hoạt động ở mọi nơi. Cấu hình nginx mà tôi viết cho phát triển là chính xác cấu hình nginx mà chạy trong sản xuất.

Cấu Hình Chia Sẻ Thực Tế

Để minh họa cách thức hoạt động của điều này, hãy xem một ví dụ.

Giả sử tôi đang xây dựng một ứng dụng web cần nginx. Trong môi trường phát triển, tôi muốn có những tiện ích - một người dùng mặc định mà tôi có thể SSH vào, có thể có một số công cụ gỡ lỗi. Trong sản xuất, tôi cần cùng một cấu hình nginx nhưng với bảo mật và giám sát được tăng cường.

Trong môi trường phát triển của tôi:

yaml Copy
# dev-server.yaml
name: nginx-dev
parent: dbosoft/ubuntu-22.04/latest          # Cơ sở trung lập
fodder:
  # Tiện ích cho phát triển 
- source: gene:dbosoft/starter-food:linux-starter
- source: gene:myorg/nginx-config            # CẤU HÌNH CHIA SẺ
- source: gene:myorg/app-stack               # CẤU HÌNH CHIA SẺ

Trong sản xuất, tôi sử dụng chính xác cùng một cơ sở và cùng một cấu hình ứng dụng:

yaml Copy
# prod-server.yaml
name: nginx-prod
parent: dbosoft/ubuntu-22.04/latest    # Cùng cơ sở trung lập
fodder:
- source: gene:myorg/nginx-config      # Cùng cấu hình nginx
- source: gene:myorg/app-stack         # Cùng cấu hình ứng dụng
- source: gene:myorg/prod-hardening    # Thêm cho sản xuất
- source: gene:myorg/monitoring        # Thêm cho sản xuất

Cấu hình nginx và ứng dụng là giống hệt nhau giữa phát triển và sản xuất. Chỉ có những yếu tố cụ thể cho môi trường là thay đổi.

Khi tôi sửa một lỗi trong cấu hình nginx hoặc tối ưu hóa điều gì đó, cả hai môi trường đều nhận được cải tiến tự động. Không cần phải xây dựng lại sản xuất từ đầu, không cần đồng bộ thủ công, không cần lo lắng liệu dev và prod có bị tách rời hay không.

Tại Sao Điều Này Hoạt Động Tốt Hơn

Đó thực sự giống như các lớp Docker, nhưng cho các VM. Thay vì xây dựng lại mọi thứ cho mỗi môi trường, bạn kết hợp từ các phần chia sẻ.

Cách truyền thống lãng phí rất nhiều công sức:

  • Phát triển: Hộp Vagrant với các kịch bản tùy chỉnh, vứt bỏ tất cả sau này
  • Sản xuất: Bắt đầu lại với hình ảnh cơ sở khác, kịch bản khác

Với eryph, bạn xây dựng trên những nền tảng chia sẻ:

  • Phát triển: Cơ sở trung lập + các tiện ích cho phát triển + cấu hình ứng dụng của bạn
  • Sản xuất: Cùng cơ sở trung lập + cùng cấu hình ứng dụng + gia tăng bảo mật

Thử Ngay

Bạn muốn xem cách thức hoạt động của nó? Hãy để tôi hướng dẫn bạn thiết lập một cấu hình có thể chia sẻ.

Đầu tiên, cài đặt eryph. Nó chạy trên Windows với Hyper-V:

powershell Copy
# Chạy trong PowerShell với quyền quản trị
irm https://raw.githubusercontent.com/eryph-org/eryph/main/src/apps/src/Eryph-zero/install.ps1 | iex

Nếu bạn đang sử dụng MacOs/Linux, bạn vẫn có thể sử dụng eryph thông qua các lệnh powershell - nhưng bạn cần một máy chia sẻ với eryph-zero ở đâu đó.

Bây giờ tôi sẽ tạo một cấu hình máy chủ web có thể hoạt động cả trong phát triển và sản xuất:

yaml Copy
# web-config.yaml
name: shared-webserver
parent: dbosoft/ubuntu-22.04/latest
fodder:
- source: gene:dbosoft/starter-food:linux-starter
- name: nginx-setup
  type: cloud-config
  content:
    package_update: true
    packages:
      - nginx
    write_files:
    - path: /var/www/html/index.html
      content: |
        <h1>Cấu Hình Chia Sẻ Hoạt Động!</h1>
        <p>Cấu hình này chạy giống hệt trong phát triển và sản xuất</p>
    runcmd:
      - systemctl enable nginx
      - systemctl start nginx

Triển khai và kiểm tra nó:

powershell Copy
# Triển khai VM
Get-Content web-config.yaml | New-Catlet | Start-Catlet

# Lấy IP và kiểm tra
$ip = (Get-Catlet | `
   Where-Object Name -eq "shared-webserver" | ` 
   Get-CatletIp).IpAddress
start "http://$ip"

Cấu hình máy chủ web đó sẽ hoạt động giống hệt trong sản xuất, chỉ với các gene xung quanh khác cho việc tăng cường bảo mật và giám sát.

Không còn phải duy trì các cấu hình riêng biệt mà từ từ tách rời nhau. Không cần phải xây dựng lại cùng một cấu hình nginx theo ba cách khác nhau cho phát triển, thử nghiệm và sản xuất.

Các cấu hình trở nên có thể di chuyển và chia sẻ, giống như hình ảnh Docker nhưng cho các VM hoàn chỉnh. Bạn có thể đẩy các gene nginx đã được chứng minh của mình lên genepool của eryph, người khác có thể kéo và xếp lớp ứng dụng của họ lên trên, mọi người đều được hưởng lợi từ các cải tiến.

Nó cũng hoạt động với bất kỳ công cụ nào bạn đang sử dụng. Nếu bạn là người dùng Vagrant, có một nhà cung cấp vagrant-eryph. Người dùng PowerShell có các cmdlet bản địa. Thậm chí còn có một ứng dụng GUI nếu bạn thích điều đó.

Các VM được xây dựng bởi eryph có thể được sử dụng trực tiếp với một cài đặt Hyper-V tại chỗ hoặc tải lên Azure. Đối với các nền tảng khác, cấu hình có sẵn dưới dạng ISO cloud-init được tạo ra, tương thích với tất cả các nền tảng và hình ảnh hỗ trợ cloud-init.

Bạn muốn thử không? Hướng dẫn nhanh có tất cả những gì bạn cần để bắt đầu, và bạn có thể duyệt các cấu hình hiện có tại genepool.eryph.io. Tất cả đều là mã nguồn mở và miễn phí cho công việc phát triển.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào