kubectl apply – bên trong hoạt động thế nào?
1. Ba bản cấu hình
Trước khi quyết định thay đổi gì, apply xem xét ba thứ:
| Bản | Nằm ở đâu | Ai ghi |
|---|---|---|
| File local | Máy bạn / Git (YAML) | Bạn |
| Live object | etcd (có thêm phần status) | Kubernetes |
| Last applied | Annotation kubectl.kubernetes.io/last-applied-configuration (JSON) nằm trong live object | Chỉ kubectl apply |
2. Cách hoạt động
- Object chưa có: tạo object, rồi chuyển file local sang JSON, lưu vào annotation last applied.
- Object đã có: so sánh cả 3 bản, cập nhật live, rồi ghi đè last applied bằng bản mới nhất.
Xem annotation:
kubectl get deployment web -o yaml | grep -A3 last-applied
kubectl apply view-last-applied deployment web
3. Quy tắc cho từng field
| Trường hợp | Kết quả |
|---|---|
| Có trong file local | Ghi giá trị vào live (ví dụ đổi image 1.18 → 1.19) |
| Không có trong file, có trong last applied | Xóa khỏi live – vì bạn vừa xóa nó khỏi file |
| Không có trong file lẫn last applied | Giữ nguyên (ví dụ status, label gắn tay) |
💡 Ghi nhớ
Last applied tồn tại để biết field nào bạn đã xóa khỏi file. Không có nó, apply không thể phân biệt "bạn xóa field" với "field do người khác thêm".
4. Đừng trộn imperative với declarative
create,replace,edit,scale,set imagekhông ghi last applied.- Object tạo bằng
createrồi chuyển sangapply→ bị cảnh báo thiếu annotation, và field đã xóa không bị xóa ở lần apply đó. - Muốn
createmà vẫn ghi last applied:
kubectl create --save-config -f web.yaml
5. create vs apply
| Tiêu chí | kubectl create | kubectl apply |
|---|---|---|
| Cách tiếp cận | Imperative ("hãy tạo") | Declarative ("phải như thế này") |
| Object chưa có | ✅ Tạo | ✅ Tạo |
| Object đã có | ❌ Lỗi AlreadyExists | ✅ Cập nhật phần thay đổi |
| Chạy lại nhiều lần | ❌ Lỗi | ✅ unchanged |
| Ghi last applied | ❌ (trừ --save-config) | ✅ |
| Xóa field đã bỏ khỏi file | Không áp dụng | ✅ (nhờ last applied) |
| Cập nhật bằng | replace -f / edit | Sửa file rồi apply -f |
| Tạo nhanh không cần file | ✅ create deployment, create namespace… | ❌ Bắt buộc có file / stdin |
| Sinh YAML mẫu | ✅ --dry-run=client -o yaml | Không có |
| Hợp với | Thi CKA, tạo nhanh một lần | Production, GitOps |
6. Lệnh hữu ích
kubectl diff -f web.yaml # xem trước apply sẽ đổi gì
kubectl apply view-last-applied deploy web # xem bản apply gần nhất
kubectl apply -f ./manifests/ # apply cả thư mục
7. Server-Side Apply (bản hiện đại)
kubectl apply --server-side -f web.yaml
- kube-apiserver tự so sánh, không cần annotation.
- Mỗi field ghi lại ai quản lý nó trong
managedFields. - Nếu hai bên (ví dụ bạn và một controller) cùng sửa một field → báo conflict thay vì ghi đè âm thầm.