6.3. eBPF manager Operator
6.3.1. 关于 eBPF Manager Operator
eBPF Manager Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
6.3.1.1. 关于扩展 Berkeley Packet Filter (eBPF)
eBPF 扩展原始 Berkeley Packet 过滤器,用于高级网络流量过滤。它充当 Linux 内核中的虚拟机,允许您运行沙盒程序来响应网络数据包、系统调用或内核功能等事件。
6.3.1.2. 关于 eBPF Manager Operator
eBPF Manager 简化了 Kubernetes 中的 eBPF 程序的管理和部署,以及增强使用 eBPF 程序的安全性。它利用 Kubernetes 自定义资源定义 (CRD) 来管理打包为 OCI 容器镜像的 eBPF 程序。这种方法有助于通过限制特定用户可部署的程序类型来划分部署权限并增强安全性。
eBPF Manager 是一个软件堆栈,用于在 Kubernetes 中管理 eBPF 程序。它有助于在 Kubernetes 集群中对 eBPF 程序进行加载、卸载、修改和监控。它包括守护进程、CRD、代理和 Operator:
- bpfman
- 通过 gRPC API 管理 eBPF 程序的系统守护进程。
- eBPF CRD
- 一组 CRD,如 XdpProgram 和 TcProgram 用于加载 eBPF 程序,以及一个代表载入程序状态的由 bpfman 生成的 CRD (BpfProgram)。
- bpfman-agent
- 在 daemonset 容器中运行,确保每个节点上的 eBPF 程序处于所需的状态。
- bpfman-operator
- 使用 Operator SDK 管理集群中的 bpfman-agent 和 CRD 的生命周期。
eBPF Manager Operator 提供以下功能:
- 通过一个控制的守护进程来集中 eBPF 程序加载功能以增强安全性。eBPF Manager 具有升级的特权,因此应用程序不需要这些权限。 eBPF 程序控制遵循标准的 Kubernetes 基于角色的访问控制 (RBAC)机制,它可以允许或拒绝应用程序对用于管理 eBPF 程序加载和卸载的不同 eBPF Manager CRD 的访问。
- 提供对活跃 eBPF 程序的详细可见性,提高了您在系统中调试问题的能力。
- 可以使来自不同源的多个 eBPF 程序共存,使用 libxdp 等协议用于 XDP 和 TC 程序,从而增强了互操作性。
- 简化 Kubernetes 中 eBPF 程序的部署和生命周期管理。开发人员可以专注于程序交互,而不是生命周期管理,支持现有 eBPF 库,如 Cilium、libbpf 和 Aya。
6.3.1.3. 其他资源
6.3.1.4. 后续步骤
6.3.2. 安装 eBPF Manager Operator
作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 eBPF Manager Operator。
eBPF Manager Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
6.3.2.1. 使用 CLI 安装 eBPF Manager Operator
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 有管理员特权的帐户。
流程
运行以下命令来创建
bpfman
命名空间:$ cat << EOF| oc create -f - apiVersion: v1 kind: Namespace metadata: labels: pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/enforce-version: v1.24 name: bpfman EOF
运行以下命令来创建
OperatorGroup
CR:$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: bpfman-operators namespace: bpfman EOF
订阅 eBPF Manager Operator。
要为 eBPF Manager Operator 创建
Subscription
CR,请输入以下命令:$ cat << EOF| oc create -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: bpfman-operator namespace: bpfman spec: name: bpfman-operator channel: alpha source: community-operators sourceNamespace: openshift-marketplace EOF
要验证是否已安装 Operator,请输入以下命令:
$ oc get ip -n bpfman
输出示例
NAME CSV APPROVAL APPROVED install-ppjxl security-profiles-operator.v0.8.5 Automatic true
要验证 Operator 的版本,请输入以下命令:
$ oc get csv -n bpfman
输出示例
NAME DISPLAY VERSION REPLACES PHASE bpfman-operator.v0.5.0 eBPF Manager Operator 0.5.0 bpfman-operator.v0.4.2 Succeeded
6.3.2.2. 使用 Web 控制台安装 eBPF Manager Operator
作为集群管理员,您可以使用 Web 控制台安装 eBPF Manager Operator。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 有管理员特权的帐户。
流程
安装 eBPF Manager Operator:
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
OperatorHub。 - 从可用的 Operator 列表中选择 eBPF Manager Operator,如果提示输入 Show community Operator,请点 Continue。
- 点 Install。
- 在 Install Operator 页面中,在 Installed Namespace 下选择 Operator recommended Namespace。
- 点 Install。
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
验证 eBPF Manager Operator 是否已成功安装:
-
导航到 Operators
Installed Operators 页面。 确保 openshift-ingress-node-firewall 项目中列出的 eBPF Manager Operator 的 Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有 InstallSucceeded 状态,请按照以下步骤进行故障排除:
- 检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入到 Workloads
Pods 页面,在 bpfman
项目中检查 pod 的日志。
-
导航到 Operators
6.3.2.3. 后续步骤
6.3.3. 部署 eBPF 程序
作为集群管理员,您可以使用 eBPF Manager Operator 部署容器化 eBPF 应用程序。
对于此流程中部署的 eBPF 程序示例,示例清单执行以下操作:
首先,它创建基本的 Kubernetes 对象,如 Namespace
、ServiceAccount
和 ClusterRoleBinding
。它还创建一个 XdpProgram
对象,它是 eBPF Manager 提供的自定义资源定义(CRD) 来加载 eBPF XDP 程序。每种程序类型都有自己的 CRD,但它们的作用类似。如需更多信息,请参阅在 Kubernetes 上加载 eBPF 程序。
其次,它会创建一个守护进程集,运行一个用户空间程序,该程序读取 eBPF 程序生成的 eBPF 映射信息。此 eBPF 映射是使用 Container Storage Interface (CSI) 驱动程序挂载的卷。通过在容器中挂载 eBPF 映射来实现在主机上访问它的效果,应用程序 pod 可以在没有特权的情况下访问 eBPF 映射。有关如何配置 CSI 的更多信息,请参阅在 Kubernetes 上部署 eBPF 的应用程序。
eBPF Manager Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
6.3.3.1. 部署容器化的 eBPF 程序
作为集群管理员,您可以将 eBPF 程序部署到集群中的节点。在此过程中,在 go-xdp-counter
命名空间中安装了一个容器化的 eBPF 程序示例。
先决条件
-
已安装 OpenShift CLI(
oc
)。 - 有管理员特权的帐户。
- 已安装 eBPF Manager Operator。
流程
要下载清单,请输入以下命令:
$ curl -L https://github.com/bpfman/bpfman/releases/download/v0.5.1/go-xdp-counter-install-selinux.yaml -o go-xdp-counter-install-selinux.yaml
要部署示例 eBPF 应用程序,请输入以下命令:
$ oc create -f go-xdp-counter-install-selinux.yaml
输出示例
namespace/go-xdp-counter created serviceaccount/bpfman-app-go-xdp-counter created clusterrolebinding.rbac.authorization.k8s.io/xdp-binding created daemonset.apps/go-xdp-counter-ds created xdpprogram.bpfman.io/go-xdp-counter-example created selinuxprofile.security-profiles-operator.x-k8s.io/bpfman-secure created
要确认 eBPF 示例应用程序已被成功部署,请输入以下命令:
$ oc get all -o wide -n go-xdp-counter
输出示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/go-xdp-counter-ds-4m9cw 1/1 Running 0 44s 10.129.0.92 ci-ln-dcbq7d2-72292-ztrkp-master-1 <none> <none> pod/go-xdp-counter-ds-7hzww 1/1 Running 0 44s 10.130.0.86 ci-ln-dcbq7d2-72292-ztrkp-master-2 <none> <none> pod/go-xdp-counter-ds-qm9zx 1/1 Running 0 44s 10.128.0.101 ci-ln-dcbq7d2-72292-ztrkp-master-0 <none> <none> NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR daemonset.apps/go-xdp-counter-ds 3 3 3 3 3 <none> 44s go-xdp-counter quay.io/bpfman-userspace/go-xdp-counter:v0.5.0 name=go-xdp-counter
要确认示例 XDP 程序正在运行,请输入以下命令:
$ oc get xdpprogram go-xdp-counter-example
输出示例
NAME BPFFUNCTIONNAME NODESELECTOR STATUS go-xdp-counter-example xdp_stats {} ReconcileSuccess
要确认 XDP 程序正在收集数据,请输入以下命令:
$ oc logs <pod_name> -n go-xdp-counter
将
<pod_name>
替换为 XDP 程序 pod 的名称,如go-xdp-counter-ds-4m9cw
。输出示例
2024/08/13 15:20:06 15016 packets received 2024/08/13 15:20:06 93581579 bytes received 2024/08/13 15:20:09 19284 packets received 2024/08/13 15:20:09 99638680 bytes received 2024/08/13 15:20:12 23522 packets received 2024/08/13 15:20:12 105666062 bytes received 2024/08/13 15:20:15 27276 packets received 2024/08/13 15:20:15 112028608 bytes received 2024/08/13 15:20:18 29470 packets received 2024/08/13 15:20:18 112732299 bytes received 2024/08/13 15:20:21 32588 packets received 2024/08/13 15:20:21 113813781 bytes received