How We Upgrade Kubernetes on GKE

Bài tóm tắt Gojek 2020 3. Quy mô lớn Độ khó: Trung bình

Gojek · 2020 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Kubernetes ra một bản minor mỗi quý; team Engineering Platform của Gojek phải theo kịp trên nhiều cụm GKE.
  • Cụm tạo bằng Terraform + GitOps: module tạo cụm trong repo riêng, plan và apply chạy trong CI.

Thay đổi chính (quy trình nâng cấp)

  • Mặc định cụm regional: control plane có bản sao ở nhiều zone, nâng cấp master không làm mất api-server (theo tác giả, chưa thấy suy giảm nào khi master regional tự nâng cấp).
  • Thứ tự: master trước, rồi node pool. Node chạy chậm hơn master được, khuyến nghị lệch tối đa 2 minor; thử đúng bộ phiên bản trên cụm staging trước. Đọc release note, changelog mỗi lần (thường có API bị xoá).
  • Node pool: nâng từng zone; dùng surge upgrade (tạo node mới, đợi kubelet Ready, rồi drain và cordon node cũ); tắt autoscaling trong lúc nâng. Không nâng nhiều node pool cùng lúc được; không hạ phiên bản node pool được (chỉ tạo pool mới).
  • Release channel (stable cho production) và maintenance window để giới hạn lúc GKE tự nâng.
  • Bẫy: từ 1.14, traffic từ pod tới dải IP nội bộ không còn được NAT, có thể bị chặn nếu chưa whitelist dải pod; thêm ip-masq-agent.
  • Tránh downtime cho service: replica ≥ số zone, pod anti-affinity theo zone; service 1 replica sẽ down khi node bị drain. PodDisruptionBudget có minAvailable bằng số pod đang chạy sẽ chặn luôn việc nâng cấp. StatefulSet có thể phải chấp nhận down ngắn.
  • Đã tự động hoá: script xuất bảng trạng thái pod (replica, tuổi, pending/crashloop, CPU/RAM node) kèm team sở hữu tra từ service registry; CLI cho các bước nâng master, tắt/bật surge và autoscale, nâng node pool, đặt release channel. Bước sau: tự động hoá cả trình tự.
  • Luân phiên người làm: mỗi tuần một người mới vào roster, người tuần trước dẫn việc nâng cấp và truyền bối cảnh; theo playbook, mỗi tuần ra thêm một cải tiến, automation hay tài liệu; có thời gian dev dành riêng trong sprint.

Vì sao

  • Theo tác giả: managed Kubernetes cho nền ổn định để team tập trung xây nền tảng; tự vận hành cụm (đã từng làm) cần người chuyên giữ cụm.
  • Việc nâng cấp nhàm nhưng không tránh được; làm đều theo playbook trước, rồi tự động hoá dần những gì lặp lại.

Bài học cho SWE

Liên quan