Chạy Máy ảo trên Kubernetes: Hướng dẫn cài đặt KubeVirt cho HomeLab của bạn

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Tại sao nên chạy Máy ảo trên Kubernetes?

Hầu hết những người đam mê HomeLab đều bắt đầu với Docker hoặc một cụm Kubernetes nhẹ để chạy các media server như Plex hoặc các ứng dụng web đơn giản. Cuối cùng, bạn sẽ gặp phải giới hạn. Có thể bạn cần chạy một thiết bị mạng chuyên dụng, một ứng dụng Windows cũ không thể đóng gói thành container, hoặc một phiên bản kernel Linux cụ thể. Thường thì điều này buộc bạn phải duy trì một hypervisor riêng biệt như Proxmox hoặc ESXi.

Việc phải xoay xở giữa hai hệ thống quản lý khác nhau dễ dẫn đến sai lệch cấu hình và gây mệt mỏi. Tôi đã tìm kiếm một cách để quản lý mọi thứ thông qua một API duy nhất. KubeVirt thu hẹp khoảng cách này bằng cách mở rộng Kubernetes, cho phép nó điều phối và quản lý Máy ảo (VM) giống như bất kỳ Pod nào khác. Tôi đã chạy mô hình này hơn một năm để host các build server cũ, và độ ổn định cực kỳ tốt trong khi giúp giảm một nửa công sức quản lý.

Lợi ích của giải pháp KubeVirt

  • Mạng lưới thống nhất: VM của bạn có thể nằm sau một Kubernetes Service hoặc Ingress tiêu chuẩn. Điều này có nghĩa là Windows VM có thể sử dụng chung bộ cân bằng tải Traefik hoặc Nginx như các container web khác.
  • Quản lý theo kiểu khai báo (Declarative): Định nghĩa VM trong tệp YAML. Bạn có thể quản lý phiên bản toàn bộ hạ tầng trong Git và triển khai chỉ với lệnh kubectl apply đơn giản.
  • Hiệu quả tài nguyên: Bạn không cần một hệ điều hành hypervisor chuyên dụng. Nếu các node còn trống RAM, chúng có thể chạy VM. Trong các thử nghiệm của tôi, tài nguyên tiêu hao của launcher pod trong KubeVirt là không đáng kể—thường dưới 100MB RAM.

Cài đặt: Chuẩn bị Cluster

Trước khi bắt đầu với YAML, hãy xác nhận phần cứng của bạn có hỗ trợ ảo hóa. KubeVirt chạy KVM bên trong một pod. Nếu các node Kubernetes của bạn bản thân chúng đã là máy ảo (ảo hóa lồng nhau – nested virtualization), bạn phải bật tính năng đó trong hypervisor nền tảng trước.

Bước 1: Kiểm tra hỗ trợ ảo hóa phần cứng

Chạy lệnh này trên các node để xem các phần mở rộng VMX (Intel) hoặc SVM (AMD) có đang hoạt động hay không:

grep -E 'vmx|svm' /proc/cpuinfo

Nếu kết quả trả về trống, hãy kiểm tra cài đặt BIOS. Đối với những ai chạy trên các board ARM như Raspberry Pi, KubeVirt có thể sử dụng mô phỏng phần mềm. Tuy nhiên hãy lưu ý: tốc độ sẽ rất chậm, thường chậm hơn 10 lần so với ảo hóa tăng tốc phần cứng.

Bước 2: Triển khai KubeVirt Operator

KubeVirt sử dụng mô hình Operator để quản lý vòng đời của chính nó. Thành phần này xử lý các công việc nặng nhọc như cài đặt các Custom Resource Definitions (CRDs) cần thiết. Hãy luôn lấy chuỗi phiên bản mới nhất từ các bản phát hành chính thức để đảm bảo tính tương thích.

# Lấy phiên bản mới nhất
export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | grep tag_name | cut -d '"' -f 4)

# Triển khai Operator
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

# Triển khai KubeVirt Custom Resource
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml

Bước 3: Cài đặt virtctl

Các lệnh kubectl tiêu chuẩn có thể thực hiện các tác vụ cơ bản, nhưng bạn sẽ cần binary virtctl để kiểm soát chi tiết hơn. Nó xử lý console VNC, khởi động/dừng VM và upload image. Đây là một bản tải xuống khoảng 20MB giúp cuộc sống dễ dàng hơn nhiều.

VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -L -o virtctl https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/virtctl-${VERSION}-linux-amd64
chmod +x virtctl
sudo install virtctl /usr/local/bin/virtctl

Cấu hình: Lưu trữ và Image

Việc đưa một file ISO hoặc image QCOW2 dung lượng lớn vào cluster thường là phần khó nhất. KubeVirt sử dụng Containerized Data Importer (CDI) để tự động hóa việc này. Nó có thể tải image trực tiếp từ HTTP server hoặc S3 bucket và ghi chúng vào Persistent Volume.

Cài đặt CDI

export VERSION=$(curl -s https://api.github.com/repos/kubevirt/containerized-data-importer/releases/latest | grep tag_name | cut -d '"' -f 4)
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/${VERSION}/cdi-operator.yaml
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/${VERSION}/cdi-cr.yaml

Tạo Máy ảo đầu tiên

Khi CDI đã chạy, chúng ta có thể định nghĩa một VM. Ví dụ này sử dụng image Fedora Cloud. Phần DataVolume yêu cầu CDI tải image 400MB và tự động chuẩn bị một ổ đĩa 10GB cho chúng ta.

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: fedora-vm
spec:
  running: false
  template:
    spec:
      domain:
        devices:
          disks:
          - disk: {bus: virtio}
            name: datavolumedisk
        resources:
          requests:
            memory: 2Gi
      volumes:
      - dataVolume:
          name: fedora-dv
        name: datavolumedisk
  dataVolumeTemplates:
  - metadata:
      name: fedora-dv
    spec:
      storage:
        resources:
          requests:
            storage: 10Gi
        storageClassName: local-path
      source:
        http:
          url: "https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"

Áp dụng manifest này. Bạn sẽ thấy một pod ‘importer’ khởi chạy. Trên đường truyền gigabit, thường mất khoảng 45 giây để tải xuống và xác thực image Fedora trước khi VM sẵn sàng khởi động.

Xác minh & Giám sát

Tôi thường đặt running: false trong file YAML ban đầu. Điều này ngăn VM cố gắng khởi động trong khi image vẫn đang được tải xuống. Khi trạng thái PVC hiển thị là ‘Bound’, bạn đã sẵn sàng.

Khởi động VM

Khởi động máy ảo bằng công cụ CLI mới của bạn:

virtctl start fedora-vm

Truy cập Console

Sự tích hợp của KubeVirt với terminal rất tuyệt vời. Bạn có thể vào serial console mà không cần tìm địa chỉ IP hay cấu hình SSH trước:

virtctl console fedora-vm

Đối với các VM Windows hoặc desktop Linux, hãy sử dụng VNC tunnel. Lệnh này sẽ mở một cổng cục bộ và khởi chạy trình xem VNC mặc định của bạn: virtctl vnc fedora-vm.

Kinh nghiệm thực chiến đúc kết

  • Ưu tiên VirtIO: Luôn sử dụng bus: virtio. Theo các bài đo kiểm (benchmark) của tôi, driver VirtIO cung cấp tốc độ I/O đĩa nhanh hơn tới 3 lần so với SATA mô phỏng.
  • Tự động hóa với Cloud-Init: Đừng lãng phí thời gian tạo người dùng thủ công. Hãy sử dụng cloudInitNoCloud để truyền các SSH public key và cấu hình mạng ngay trong lần khởi động đầu tiên.
  • Mạng nâng cao: Nếu bạn cần VM có IP thực trong mạng VLAN gia đình (thay vì IP nội bộ cluster 10.x.x.x), hãy tìm hiểu về Multus CNI. Nó cho phép bạn bridge trực tiếp VM vào giao diện mạng vật lý.

Việc thiết lập KubeVirt biến cụm Kubernetes của bạn thành một đám mây riêng (private cloud) thực thụ. Mặc dù việc quản lý VM qua YAML có một chút rào cản ban đầu, nhưng khả năng quản lý toàn bộ hệ thống tại một nơi duy nhất là một sự nâng cấp đáng giá cho bất kỳ HomeLab nào.

Share: