21.kubectlAppy
1. Bí mật nằm ở "Cuộc so sánh Ba bên" 🕵️♂️¶
Sự "thông minh" của kubectl apply
không phải là ma thuật, mà là một quy trình so sánh rất logic dựa trên 3 nguồn thông tin:
-
File Cấu hình Cục bộ (Local File):
-
Đây là file YAML trên máy của bạn, định nghĩa trạng thái bạn mong muốn.
-
Cấu hình "Sống" (Live Configuration):
-
Đây là trạng thái hiện tại của object đang chạy trên cụm Kubernetes (được lưu trong
etcd
). -
Cấu hình đã áp dụng lần cuối (Last Applied Configuration):
-
Đây là một "ảnh chụp" của file YAML từ lần cuối cùng bạn chạy
kubectl apply
. Nó được lưu lại để tham chiếu.
kubectl apply
sẽ nhìn vào cả ba nguồn này để quyết định phải làm gì.
2. Luồng hoạt động của apply
¶
a. Khi chạy apply
lần đầu (Tạo mới)¶
- Bạn chạy
kubectl apply -f my-pod.yaml
. apply
thấy object này chưa tồn tại, nó sẽ tạo mới object đó trên cụm.- Bước đặc biệt: Sau khi tạo,
apply
sẽ lấy nội dung filemy-pod.yaml
của bạn, chuyển nó sang định dạng JSON và lưu nó như mộtannotation
ngay trên object vừa tạo. Cáiannotation
này chính là "Last Applied Configuration".
b. Khi chạy apply
để cập nhật hoặc xóa một trường¶
- Bạn chỉnh sửa file YAML cục bộ của mình (ví dụ: đổi
image
hoặc xóa mộtlabel
). - Bạn chạy lại
kubectl apply -f my-pod.yaml
. apply
bắt đầu so sánh:- Để cập nhật một trường: Nó so sánh file local của bạn với cấu hình "sống". Thấy có sự khác biệt, nó sẽ cập nhật cấu hình "sống".
- Để XÓA một trường (Đây là lúc "Last Applied Configuration" tỏa sáng ✨):
apply
thấy trường đó đã biến mất khỏi file local của bạn.- Nó sẽ nhìn vào "Last Applied Configuration" và thấy: "Ồ, lần trước cái trường này có tồn tại".
- Từ đó, nó suy ra rằng bạn đã cố ý xóa trường này, và nó sẽ tiến hành xóa trường đó khỏi cấu hình "sống".
- Sau khi mọi thay đổi hoàn tất,
apply
sẽ lại cập nhậtannotation
"Last Applied Configuration" với nội dung mới nhất từ file local của bạn.
3. "Last Applied Configuration" được lưu ở đâu? 🤫¶
- Nó được lưu trữ dưới dạng một
annotation
trên chính object đang chạy trên cụm. - Tên của annotation đó là:
kubectl.kubernetes.io/last-applied-configuration
.
4. Lời cảnh báo quan trọng: Đừng "Lai căng"! ⚠️¶
- Chỉ có lệnh
kubectl apply
mới tạo ra và sử dụngannotation
"Last Applied Configuration". - Các lệnh mệnh lệnh như
kubectl create
haykubectl replace
hoàn toàn không quan tâm đến annotation này. - Do đó, bạn không nên trộn lẫn hai phương pháp này trên cùng một object. Nếu bạn đã bắt đầu quản lý một object bằng
apply
, hãy luôn dùngapply
cho nó về sau. Nếu bạn dùngreplace
xen vào,apply
sẽ bị "bối rối" ở lần chạy tiếp theo và có thể gây ra kết quả không mong muốn.
5. "Chốt hạ" cho Kỳ thi CKA 📝¶
kubectl apply
"thông minh" vì nó thực hiện phép so sánh ba bên (local, live, last-applied).- Hiểu rõ vai trò của
last-applied-configuration
annotation, đặc biệt là trong việc phát hiện các trường bị xóa. - Không được trộn lẫn việc sử dụng
apply
vớicreate
/replace
trên cùng một object. Hãy chọn một trường phái và theo nó đến cùng!