使用BPF監視你的Kubernetes叢集

banq發表於2018-12-12

如果你已經使用Kubernetes已經有一段時間了,你就會知道你能做的最好的事情就是邀請成千上萬的你最好的熟人在沒有成人監督的情況下在你的叢集上執行任意命令。在將來的某個時刻,您可能想知道您曾經知道的那些人仍然在您的群集上做什麼。是不是在挖礦呢?

BPF(Berkeley Packet Filter)是Linux核心中的一個虛擬機器,它在收到其中一個事件時對事件進行分類並觸發操作。它允許您在執行時將程式碼注入核心以處理這些事件; 不需要核心編譯。BPF有兩種風格。本文引用的是擴充套件版本eBPF,但我只稱它為BPF。

另一個更有趣的選擇是使用Kubectl Trace來檢查容器中正在執行的內容。Kubectl的這個擴充套件計劃一次性作業在容器內執行BPF程式。因此,您可以使用一行命令列出在任何容器中執行的所有程式:

kubectl trace run container -e \ "tracepoint:syscalls:sys_enter_execve { @[comm] = count() }"


此命令將等待容器執行新程式,並將按其命令名稱(comm)對正在執行的許多程式進行分組。問題是當你想知道那裡發生了什麼時,你需要執行這個命令; 它不允許您監視群集使用情況,而無需一直檢視它。

我最喜歡的選擇是將BPF的Execsnoop部署到每個pod中的sidecar容器,並讓它實時登入pod中執行的所有程式。Kubernetes 1.13有一個名為的配置標誌shareProcessNamespace,允許您將在pod中生成的所有程式放入同一名稱空間,這樣您就可以從邊車監視pod中的所有容器。這是您的pod定義的開始:

apiVersion: v1
kind: Pod
metadata:
  name: happy-borg
spec:
  shareProcessNamespace: true
  containers:
  - name: execsnoop
    image: calavera/execsnoop
    securityContext:
    - privileged: true
    volumeMounts:
    - name: sys # mount the debug filesystem
      mountPath: /sys
      readOnly: true
    - name: headers # mount the kernel headers required by bcc
      mountPath: /usr/src
      readOnly: true
    - name: modules # mount the kernel modules required by bcc
      mountPath: /lib/modules
      readOnly: true
  - name: container doing random work
  ...


BPF為Kubernetes開啟了更好的可觀察性的大門。

相關文章