Phát hiện sự trôi dạt container trong Kubernetes bằng admission controllers
Các kỹ sư của Box đã xây dựng một admission controller tùy chỉnh và plugin kubectl để phát hiện các thay đổi runtime của container và thực thi chính sách trục xuất pod.
Được dịch tự động từ bản gốc tiếng Anh.
Trong một bài đăng trên Kubernetes Blog vào tháng 12 năm 2021, các kỹ sư tại Box đã mô tả hệ thống mà họ xây dựng để phát hiện và quản lý sự trôi dạt container (container drift) do các lệnh tương tác gây ra. Nhóm đã phát triển một admission controller tùy chỉnh cùng với một plugin kubectl tương ứng để xác định các pod bị thay đổi thông qua kubectl exec hoặc attach và thực thi các chính sách trục xuất tự động.
Chuyện gì đã xảy ra
Box vận hành hàng trăm microservices trên Kubernetes để xử lý luồng dữ liệu quy mô petabyte. Quy trình triển khai của họ dựa trên GitOps, sử dụng kube-applier để áp dụng các cấu hình khai báo từ repository Git sau khi hoàn tất các bước review code và kiểm tra tự động. Quy trình này đảm bảo rằng mọi thay đổi đối với môi trường production đều được theo dõi, xem xét và nhất quán với trạng thái mong muốn được định nghĩa trong code.
Tuy nhiên, các nhà phát triển có thể bỏ qua những biện pháp kiểm soát này bằng cách sử dụng các lệnh tương tác như kubectl exec để sửa đổi trực tiếp các container đang chạy. Những thay đổi ad-hoc này tạo ra "sự trôi dạt container", nơi trạng thái thực tế của container lệch khỏi cấu hình đã khai báo. Các sửa đổi như vậy làm vô hiệu hóa quy trình kiểm soát thay đổi và cho phép các container bị ảnh hưởng tiếp tục phục vụ traffic trong production mà không có sự giám sát.
Để giải quyết khoảng trống về bảo mật và vận hành này, Box đã tạo ra kube-exec-controller, một thành phần Kubernetes tùy chỉnh, cùng với một plugin kubectl có tên là kubectl pi. Hệ thống này phát hiện khi các nhà phát triển tương tác với các container đang chạy, gắn nhãn cho các pod bị ảnh hưởng và cuối cùng trục xuất chúng để khôi phục trạng thái đã khai báo. Dự án đã được mã nguồn mở nhằm giúp các nhóm khác quản lý những rủi ro tương tự trong cụm của họ.
Cách thức hoạt động
Giải pháp tận dụng các admission controller của Kubernetes, vốn chặn đứng các yêu cầu gửi đến API server trước khi các object được lưu trữ. Cụ thể, nhóm đã sử dụng một ValidatingAdmissionWebhook được cấu hình để theo dõi các thao tác CONNECT trên các tài nguyên pods/exec và pods/attach. Khi một nhà phát triển chạy một lệnh tương tác, webhook sẽ gửi yêu cầu đó đến dịch vụ kube-exec-controller để xác thực.

Controller không chặn yêu cầu ban đầu, vì việc từ chối ngay lập tức sẽ cản trở quá trình gỡ lỗi. Thay vào đó, nó cho phép kết nối và gắn nhãn bất đồng bộ cho pod đích với các metadata như tên người dùng của người tương tác và dấu thời gian. Nó cũng ghi lại một sự kiện cảnh báo trên pod. Một quy trình riêng biệt trong controller theo dõi bộ đếm thời gian tồn tại (TTL) cho mỗi pod đã được gắn nhãn. Khi TTL hết hạn, controller sẽ trục xuất pod. Việc trục xuất được ưu tiên hơn so với xóa vì nó tôn trọng PodDisruptionBudgets, đảm bảo tính sẵn sàng của dịch vụ được duy trì trong suốt quá trình dọn dẹp.
Để cải thiện khả năng hiển thị và tính dễ sử dụng, Box đã phát triển plugin kubectl pi. Vì các sự kiện Kubernetes chỉ được giữ lại trong một giờ theo mặc định, plugin này đọc các nhãn và chú thích do controller gắn vào để cung cấp thông tin dễ đọc về các tương tác với pod. Nó bao gồm một subcommand get để xem chi tiết tương tác và một subcommand extend. Lệnh extend cho phép các nhà phát triển yêu cầu thêm thời gian trước khi bị trục xuất bằng cách cập nhật các chú thích của pod, điều này sẽ đặt lại bộ đếm thời gian trục xuất sau khi đi qua một validating webhook khác.
Chi tiết chính
- Hệ thống sử dụng một
ValidatingAdmissionWebhookđể chặn các yêu cầu CONNECT trênpods/execvàpods/attach. - Các pod bị ảnh hưởng được gắn nhãn với metadata bao gồm tên người dùng của người tương tác và dấu thời gian tương tác ban đầu.
- Các pod bị trục xuất sau một TTL được xác định trước, thay đổi tùy theo môi trường (dài hơn cho dev, ngắn hơn cho production).
- Việc trục xuất tôn trọng PodDisruptionBudgets để ngăn ngừa gián đoạn dịch vụ trong các lần khởi động lại bắt buộc.
- Plugin
kubectl picung cấp các subcommandgetvàextendđể xem trạng thái và yêu cầu gia hạn TTL. - Dự án, có tên là
kube-exec-controller, đã được Box mã nguồn mở trên GitHub.
Tại sao điều này quan trọng
Đối với các nhóm xây dựng phần mềm trên Kubernetes, việc duy trì tính toàn vẹn của trạng thái đã triển khai là rất quan trọng đối với bảo mật và độ tin cậy. Quyền truy cập tương tác vào các container là một nhu cầu phổ biến cho việc gỡ lỗi, nhưng nó giới thiệu các thay đổi không được theo dõi có thể dẫn đến sự trôi dạt cấu hình. Nếu không có cơ chế để phát hiện và hoàn tác những thay đổi này, các cụm có thể tích tụ những điểm không nhất quán khiến việc khắc phục sự cố trở nên khó khăn và tăng rủi ro bảo mật.
Cách tiếp cận này minh họa cách các admission controller có thể được sử dụng không chỉ để thực thi chính sách mà còn cho vệ sinh vận hành. Bằng cách tự động hóa việc phát hiện và khắc phục sự trôi dạt, các nhóm có thể cho phép quyền truy cập gỡ lỗi cần thiết trong khi vẫn đảm bảo rằng các hệ thống production cuối cùng sẽ quay trở lại trạng thái đã khai báo và được xem xét. Nó cân bằng giữa sự linh hoạt của nhà phát triển và quản trị nền tảng.
Việc sử dụng trục xuất thay vì chấm dứt ngay lập tức cho thấy sự hiểu biết chín chắn về các ràng buộc trong production. Tôn trọng PodDisruptionBudgets đảm bảo rằng các biện pháp bảo mật không vô tình gây ra thời gian ngừng hoạt động. Mẫu hình này có thể áp dụng cho bất kỳ tổ chức nào sử dụng Kubernetes, nơi yêu cầu quản lý thay đổi nghiêm ngặt song song với các quy trình phát triển và hỗ trợ chủ động.
Bạn có thể làm gì
- Đánh giá các chính sách bảo mật Kubernetes hiện tại của bạn để xem liệu các lệnh tương tác như
kubectl execcó bị hạn chế hay không. - Cân nhắc triển khai một validating admission webhook để giám sát và ghi log các yêu cầu
pods/execvàpods/attach. - Xác định rõ các chính sách TTL cho các pod bị trôi dạt dựa trên môi trường, với các giới hạn nghiêm ngặt hơn cho các cụm production.
- Sử dụng trục xuất pod thay vì xóa khi dọn dẹp các container bị trôi dạt để tôn trọng ngân sách gián đoạn.
- Phát triển hoặc áp dụng các plugin kubectl để cung cấp cho các nhà phát triển khả năng hiển thị vào lịch sử tương tác với pod và bộ đếm thời gian trục xuất.
- Xem xét dự án mã nguồn mở
kube-exec-controllertrên GitHub để hiểu các chi tiết triển khai và điều chỉnh chúng phù hợp với nhu cầu của bạn.


