Quay lại danh sách
Tin tức công nghệ

Tự động hóa xây dựng VHD/QCOW2 Image tích hợp sẵn Docker và K3s với OpenTofu và Packer

3 tháng 6, 2026

Giới thiệu về xu hướng Immutable Infrastructure và nhu cầu chuẩn hóa Image

Trong kỷ nguyên điện toán đám mây và kiến trúc microservices, tốc độ và tính nhất quán khi triển khai hạ tầng là hai yếu tố quyết định sự thành công của một hệ thống công nghệ thông tin doanh nghiệp. Phương pháp cấu hình thủ công hoặc sử dụng các script cấu hình sau khi khởi tạo máy ảo (VM) truyền thống thường đối mặt với rủi ro lớn về Configuration Drift (sự sai lệch cấu hình) và kéo dài thời gian Time-to-Market.

Để giải quyết bài toán này, xu hướng Immutable Infrastructure (Hạ tầng bất biến) đã trở thành một tiêu chuẩn vàng. Thay vì liên tục cập nhật và sửa đổi trên các máy ảo đang chạy, chúng ta xây dựng các bản Image hoàn chỉnh, được kiểm thử kỹ lưỡng và triển khai chúng đồng loạt. Bài viết này sẽ hướng dẫn chi tiết cách kết hợp bộ đôi công cụ mã nguồn mở mạnh mẽ: Packer và OpenTofu nhằm tự động hóa hoàn toàn quy trình đóng gói các định dạng Image chuẩn như VHD hoặc QCOW2 tích hợp sẵn Docker và K3s, sẵn sàng vận hành trên mọi Cloud Provider.

Tại sao lựa chọn OpenTofu, Packer, Docker và K3s?

Trước khi đi sâu vào giải pháp kỹ thuật, hãy cùng phân tích giá trị chiến lược mà hệ sinh thái công nghệ này mang lại cho doanh nghiệp:

  • Packer (by HashiCorp): Công cụ hàng đầu giúp tự động hóa việc tạo ra các máy ảo giống nhau từ một mã nguồn duy nhất (Template) cho nhiều nền tảng cấu hình khác nhau.
  • OpenTofu: Bản fork nguồn mở và hướng cộng đồng từ Terraform (sau khi HashiCorp thay đổi giấy phép sang BSL). OpenTofu đóng vai trò quản lý và phân bổ tài nguyên hạ tầng để Packer thực thi quy trình build.
  • Docker & K3s: Docker cung cấp môi trường runtime core ổn định cho các container, trong khi K3s (phiên bản Kubernetes rút gọn từ Rancher) là lựa chọn hoàn hảo cho môi trường Edge Computing, IoT hoặc các cụm CI/CD tối giản nhờ mức tiêu thụ tài nguyên cực thấp nhưng giữ nguyên đầy đủ tính năng của Kubernetes chuẩn.
"Việc tích hợp sẵn Docker và K3s vào tầng Image (VHD/QCOW2) giúp giảm thời gian boot-up và thiết lập node mới từ vài chục phút xuống chỉ còn vài giây, tăng khả năng Auto-scaling tối đa cho hệ thống."

Kiến trúc quy trình tự động hóa đóng gói Image

Quy trình triển khai tự động hóa từ mã nguồn đến một Image sẵn sàng chạy trên Cloud được chia làm 3 giai đoạn cốt lõi:

  1. Khởi tạo tài nguyên (OpenTofu): Tạo lập các thành phần mạng (VPC, Subnet, Security Group) và tài nguyên lưu trữ tạm thời phục vụ cho quá trình build.
  2. Đóng gói Image (Packer): Tạo máy ảo base (ví dụ: Ubuntu Enterprise), thực thi các script cài đặt Docker, K3s, tối ưu hóa các tham số kernel hệ điều hành và xuất ra định dạng mong muốn (QCOW2 cho OpenStack/KVM, VHD cho Azure/Hyper-V).
  3. Dọn dẹp và Lưu trữ: Hủy các tài nguyên tạm thời và chuyển giao sản phẩm Image vào thư viện quản lý tập trung.

Hướng dẫn cấu hình chi tiết bằng Code

1. Định nghĩa cấu hình xây dựng Image với Packer

Dưới đây là tệp cấu hình mẫu ubuntu-k3s.pkr.hcl sử dụng QEMU plugin để tạo ra định dạng QCOW2 hoặc VHD:

packer {
  required_plugins {
    qemu = {
      version = ">= 1.0.0"
      source  = "[github.com/hashicorp/qemu](https://github.com/hashicorp/qemu)"
    }
  }
}

source "qemu" "ubuntu-k3s" {
  iso_url          = "[https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso](https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso)"
  iso_checksum     = "sha256:a4ada1b2e88fbcc18a0ca174d71e27e59443dbd1ffb5dae05a58ca973cfb8a6e"
  output_directory = "output-image"
  shutdown_command = "echo 'packer' | sudo -S shutdown -P now"
  disk_size        = "20000M"
  format           = "qcow2"
  ssh_username     = "ubuntu"
  ssh_password     = "configured_password"
  ssh_timeout      = "20m"
}

2. Viết Script Provisioning cài đặt Docker và K3s

Chúng ta sử dụng một shell script (scripts/install-deps.sh) được gọi bởi Packer để tiến hành cài đặt tự động các thành phần phụ thuộc bên trong máy ảo:

#!/bin/bash
set -e

# Cập nhật hệ thống
sudo apt-get update && sudo apt-get upgrade -y

# Cài đặt Docker Engine
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] [https://download.docker.com/linux/ubuntu](https://download.docker.com/linux/ubuntu) $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# Cài đặt K3s không tự động khởi chạy (để tránh xung đột token khi nhân bản)
curl -sfL [https://get.k3s.io](https://get.k3s.io) | INSTALL_K3S_SKIP_ENABLE=true sh -

# Dọn dẹp hệ thống tối ưu dung lượng Image
sudo apt-get clean && sudo rm -rf /var/lib/apt/lists/*

Sau đó, bổ sung khối build vào tệp Packer cấu hình ở trên:

build {
  sources = ["source.qemu.ubuntu-k3s"]

  provisioner "shell" {
    script = "scripts/install-deps.sh"
  }
}

3. Sử dụng OpenTofu điều phối quy trình phân phối Image

Sau khi Packer xuất ra file Image, OpenTofu sẽ chịu trách nhiệm đẩy file này lên các môi trường Multi-Cloud (AWS S3, Azure Blob Storage, OpenStack Glance). Ví dụ cấu hình OpenTofu lưu trữ Image lên hệ thống Cloud:

provider "openstack" {
  auth_url = "[https://my-cloud-provider.com:5000/v3](https://my-cloud-provider.com:5000/v3)"
}

resource "openstack_images_image_v2" "k3s_base_image" {
  name             = "ubuntu-22.04-docker-k3s-v1"
  image_source_url = "./output-image/packer-ubuntu-k3s.qcow2"
  container_format = "bare"
  disk_format      = "qcow2"

  properties = {
    os_version = "22.04"
    architecture = "x86_64"
  }
}

Những lưu ý quan trọng để tối ưu hóa Image cho môi trường Production

Khi đóng gói Image phân phối diện rộng cho môi trường doanh nghiệp, cần đặc biệt lưu ý các điểm sau:

  • Bảo mật thông tin nhạy cảm: Tuyệt đối không hardcode SSH Key, API token, hoặc mật khẩu admin trong quá trình build của Packer. Hãy sử dụng cơ chế Vault hoặc gán Dynamic Credentials tại thời điểm khởi tạo VM thực tế qua cloud-init.
  • Xóa bỏ định danh máy (Machine ID): Trước khi hoàn tất build, cần reset machine-id (sudo truncate -s 0 /etc/machine-id) để tránh xung đột cấp phát IP DHCP khi nhân bản hàng loạt VM từ một Image.
  • Tối ưu hóa dung lượng: Sử dụng lệnh nén đĩa ảo để chuyển đổi kích thước thực tế nhỏ nhất có thể, giúp tăng tốc độ truyền tải qua mạng giữa các Cloud Data Center.

Kết luận

Việc áp dụng chiến lược tự động hóa xây dựng Image với OpenTofu và Packer là bước tiến lớn giúp doanh nghiệp làm chủ hạ tầng đám mây một cách nhất quán và chuyên nghiệp. Một Image chuẩn hóa chứa sẵn Docker và K3s không chỉ giảm thiểu rủi ro vận hành, tăng cường khả năng phục hồi thảm họa (Disaster Recovery), mà còn thiết lập nền tảng vững chắc cho các quy trình CI/CD GitOps hiện đại hoạt động trơn tru trên mọi nền tảng Cloud Provider.

Tự động hóa xây dựng VHD/QCOW2 Image tích hợp sẵn Docker và K3s với OpenTofu và Packer | DPTCloud