Tại sao Fedora CoreOS là “mảnh ghép” hoàn hảo cho Container?
Quên đi việc ngồi chờ tải file ISO rồi nhấn “Next” mỏi tay để phân vùng hay tạo user. Nếu bạn đang quản lý một vài server, cách đó vẫn ổn. Nhưng khi con số lên tới hàng chục hay hàng trăm node container, bạn cần một tư duy khác: Tư duy hạ tầng bất biến (Immutable Infrastructure).
Fedora CoreOS (FCOS) sinh ra để giải quyết bài toán này. Sau 2 năm dùng Fedora làm máy chính, mình nhận ra FCOS không phải là một OS vạn năng. Nó tối giản đến mức cực đoan. Bạn không nên SSH vào để sửa file cấu hình thủ công. Thay vào đó, mọi thứ từ user, network đến systemd unit đều được định nghĩa sẵn và thực thi tự động ngay từ lần boot đầu tiên.
Điểm ăn tiền nhất chính là Ignition. Khác với Cloud-init chạy khi OS đã khởi động, Ignition can thiệp ngay từ giai đoạn initramfs. Nó cho phép bạn định dạng ổ đĩa và thiết lập hệ thống file trước khi các tiến trình khác kịp chạy. Nếu cấu hình sai, hệ thống sẽ dừng lại ngay lập tức. Điều này giúp tránh tình trạng server chạy chập chờn do lỗi cấu hình tiềm ẩn.
Chuẩn bị công cụ: Từ YAML sang JSON
Viết file cấu hình Ignition trực tiếp bằng JSON là một “cực hình” vì nó rất dễ sai cú pháp. Để dễ thở hơn, chúng ta dùng Butane. Công cụ này giúp bạn viết cấu hình bằng YAML dễ đọc, sau đó biên dịch sang JSON cho Ignition.
Trên Fedora, bạn cài đặt Butane chỉ với một lệnh:
sudo dnf install butane
Nếu dùng hệ điều hành khác, hãy tận dụng sức mạnh của container:
alias butane='podman run --rm -v ".:/pwd":z --workdir /pwd quay.io/coreos/butane:release'
Thực hành cấu hình Butane và Ignition
Hãy thử tạo một kịch bản thực tế: Tạo user itfromzero, nạp SSH key và tự động chạy container Nginx ngay khi máy vừa khởi động.
1. Soạn thảo file cấu hình Butane (.bu)
Tạo file config.bu. Đừng quên thay đoạn SSH key bằng key cá nhân của bạn để có thể truy cập sau này:
variant: fcos
version: 1.5.0
passwd:
users:
- name: itfromzero
groups:
- sudo
- wheel
ssh_authorized_keys:
- ssh-ed25519 AAAAC3Nza... user@hostname
systemd:
units:
- name: hello-world.service
enabled: true
contents: |
[Unit]
Description=Chạy container Nginx tự động
After=network-online.target
Wants=network-online.target
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/podman kill nginx-server
ExecStartPre=-/usr/bin/podman rm nginx-server
ExecStartPre=/usr/bin/podman pull nginx:latest
ExecStart=/usr/bin/podman run --name nginx-server -p 8080:80 nginx
[Install]
WantedBy=multi-user.target
storage:
files:
- path: /etc/hostname
mode: 0644
contents:
inline: fcos-lab-01
Cấu trúc này gồm 3 phần then chốt. Phần passwd quản lý định danh, loại bỏ việc dùng mật khẩu để tăng bảo mật. Phần systemd quản lý vòng đời container thông qua Podman. Cuối cùng, storage cho phép bạn can thiệp trực tiếp vào file hệ thống như thiết lập hostname.
2. Biên dịch sang file Ignition (.ign)
Bây giờ, hãy chuyển đổi file YAML sang định dạng mà máy có thể hiểu:
butane --pretty --strict config.bu > config.ign
Lưu ý: Bạn không bao giờ nên sửa file .ign bằng tay. Mọi thay đổi hãy thực hiện trên file Butane để đảm bảo tính nhất quán.
Triển khai và kiểm tra thành quả
Để test nhanh mà không cần thuê Cloud, bạn có thể dùng qemu ngay tại máy local. Đầu tiên, hãy tải ảnh đĩa FCOS:
coreos-installer download -f qemu
xz -d fedora-coreos-*.qemu.qcow2.xz
Khởi chạy máy ảo và nạp cấu hình qua tham số -fw_cfg:
qemu-system-x86_64 -m 2048 -cpus 2 \
-drive if=virtio,file=fedora-coreos-qemu.qcow2 \
-fw_cfg name=opt/com.coreos/config,file=config.ign \
-net nic,model=virtio -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:8080
Chỉ mất khoảng 10-15 giây để máy boot xong. Bây giờ, hãy thử SSH vào để kiểm tra:
ssh -p 2222 itfromzero@localhost
Khi đã vào trong, bạn dùng lệnh podman ps để xem container Nginx đã “lên” chưa. Một điểm cộng lớn của FCOS là Zincati. Dịch vụ này tự động cập nhật OS ngầm. Nếu bản update lỗi, hệ thống sẽ tự động rollback về trạng thái ổn định gần nhất.
Nếu cấu hình không chạy như ý, đừng hoảng loạn. Hãy kiểm tra log chi tiết bằng lệnh:
journalctl -u ignition-firstboot-complete
Áp dụng cách tiếp cận này giúp bạn tiết kiệm đến 80% thời gian setup server thủ công. Thay vì loay hoay với từng node, bạn chỉ cần quản lý file cấu hình trong Git. Đối với các bạn DevOps mới vào nghề, thành thạo Ignition là bước đệm vững chắc để tiến tới làm chủ Kubernetes sau này.

