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. applythấ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,
applysẽ lấy nội dung filemy-pod.yamlcủa bạn, chuyển nó sang định dạng JSON và lưu nó như mộtannotationngay trên object vừa tạo. Cáiannotationnà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
imagehoặc xóa mộtlabel). - Bạn chạy lại
kubectl apply -f my-pod.yaml. applybắ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 ✨):
applythấ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,
applysẽ 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
annotationtrê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 applymới tạo ra và sử dụngannotation"Last Applied Configuration". - Các lệnh mệnh lệnh như
kubectl createhaykubectl replacehoà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ùngapplycho nó về sau. Nếu bạn dùngreplacexen vào,applysẽ 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-configurationannotation, đặ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
applyvớicreate/replacetrên cùng một object. Hãy chọn một trường phái và theo nó đến cùng!