Kubernetes Image Volume: Tách biệt Code và Runtime – Chìa khóa tăng tốc triển khai!
Lê Lân
0
Kubernetes v1.33 và Tính Năng Image Volume: Cách Mạng Trong Quản Lý Ứng Dụng Container
Mở Đầu
Kubernetes v1.33 đã đánh dấu một bước tiến quan trọng khi chính thức chuyển tính năng Image Volume sang trạng thái Beta (mặc định tắt). Đây là một bước đột phá trong quản lý container khi cho phép bạn gắn trực tiếp các image OCI dưới dạng volume chỉ đọc vào Pod. Đây không chỉ là một tính năng mới, mà còn mở ra một hướng đi mới trong việc tổ chức và vận hành ứng dụng container.
Thông thường, mọi thứ trong một container được đóng gói “chặt” trong cùng một image, từ runtime, thư viện đến mã nguồn ứng dụng. Điều này gây ra nhiều bất tiện như bản image khổng lồ, khó cập nhật và hiệu suất CI/CD kém. Với Image Volume, bạn có thể tách riêng từng phần như mã nguồn, runtime, thư viện… thành các image nhỏ hơn và mount độc lập. Đặc biệt với các ngôn ngữ scripting như Node.js, Python, đây là một cuộc cách mạng về cách thức đóng gói và triển khai.
Bài viết này sẽ hướng dẫn chi tiết về Image Volume, từ cách xây dựng image “code-only” siêu nhẹ, đến các chiến lược cập nhật và áp dụng thực tế trong môi trường Kubernetes.
Image Volume Là Gì Và Vì Sao Nó Vượt Trội?
Khái Niệm Cốt Lõi
Image Volume là một tính năng trong Kubernetes cho phép mount trực tiếp một OCI image dưới dạng volume chỉ đọc (read-only volume) vào trong container. Thay vì phải đóng gói runtime và ứng dụng trong cùng image, bạn có thể:
Mount một image chứa mã nguồn và cấu hình (code-only image)
Sử dụng một image khác làm runtime (ví dụ: node, python)
Tách riêng thư viện và các thành phần cần thiết khác thành các image độc lập
Lợi Ích Đáng Kể
Phân chia rõ ràng giữa runtime và code giúp quản lý linh hoạt hơn.
Tạo các image ứng dụng siêu nhẹ chỉ chứa code, giảm đáng kể kích thước image.
Tăng hiệu quả CI/CD do không cần build lại runtime mỗi khi code thay đổi.
Dễ dàng cập nhật bản vá bảo mật runtime chỉ bằng cách thay đổi base image.
Điều này trái ngược hoàn toàn so với mô hình “all-in-one” trước đây, vốn làm tăng kích thước image và hạn chế khả năng phối hợp giữa runtime và code.
Xây Dựng Image "Code-Only" Siêu Nhẹ Với Node.js
📁 index.js – Ứng Dụng Đơn Giản
const http = require('http');
http.createServer((_, res) => res.end('Hello from OCI volume!\n'))
.listen(process.env.PORT || 80);
Một server HTTP đơn giản trả về chuỗi “Hello from OCI volume!” dùng Node.js.
🐳 Dockerfile – Chỉ Dùng FROM scratch
FROM scratch
COPY app /
Sử dụng FROM scratch có nghĩa là bắt đầu từ một image trống hoàn toàn.
Chỉ copy folder app chứa mã nguồn vào image.
Không có runtime Node.js trong image này.
📏 Kích Thước: Chỉ 134 Bytes!
Image
Kích thước
Mô tả
localhost:5001/hello-app
134 Bytes
Chỉ chứa mã nguồn Node.js và config
Image cực kỳ nhẹ, build nhanh, push nhanh, giảm tải cho quy trình CI/CD. Khi code không đổi, image có thể tái sử dụng, tăng hiệu quả cache.
Quan trọng: Với cách đóng gói này, runtime Node.js được cung cấp bởi một container riêng biệt. Image code-only chỉ làm nhiệm vụ chứa mã nguồn và cấu hình.
Chiến Lược Cập Nhật Base Image: An Toàn và Tự Động
📦 Instant Base Image Patches
Một ưu điểm lớn của Image Volume là việc cập nhật bản vá bảo mật cho base image runtime trở nên cực kỳ dễ dàng.
✅ Pattern 1: Dùng Cố Định Tag và Cập Nhật Thủ Công
Ví dụ base image runtime là node:22.15.0.
Khi ra bản vá, nâng version lên node:22.15.1.
Chỉ cần thay đổi image trong YAML của Pod và redeploy — không cần rebuild image code!
- image: mirror.gcr.io/node:22.15.0
+ image: mirror.gcr.io/node:22.15.1
Ưu điểm: An toàn, kiểm soát tốt, phù hợp môi trường sản xuất.
🔄 Pattern 2: Dùng Tag Nổi (Floating Tags) và Cập Nhật Tự Động
Dùng tag như node:22 kèm imagePullPolicy: Always.
Kubernetes tự động lấy bản mới nhất khi Pod khởi động lại.
image:node:22
imagePullPolicy:Always
⚠️ Cẩn trọng với phương án này vì cập nhật tự động có thể gây ra lỗi (regression) không mong muốn do thay đổi phiên bản mới.
💡 Tóm Tắt So Sánh Chiến Lược
Chiến Lược
Ưu điểm
Nhược điểm
Fixed tags + Manual update
Ổn định, dự đoán được
Phải cập nhật thủ công
Floating tags + Pull Always
Tự động cập nhật patch mới
Rủi ro gặp bug mới, không kiểm soát
Lựa chọn chiến lược phù hợp tùy thuộc vào môi trường và yêu cầu độ ổn định.
Hướng Dẫn Thực Hành: Triển Khai Ứng Dụng Node.js Với Image Volume
Bước 1: Tạo Cluster với ImageVolume Được Bật
#!/usr/bin/env bash
set -euox pipefail
# Tạo script tạm thời và tải example script kind-with-registry