Chuyển tới nội dung chính

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ảnNằm ở đâuAi ghi
File localMáy bạn / Git (YAML)Bạn
Live objectetcd (có thêm phần status)Kubernetes
Last appliedAnnotation kubectl.kubernetes.io/last-applied-configuration (JSON) nằm trong live objectChỉ 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ợpKết quả
Có trong file localGhi giá trị vào live (ví dụ đổi image 1.18 → 1.19)
Không có trong file, có trong last appliedXóa khỏi live – vì bạn vừa xóa nó khỏi file
Không có trong file lẫn last appliedGiữ 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 image không ghi last applied.
  • Object tạo bằng create rồi chuyển sang apply → bị cảnh báo thiếu annotation, và field đã xóa không bị xóa ở lần apply đó.
  • Muốn create mà vẫn ghi last applied:
kubectl create --save-config -f web.yaml

5. create vs apply​

Tiêu chíkubectl createkubectl apply
Cách tiếp cậnImperative ("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 fileKhông áp dụng✅ (nhờ last applied)
Cập nhật bằngreplace -f / editSử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 yamlKhông có
Hợp vớiThi CKA, tạo nhanh một lầnProduction, 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.