Automated testing: 5 lessons from Atlassian's Kubernetes team on testing infrastructure as code

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

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

Bối cảnh

  • Team KITT (Kubernetes Infrastructure Technology Team) vận hành hơn 22 cụm Kubernetes tự cấu hình (không dùng EKS/GKE vì lúc bắt đầu chúng chưa có hoặc thiếu tính năng), từ cụm dev nhỏ tới cụm production rất lớn (2020).
  • Deploy lên mọi cụm nhiều lần mỗi ngày; một PR đã merge tới hết các cụm dưới 15 phút. Vì thay đổi đổ vào liên tục, team dựng pipeline dựng hạ tầng thật, chạy test, phá bỏ trên mỗi commit vào master.

Thay đổi chính

  • Test theo lời hứa với người dùng, không theo thành phần: liệt kê điều nền tảng cam kết (schedule container bằng YAML, truy cập HTTP qua ingress ALB, log tới cổng log công ty, phân giải DNS ba loại, assume IAM role, bị chặn mạng tới tài nguyên nhất định), mở rộng thành danh sách kiểm (node Ready, container hệ thống chạy, metric được thu…), mỗi dòng một test tự động. Không tái hiện mọi kịch bản e2e của từng thành phần; biết có vấn đề quan trọng hơn biết thành phần nào gây ra.
  • Pipeline phải tự động hoàn toàn: mọi bước tay (dù chỉ ba bốn bước khi dựng hạ tầng) bị loại vì mock chúng là bỏ qua chỗ có thể hỏng. Chống flaky: IAM policy vừa xoá rồi tạo lại có thể mất tới 2 phút mới dùng được, Terraform lỗi ngay, nên đành thêm sleep 2 phút. Chạy trong container, cấu hình CI bằng file, secret không bao giờ ra log.
  • Phá bỏ đáng tin: xoá VPC đầy tài nguyên qua CLI phải tự nắm thứ tự phụ thuộc; terraform destroy chậm, hỏng khi state file lệch hay hỏng (build bị ngắt), và vấp prevent_destroy đặt trên máy etcd. Chuyển sang aws-nuke (liệt kê và xoá lặp lại tới khi không còn gì, lọc theo loại, tên, tag), trong một tài khoản AWS riêng cho test; phải gửi PR upstream để thêm bộ lọc cần dùng. Hơn 300 lần build, chưa lần nào phá bỏ thất bại.
  • Giữ lại có chủ đích: gắn Virtual Private Gateway mất khoảng 10 phút mà ít giá trị test, nên giữ VPC và gateway giữa các lần; DNS zone và chứng chỉ ACM ít đổi nên import thay vì tạo lại.
  • Nhiều môi trường test song song: gateway tới mạng công ty do team mạng cấp tay nên giới hạn song song; dựng sẵn nhiều môi trường (IP, gateway gán trước) để branch build và commit chạy cùng lúc thay vì xếp hàng.

Vì sao

  • Kết quả theo Atlassian: pipeline bắt hơn 7 lỗi đã lọt qua review và test tay, từ sai tên/namespace trong YAML tới bản AMI đổi kernel làm cấu hình cũ hỏng.
  • Theo tác giả: hạ tầng khai báo làm deploy nhanh và giải phóng thời gian vận hành tay; nên dùng chính thời gian đó để test tự động liên tục, vì tốc độ thay đổi cao hơn thì lỗi nhiều hơn.

Bài học cho SWE

  • Với hạ tầng, khâu khó nhất của test là phá bỏ chứ không phải dựng; một môi trường không phá sạch được sẽ làm mất niềm tin vào cả bộ test.
  • Phụ thuộc do team khác cấp tay là giới hạn song song thật; tách phần đắt/chậm ít giá trị ra khỏi vòng đời mỗi lần test.

Liên quan