Triển khai Talos Linux cho Kubernetes: Hệ điều hành Immutable an toàn và tối giản

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Bối cảnh & Lý do lựa chọn

Lúc đó là 2:15 sáng Chủ nhật. PagerDuty phát đi cảnh báo Sev-1 khẩn cấp: ba worker node trong cluster production đồng loạt báo trạng thái NodeNotReady. Bạn SSH vào máy chủ để kiểm tra log và phát hiện ra một kỹ sư đã chạy lệnh apt-get upgrade thủ công trong ca trực hôm thứ Sáu. Bản cập nhật đó đã vô tình nâng cấp dependency glibc dùng chung và làm hỏng runtime của kubelet. Cấu hình hệ thống bị lệch (configuration drift) trong âm thầm và không ai nhận ra cho đến khi bộ lập lịch (scheduler) cố gắng triển khai một bản release định kỳ.

Các bản phân phối đa mục đích như Ubuntu, Debian hay RHEL ban đầu vốn không được thiết kế chỉ để chạy container. Chúng đi kèm hàng loạt trình quản lý gói, systemd unit, interactive shell, tài khoản người dùng và hàng nghìn dependency động. Mỗi thành phần có thể thay đổi (mutable) trên ổ đĩa đó vừa là một bề mặt tấn công tiềm ẩn, vừa là một rủi ro vận hành lớn.

Talos Linux loại bỏ hoàn toàn mô hình truyền thống này. Đây là một hệ điều hành immutable được xây dựng chuyên dụng, thiết kế dành riêng cho Kubernetes:

  • Không SSH hay Shell: Không có bash, không có trình thông dịch Python và cũng không có SSH daemon lắng nghe trên cổng 22. Bạn không thể đăng nhập tương tác hay vá nóng (hot-patch) các binary đang chạy.
  • Phân vùng Root SquashFS ở chế độ Read-Only: Hệ điều hành cốt lõi khởi động vào một filesystem chỉ đọc trên RAM. Trạng thái tạm thời (ephemeral state) được cô lập hoàn toàn, ngăn chặn mã độc lưu lại lâu dài và chặn các hành vi ghi đĩa trái phép.
  • Quản trị hoàn toàn qua API: Mọi tác vụ vận hành—từ thiết lập mạng cho đến tinh chỉnh kernel sysctl—đều được thực hiện qua gRPC API bảo mật trên cổng 50000 thông qua talosctl và cơ chế mutual TLS (mTLS).
  • Dung lượng siêu nhỏ: Toàn bộ image cài đặt chỉ nặng khoảng 80 MB, so với mức 1.5–2.5 GB của các bản phân phối Linux doanh nghiệp tiêu chuẩn. Nó chỉ đóng gói kernel Linux, hệ thống init PID 1 tùy chỉnh viết bằng Go, containerd và các thành phần cốt lõi của Kubernetes.

Việc áp dụng một hệ điều hành immutable giúp loại bỏ triệt để tình trạng lệch cấu hình ngay từ gốc rễ. Khi một node gặp sự cố, bạn không còn phải mất hàng giờ để debug các gói hệ thống bị hỏng. Bạn chỉ việc xóa trắng node hoặc triển khai lại một image nguyên bản hoàn toàn mới.

Cài đặt

Bạn quản lý cluster Talos theo mô hình khai báo (declarative) trực tiếp từ máy trạm cục bộ thông qua hai công cụ dòng lệnh: talosctl để quản lý hệ điều hành và kubectl để điều phối workload.

1. Cài đặt talosctl và các công cụ cần thiết

Tải xuống client talosctl chính thức:

# Tải xuống và cài đặt binary talosctl mới nhất
curl -sL https://talos.dev/install | bash

# Kiểm tra phiên bản client
talosctl version --client

2. Khởi tạo các file cấu hình Cluster

Talos thay thế các trình hướng dẫn cài đặt thủ công bằng các cấu hình YAML khai báo. Hãy tạo trước các machine config đã được ký mã hóa cho cả control plane lẫn worker node.

Trong ví dụ này, endpoint của control plane trỏ tới 192.168.1.100:6443, worker node nằm tại 192.168.1.101, và tên cluster là talos-prod-01:

# Tạo PKI secret và các cấu hình máy (machine config)
talosctl gen config talos-prod-01 https://192.168.1.100:6443 \
  --output-dir ./_out

Lệnh này sẽ tạo ra bốn file quan trọng bên trong thư mục ./_out:

  • controlplane.yaml: Cấu hình máy cho các instance control plane (chạy etcd, kube-apiserver, kube-controller-manager).
  • worker.yaml: Cấu hình máy cho các compute node chạy workload container.
  • talosconfig: Thông tin xác thực quản trị chứa client certificate dành cho talosctl.
  • secrets.yaml: Chứa root certificate, khóa mã hóa và bootstrap token.

3. Khởi động Node bằng Image Talos Linux

Khởi động phần cứng máy chủ, máy ảo Proxmox hoặc cloud instance (AWS AMI, GCP, Hetzner) của bạn bằng file ISO Talos chính thức hoặc raw disk image. Ở lần khởi động đầu tiên, Talos sẽ tự động vào chế độ bảo trì (maintenance mode), mở gRPC API trên cổng 50000 và chờ nhận dữ liệu cấu hình.

Cấu hình

Khi các instance đã có thể kết nối được qua mạng, hãy đẩy các cấu hình vừa tạo trực tiếp qua gRPC.

1. Thiết lập Context cho talosctl cục bộ

Trỏ CLI trên máy trạm của bạn tới file talosconfig đã tạo và xác định endpoint của node mục tiêu:

# Trỏ talosctl tới file cấu hình vừa tạo
export TALOSCONFIG="./_out/talosconfig"

# Thiết lập endpoint và node mục tiêu mặc định
talosctl config endpoint 192.168.1.100
talosctl config node 192.168.1.100

2. Áp dụng Machine Configuration cho các Node

Gửi định nghĩa YAML tới từng máy chủ. Talos sẽ kiểm tra tính hợp lệ của schema, cài đặt hệ điều hành vào ổ đĩa chỉ định (ví dụ: /dev/sda hoặc /dev/nvme0n1) và tiến hành khởi động lại.

# Áp dụng cấu hình cho node Control Plane
talosctl apply-config --insecure \
  --nodes 192.168.1.100 \
  --file ./_out/controlplane.yaml

# Áp dụng cấu hình cho node Worker
talosctl apply-config --insecure \
  --nodes 192.168.1.101 \
  --file ./_out/worker.yaml

Lưu ý: Cờ --insecure chỉ cần thiết trong lần bắt tay đầu tiên trước khi TLS certificate riêng cho từng node được thiết lập.

3. Bootstrap etcd và Kubernetes Control Plane

Sau khi node control plane khởi động lại, hãy khởi tạo cụm etcd (dù là single-node hay multi-node) chỉ bằng một lệnh duy nhất:

# Thực thi khởi tạo cụm etcd (chỉ chạy một lần)
talosctl bootstrap --nodes 192.168.1.100

Thao tác này sẽ kích hoạt tiến trình giám sát PID 1 để khởi chạy etcd, nạp các manifest của static pod và dựng Kubernetes API server lên.

4. Lấy file kubeconfig

Tạo file kubeconfig quyền admin được xác thực với hệ thống PKI nội bộ của cluster:

# Tải admin kubeconfig trực tiếp qua Talos API
talosctl kubeconfig ./kubeconfig --nodes 192.168.1.100
export KUBECONFIG="$(pwd)/kubeconfig"

# Kiểm tra quyền truy cập vào cluster
kubectl get nodes -o wide

Kiểm tra & Giám sát

Vì các tiện ích chẩn đoán truyền thống như systemctl, top và journalctl không hề tồn tại trên node, mọi tác vụ xử lý sự cố đều được thực hiện thông qua talosctl.

1. Kiểm tra các Service cốt lõi và Runtime Log

Kiểm tra tình trạng hoạt động của các service cốt lõi do Talos trực tiếp quản lý (chẳng hạn như machined, containerd và kubelet):

# Liệt kê tất cả dịch vụ nội bộ của Talos OS và trạng thái chạy
talosctl services --nodes 192.168.1.100

# Xem stream log trực tiếp từ dịch vụ kubelet
talosctl logs kubelet --nodes 192.168.1.100 --tail 50

2. Dashboard Terminal tích hợp sẵn

Talos tích hợp sẵn một dashboard theo dõi thời gian thực ngay trên terminal. Công cụ này hiển thị tải CPU, áp lực bộ nhớ, băng thông mạng và trạng thái container mà không cần cài đặt thêm bất kỳ monitoring agent của bên thứ ba nào:

# Khởi chạy giao diện dashboard tương tác trên terminal (TUI)
talosctl dashboard --nodes 192.168.1.100

3. Kiểm tra sức khỏe etcd và trạng thái phần cứng

Khi cần khắc phục sự cố trên control plane, bạn có thể truy vấn trực tiếp tình trạng etcd ở mức low-level cũng như tài nguyên hệ thống:

# Kiểm tra thành viên etcd và tình trạng của leader
talosctl etcd status --nodes 192.168.1.100

# Kiểm tra các network interface đang hoạt động và storage mount
talosctl get interfaces --nodes 192.168.1.100
talosctl get disks --nodes 192.168.1.100

4. Nâng cấp hệ điều hành dạng Atomic, Zero-Downtime

Việc nâng cấp Talos Linux không bao giờ can thiệp vào từng package riêng lẻ. Thay vào đó, nó sẽ hoán đổi toàn bộ OS image dưới dạng atomic thông qua cơ chế phân vùng kép A/B:

# Kích hoạt nâng cấp OS atomic trên một worker node
talosctl upgrade \
  --nodes 192.168.1.101 \
  --image ghcr.io/siderolabs/installer:v1.8.0 \
  --preserve=true

Trong quá trình này, Talos sẽ tiến hành drain các workload đang chạy thông qua Kubernetes, ghi image mới vào phân vùng phụ, khởi động lại trong vòng 15–30 giây và thực hiện các bước health check tích hợp sẵn. Nếu kernel mới không thể khởi chạy thành công, bootloader sẽ tự động rollback về phân vùng hoạt động bình thường trước đó.

Share: