Đã có rất nhiều cuộc thảo luận về eBPF trong các cộng đồng dựa trên đám mây trong 2 năm qua. eBPF là trụ cột chính tại KubeCon, các ngày eBPF và hội nghị thượng đỉnh eBPF đang nhanh chóng trở nên phổ biến, các công ty như Google và Netflix đã sử dụng eBPF trong nhiều năm và các trường hợp sử dụng mới luôn xuất hiện. Đặc biệt là ở khả năng quan sát, eBPF được kỳ vọng sẽ là nhân tố thay đổi cuộc chơi.
Vì vậy, hãy xem xét eBPF - công nghệ này là gì, nó ảnh hưởng đến khả năng quan sát như thế nào, so sánh nó với các thực tiễn về khả năng quan sát hiện có như thế nào và tương lai có thể nắm giữ điều gì?
eBPF là một khung lập trình cho phép chúng tôi chạy các chương trình hộp cát một cách an toàn trong nhân Linux mà không cần thay đổi mã nhân.
Ban đầu nó được phát triển cho Linux (và nó vẫn là nơi công nghệ phát triển nhất hiện nay), nhưng Microsoft đang nhanh chóng phát triển triển khai eBPF cho Windows .
Các chương trình eBPF theo thiết kế có hiệu quả cao và an toàn - chúng được xác minh bởi nhân để đảm bảo chúng không gây rủi ro cho tính ổn định hoặc bảo mật của hệ điều hành.
Để hiểu điều này, chúng ta cần hiểu Không gian người dùng và Không gian hạt nhân.
Không gian người dùng là nơi tất cả các ứng dụng chạy. Không gian hạt nhân nằm giữa không gian người dùng và phần cứng vật lý. Các ứng dụng trong không gian người dùng không thể truy cập trực tiếp vào phần cứng. Thay vào đó, chúng thực hiện các cuộc gọi hệ thống tới nhân, sau đó nhân sẽ truy cập vào phần cứng.
Tất cả quyền truy cập bộ nhớ, đọc/ghi tệp và lưu lượng truy cập mạng đều đi qua nhân. Nhân cũng quản lý các tiến trình đồng thời.
Về cơ bản, mọi thứ đều đi qua nhân (xem Hình bên dưới).
Và eBPF cung cấp một cách an toàn, bảo mật để mở rộng chức năng kernel.
Trong lịch sử, vì những lý do rõ ràng, việc thay đổi bất kỳ thứ gì trong mã nguồn nhân hoặc lớp hệ điều hành là cực kỳ khó.
Nhân Linux có 30 triệu dòng mã và phải mất vài năm để bất kỳ thay đổi nào từ một ý tưởng trở nên phổ biến rộng rãi. Đầu tiên, cộng đồng Linux phải đồng ý với nó. Sau đó, nó phải trở thành một phần của bản phát hành Linux chính thức. Sau đó, sau một vài tháng, nó được chọn bởi các bản phân phối như Red Hat và Ubuntu, đưa nó đến với nhiều đối tượng hơn.
Về mặt kỹ thuật, một người có thể tải các mô-đun hạt nhân vào nhân của mình và thực hiện các thay đổi trực tiếp, nhưng điều này có rủi ro rất cao và liên quan đến lập trình cấp nhân phức tạp, vì vậy hầu như mọi người đều tránh được.
eBPF xuất hiện và giải quyết vấn đề này - đồng thời cung cấp một cơ chế an toàn và hiệu quả để đính kèm và chạy các chương trình trong nhân.
Hãy xem cách eBPF đảm bảo cả tính bảo mật và hiệu suất.
Xác minh nghiêm ngặt - Trước khi bất kỳ chương trình eBPF nào có thể được tải vào nhân, nó được xác minh bởi trình xác minh eBPF , đảm bảo mã này tuyệt đối an toàn - ví dụ: không có vòng lặp cứng, truy cập bộ nhớ không hợp lệ, hoạt động không an toàn.
Hộp cát - Các chương trình eBPF được chạy trong hộp cát cách ly bộ nhớ trong nhân, tách biệt với các thành phần nhân khác. Điều này ngăn chặn truy cập trái phép vào bộ nhớ kernel, cấu trúc dữ liệu và mã nguồn kernel.
Hoạt động hạn chế - Các chương trình eBPF thường phải được viết bằng một tập hợp con nhỏ của ngôn ngữ C - một tập lệnh hạn chế. Điều này giới hạn các hoạt động mà các chương trình eBPF có thể thực hiện, giảm nguy cơ lỗ hổng bảo mật.
Chạy dưới dạng mã máy gốc - Các chương trình eBPF được chạy dưới dạng hướng dẫn máy gốc trên CPU. Điều này dẫn đến thực hiện nhanh hơn và hiệu suất tốt hơn.
Không có chuyển đổi ngữ cảnh - Một ứng dụng thông thường thường xuyên chuyển đổi ngữ cảnh giữa không gian người dùng và không gian nhân, sử dụng nhiều tài nguyên. Các chương trình eBPF, khi chúng chạy trong lớp nhân, có thể truy cập trực tiếp vào các tài nguyên và cấu trúc dữ liệu nhân.
Hướng sự kiện - Các chương trình eBPF thường chỉ chạy để đáp ứng với các sự kiện kernel cụ thể thay vì luôn bật. Điều này giảm thiểu chi phí.
Tối ưu hóa cho phần cứng - Các chương trình eBPF được trình biên dịch JIT (Just-In-Time) của nhân biên dịch thành mã máy ngay trước khi thực thi, vì vậy mã được tối ưu hóa cho phần cứng cụ thể mà nó chạy trên đó.
Vì vậy, eBPF cung cấp một hook an toàn và hiệu quả vào kernel để lập trình. Và với điều kiện mọi thứ đều đi qua hạt nhân, điều này mở ra một số khả năng mới mà cho đến bây giờ vẫn chưa thể thực hiện được.
Công nghệ xung quanh eBPF đã phát triển trong một thời gian dài và đã được ~ 30 năm hình thành.
Trong 7-8 năm qua, eBPF đã được một số công ty lớn sử dụng trên quy mô lớn và giờ đây chúng ta đang bước vào kỷ nguyên mà việc sử dụng eBPF đang trở thành xu hướng chủ đạo. Xem video này của Alexei Starovoitov , người đồng sáng tạo Linux và đồng bảo trì eBPF, về quá trình phát triển của eBPF.
1993- Một bài báo từ Phòng thí nghiệm quốc gia Lawrence Berkeley khám phá việc sử dụng tác nhân hạt nhân để lọc gói. Đây là nơi bắt nguồn cái tên BPF (“Bộ lọc gói Berkeley”).
1997 - BPF chính thức được giới thiệu như một phần của nhân Linux (phiên bản 2.1.75).
1997-2014 - Một số tính năng được thêm vào để cải thiện, ổn định và mở rộng khả năng của BPF.
2014 - Một bản cập nhật quan trọng được giới thiệu, được gọi là "Bộ lọc gói Berkeley mở rộng" (eBPF). Phiên bản này tạo ra những thay đổi lớn đối với công nghệ BPF và làm cho nó được sử dụng rộng rãi hơn - do đó có từ "mở rộng"
Tại sao bản phát hành này lại lớn, đó là vì điều này làm cho việc mở rộng chức năng kernel trở nên dễ dàng .
Một lập trình viên có thể ít nhiều viết mã giống như họ viết một ứng dụng thông thường - và cơ sở hạ tầng eBPF xung quanh đảm nhiệm việc xác minh, bảo mật và hiệu quả ở mức độ thấp.
Toàn bộ hệ sinh thái hỗ trợ và giàn giáo xung quanh eBPF giúp điều này trở nên khả thi (xem hình bên dưới).
Nguồn: https://ebpf.io/what-is-ebpf/
Thậm chí tốt hơn, các chương trình eBPF có thể được tải và dỡ bỏ khỏi kernel mà không cần khởi động lại.
Tất cả điều này đột nhiên cho phép áp dụng và áp dụng rộng rãi.
Sự phổ biến của eBPF đã bùng nổ trong 7-8 năm qua, với một số công ty lớn sử dụng nó trong các hệ thống sản xuất quy mô.
Đến năm 2016, Netflix đã sử dụng rộng rãi eBPF để theo dõi. Brendan Gregg , người đã triển khai nó, được biết đến rộng rãi trong giới cơ sở hạ tầng & hoạt động với tư cách là người có thẩm quyền về eBPF.
2017 - Facebook mã nguồn mở Katran , bộ cân bằng tải dựa trên eBPF của họ. Mọi gói tin đến Facebook.com kể từ năm 2017 đều được chuyển qua eBPF.
2020- Google đã đưa eBPF trở thành một phần trong dịch vụ Kubernetes của mình. eBPF hiện cung cấp năng lượng cho lớp mạng, bảo mật và khả năng quan sát của GKE. Hiện tại, các công ty như Capital One và Adobe cũng đã áp dụng rộng rãi cho doanh nghiệp.
2021 - Facebook, Google, Netflix, Microsoft & Isovalent đã cùng nhau công bố nền tảng eBPF để quản lý sự phát triển của công nghệ eBPF.
Hiện có hàng nghìn công ty sử dụng eBPF và hàng trăm dự án eBPF ra đời mỗi năm khám phá các trường hợp sử dụng khác nhau.
eBPF hiện là một hệ thống con riêng biệt trong nhân Linux với một cộng đồng rộng lớn để hỗ trợ nó. Bản thân công nghệ đã mở rộng đáng kể với một số bổ sung mới.
Các trường hợp sử dụng phổ biến nhất cho eBPF nằm trong 3 lĩnh vực -
Bảo mật và kết nối mạng đã được áp dụng và ứng dụng rộng rãi hơn, được thúc đẩy bởi các dự án như Cilum . Để so sánh, các dịch vụ khả năng quan sát dựa trên eBPF phát triển sớm hơn và chỉ mới bắt đầu.
Trước tiên, hãy xem xét các trường hợp sử dụng trong bảo mật và kết nối mạng.
Bảo mật là một trường hợp sử dụng rất phổ biến đối với eBPF. Sử dụng eBPF, các chương trình có thể quan sát mọi thứ xảy ra ở cấp độ nhân, xử lý các sự kiện ở tốc độ cao để kiểm tra hành vi không mong muốn và đưa ra cảnh báo nhanh hơn nhiều so với cách khác.
Ví dụ -
Google sử dụng eBPF để phát hiện xâm nhập trên quy mô lớn
Shopify sử dụng eBPF để triển khai bảo mật vùng chứa
Một số dịch vụ bảo mật của bên thứ ba hiện sử dụng eBPF để thu thập và giám sát dữ liệu.
Mạng là một trường hợp sử dụng được áp dụng rộng rãi khác. Ở lớp eBPF cho phép khả năng quan sát mạng toàn diện, chẳng hạn như khả năng hiển thị toàn bộ đường dẫn mạng bao gồm tất cả các bước nhảy, cùng với IP nguồn và đích. Với các chương trình eBPF, người ta có thể xử lý các sự kiện mạng khối lượng lớn và thao tác các gói mạng trực tiếp trong nhân với chi phí rất thấp.
Điều này cho phép các trường hợp sử dụng mạng khác nhau như cân bằng tải, ngăn chặn DDoS, Định hình lưu lượng và Chất lượng dịch vụ (QoS).
Bây giờ, rõ ràng eBPF có thể hữu ích như thế nào trong Khả năng quan sát.
Mọi thứ đều đi qua kernel. Và eBPF cung cấp một cách hiệu quả cao và an toàn để quan sát mọi thứ từ kernel.
Chúng ta hãy đi sâu hơn vào khả năng quan sát và xem xét ý nghĩa của công nghệ này.
Để khám phá điều này, hãy bước ra khỏi vũ trụ eBPF và bước vào vũ trụ Khả năng quan sát và xem điều gì tạo nên giải pháp khả năng quan sát tiêu chuẩn của chúng ta.
Bất kỳ giải pháp quan sát nào cũng có 4 thành phần chính -
Thu thập dữ liệu - Lấy dữ liệu từ xa từ các ứng dụng và cơ sở hạ tầng
Xử lý dữ liệu - Lọc, lập chỉ mục và thực hiện tính toán trên dữ liệu đã thu thập
Lưu trữ dữ liệu - Lưu trữ dữ liệu ngắn hạn và dài hạn
Lớp trải nghiệm người dùng - Xác định cách người dùng sử dụng dữ liệu
Trong số này, những gì eBPF tác động (tính đến ngày hôm nay), thực sự chỉ là lớp thu thập dữ liệu - việc thu thập dữ liệu từ xa dễ dàng trực tiếp từ hạt nhân bằng eBPF.
Vì vậy, ý của chúng tôi khi nói "khả năng quan sát của eBPF" ngày nay là sử dụng eBPF làm cơ chế thiết bị để thu thập dữ liệu đo từ xa, thay vì sử dụng các phương pháp thiết bị khác. Các thành phần khác của giải pháp quan sát vẫn không bị ảnh hưởng.
Để hiểu đầy đủ các cơ chế cơ bản đằng sau khả năng quan sát của eBPF, chúng ta cần hiểu khái niệm về hook.
Như chúng ta đã thấy trước đó, các chương trình eBPF chủ yếu hướng theo sự kiện - nghĩa là chúng được kích hoạt bất cứ khi nào một sự kiện cụ thể xảy ra. Ví dụ: mỗi khi thực hiện lệnh gọi hàm, chương trình eBPF có thể được gọi để thu thập một số dữ liệu cho mục đích quan sát.
Đầu tiên, các hook này có thể nằm trong kernel space hoặc user space. Vì vậy, eBPF có thể được sử dụng để giám sát cả ứng dụng không gian người dùng cũng như các sự kiện cấp nhân.
Thứ hai, các hook này có thể được xác định trước/tĩnh hoặc được chèn động vào một hệ thống đang chạy (không cần khởi động lại!)
Bốn cơ chế eBPF riêng biệt cho phép từng cơ chế này (xem hình bên dưới)
| Xác định trước/Thủ công | Năng động |
---|---|---|
hạt nhân | Điểm theo dõi hạt nhân | kprobes |
Không gian người dùng | USDT | tủ quần áo |
eBPF tĩnh và động móc vào không gian người dùng và không gian hạt nhân
Điểm theo dõi hạt nhân - được sử dụng để nối vào các sự kiện được xác định trước bởi các nhà phát triển hạt nhân (với TRACE_EVENT macro)
USDT - được sử dụng để móc vào các điểm theo dõi được xác định trước do nhà phát triển đặt trong mã ứng dụng
Kprobes (Kernel Probes) - được sử dụng để tự động móc vào bất kỳ phần nào của mã kernel khi chạy
Uprobes (Thăm dò người dùng) - được sử dụng để móc động vào bất kỳ phần nào của ứng dụng không gian người dùng khi chạy
Có một số hook được xác định trước trong không gian kernel mà người ta có thể dễ dàng đính kèm chương trình eBPF vào (ví dụ: lệnh gọi hệ thống, mục nhập/thoát chức năng, sự kiện mạng, điểm theo dõi kernel). Tương tự như vậy trong không gian người dùng, nhiều thời gian chạy ngôn ngữ, hệ thống cơ sở dữ liệu và ngăn xếp phần mềm hiển thị các móc nối được xác định trước cho các công cụ Linux BCC mà các chương trình eBPF có thể nối vào.
Nhưng điều thú vị hơn là kprobes và uprobes. Điều gì xảy ra nếu một cái gì đó bị hỏng trong quá trình sản xuất và tôi không có đủ thông tin và tôi muốn tự động thêm thiết bị vào thời gian chạy? Đó là nơi kprobes và uprobes cho phép khả năng quan sát mạnh mẽ.
Ví dụ: sử dụng uprobes, người ta có thể nối vào một chức năng cụ thể trong một ứng dụng mà không sửa đổi mã của ứng dụng, tại thời gian chạy . Bất cứ khi nào chức năng này được thực thi, một chương trình eBPF có thể được kích hoạt để thu thập dữ liệu cần thiết. Điều này cho phép các khả năng thú vị như gỡ lỗi trực tiếp .
Bây giờ chúng ta đã biết cách thức hoạt động của khả năng quan sát với eBPF, hãy xem xét các trường hợp sử dụng.
eBPF có thể được sử dụng cho hầu hết tất cả các trường hợp sử dụng khả năng quan sát phổ biến hiện có và ngoài ra còn mở ra các khả năng mới.
Giám sát hệ thống và cơ sở hạ tầng: eBPF cho phép giám sát sâu các sự kiện ở cấp hệ thống như mức sử dụng CPU, cấp phát bộ nhớ, I/O đĩa và lưu lượng mạng. Ví dụ: LinkedIn sử dụng eBPF để giám sát tất cả cơ sở hạ tầng của họ .
Giám sát vùng chứa và Kubernetes: Khả năng hiển thị các chỉ số dành riêng cho Kubernetes, mức sử dụng tài nguyên và tình trạng của các vùng chứa và nhóm riêng lẻ.
Giám sát hiệu suất ứng dụng (APM): Khả năng quan sát chi tiết vào các ứng dụng không gian người dùng và khả năng hiển thị thông lượng ứng dụng, tỷ lệ lỗi, độ trễ và dấu vết.
Khả năng quan sát tùy chỉnh: Khả năng hiển thị các chỉ số tùy chỉnh dành riêng cho ứng dụng hoặc cơ sở hạ tầng có thể không dễ dàng có được nếu không viết mã tùy chỉnh.
Khả năng quan sát nâng cao: eBPF có thể được sử dụng cho các trường hợp sử dụng khả năng quan sát nâng cao như gỡ lỗi trực tiếp , lập hồ sơ ứng dụng chi phí thấp và theo dõi cuộc gọi hệ thống .
Có những ứng dụng mới của eBPF trong Khả năng quan sát xuất hiện mỗi ngày.
Điều này có ý nghĩa gì đối với cách thức quan sát được thực hiện ngày nay? eBPF có khả năng thay thế các dạng thiết bị hiện có không? Hãy so sánh với các tùy chọn hiện có.
Ngày nay, có hai cách chính để thiết lập các ứng dụng và cơ sở hạ tầng cho Khả năng quan sát, ngoài eBPF.
Thiết bị dựa trên proxy Sidecar : Sidecar là các quy trình nhẹ, độc lập chạy cùng với một ứng dụng hoặc dịch vụ. Chúng phổ biến trong các kiến trúc dựa trên vùng chứa và vi dịch vụ như Kubernetes.
Để so sánh chi tiết cách thiết bị dựa trên eBPF so sánh với các tác nhân và xe phụ, hãy xem tại đây . Dưới đây là một cái nhìn tóm tắt -
| eBPF | đại lý | xe thùng |
---|---|---|---|
1. Mức độ hiển thị/Độ chi tiết của dữ liệu | Cao (nhưng một số khoảng cách) | Cao | Thấp |
2. Sự xâm nhập | Thấp (ngoài dải) | Cao (nội tuyến) | Cao (nội tuyến) |
3. Chi phí hoạt động | Thấp | Trung bình | Cao |
4. An toàn và An ninh | Cao | Trung bình | Trung bình |
5. Dễ thực hiện | Cao | Thấp | Trung bình |
6. Dễ bảo trì và cập nhật | Cao | Thấp | Trung bình |
7. Khả năng mở rộng | Cao | Trung bình | Thấp |
Như chúng ta có thể thấy, eBPF vượt trội so với các phương pháp đo lường hiện có trên hầu hết các thông số. Có một số lợi ích -
Có thể bao gồm mọi thứ trong một lần (cơ sở hạ tầng, ứng dụng)
Ít xâm phạm hơn - eBPF không trực tiếp chạy khối lượng công việc như tác nhân mã, chạy bất cứ khi nào khối lượng công việc chạy. Việc thu thập dữ liệu nằm ngoài băng tần và được đóng hộp cát, do đó không có tác động đến hệ thống đang chạy.
Chi phí hoạt động thấp - eBPF chạy dưới dạng mã máy gốc và không có chuyển ngữ cảnh.
An toàn hơn - nhờ các biện pháp bảo mật tích hợp như xác minh.
Dễ cài đặt - có thể bỏ vào mà không cần thay đổi mã hoặc khởi động lại.
Dễ bảo trì và cập nhật - một lần nữa không cần thay đổi mã và khởi động lại.
Khả năng mở rộng hơn - được thúc đẩy bởi việc triển khai và bảo trì dễ dàng cũng như chi phí hoạt động thấp
Về nhược điểm, lỗ hổng chính với khả năng quan sát của eBPF ngày nay là theo dõi phân tán ( khả thi , nhưng trường hợp sử dụng vẫn còn ở giai đoạn đầu).
Cân bằng lại, với những lợi thế đáng kể mà eBPF mang lại so với các phương pháp thiết bị hiện có, chúng ta có thể kỳ vọng một cách hợp lý rằng eBPF sẽ xuất hiện dưới dạng nền tảng thiết bị thế hệ tiếp theo mặc định.
Điều này có ý nghĩa gì đối với ngành công nghiệp quan sát? Các thay đổi?
Hãy tưởng tượng một giải pháp quan sát:
mà bạn có thể thả vào kernel trong 5 phút
không thay đổi mã hoặc khởi động lại
bao gồm mọi thứ trong một lần - cơ sở hạ tầng, ứng dụng, mọi thứ
có chi phí gần như bằng không
rất an toàn
Đó là những gì eBPF có thể làm được. Và đó là lý do tại sao có rất nhiều hứng thú xung quanh công nghệ này.
Chúng ta có thể mong đợi tất cả các giải pháp quan sát thế hệ tiếp theo đều được trang bị eBPF thay vì các tác nhân mã.
Những người chơi truyền thống như Datadog và NewRelic đã đầu tư vào việc xây dựng công cụ dựa trên eBPF để tăng danh mục đại lý dựa trên mã của họ. Trong khi đó, có một số nhà cung cấp thế hệ tiếp theo được xây dựng trên eBPF, giải quyết cả các trường hợp sử dụng thích hợp và khả năng quan sát phức tạp .
Trong khi những người chơi truyền thống phải xây dựng ngôn ngữ tác nhân mã riêng lẻ theo ngôn ngữ và cho từng thành phần cơ sở hạ tầng trong vài năm, thì những người chơi mới có thể đạt được mức độ phù hợp tương tự trong vài tháng với eBPF. Điều này cũng cho phép họ tập trung vào đổi mới cao hơn trong chuỗi giá trị như xử lý dữ liệu, trải nghiệm người dùng và thậm chí cả AI . Ngoài ra, các lớp trải nghiệm người dùng và xử lý dữ liệu của họ cũng được xây dựng từ đầu để hỗ trợ các trường hợp sử dụng, khối lượng và tần suất mới.
Tất cả điều này sẽ thúc đẩy một lượng lớn đổi mới trong lĩnh vực này và làm cho khả năng quan sát trở nên liền mạch, an toàn và dễ thực hiện hơn trong những năm tới.
Đầu tiên, nếu bạn đang ở trong môi trường dựa trên đám mây hiện đại (Kubernetes, microservices), thì sự khác biệt giữa các phương pháp tiếp cận dựa trên eBPF và dựa trên tác nhân là dễ thấy nhất (chi phí hoạt động, bảo mật, dễ cài đặt, v.v.).
Thứ hai, nếu bạn đang hoạt động ở quy mô lớn, thì các tác nhân hạng nhẹ dựa trên eBPF sẽ thúc đẩy những cải tiến đáng kể so với hiện trạng. Đây có thể là một trong những lý do tại sao việc áp dụng eBPF lại cao nhất ở các công ty công nghệ có dấu ấn lớn như LinkedIn, Netflix và Meta.
Thứ ba, nếu bạn thiếu công nghệ. dung lượng và đang tìm kiếm một giải pháp quan sát gần như không cần nỗ lực cài đặt và bảo trì, thì hãy tìm ngay giải pháp dựa trên eBPF.
Tóm lại, bằng cách cung cấp một cơ chế thiết bị tốt hơn đáng kể, eBPF có khả năng định hình lại cơ bản cách tiếp cận của chúng tôi đối với khả năng quan sát trong những năm tới.
Mặc dù trong bài viết này, chúng tôi chủ yếu khám phá ứng dụng của eBPF trong việc thu thập/thiết bị đo đạc dữ liệu, nhưng các ứng dụng trong tương lai có thể thấy eBPF được sử dụng trong các lớp xử lý dữ liệu hoặc thậm chí lưu trữ dữ liệu. Các khả năng rất rộng và chưa được khám phá.
Cũng được xuất bản ở đây.