专用硬件和驱动程序启用
了解 OpenShift Container Platform 中的硬件启用
摘要
第 1 章 关于专用硬件和驱动程序启用
许多应用程序需要依赖于内核模块或驱动程序的专用硬件或软件。您可以使用驱动程序容器在 Red Hat Enterprise Linux CoreOS (RHCOS) 节点上载入树外内核模块。要在集群安装过程中部署树外驱动程序,请使用 kmods-via-containers
框架。为了在现有 OpenShift Container Platform 集群中载入驱动程序或内核模块,OpenShift Container Platform 提供了几个工具:
- Driver Toolkit 是一个容器镜像,是每个 OpenShift Container Platform 版本的一部分。它包含构建驱动程序或内核模块所需的内核软件包和其他常见依赖项。Driver Toolkit 可用作 OpenShift Container Platform 上构建的驱动程序容器镜像的基础镜像。
- 特殊资源 Operator (SRO) 编配驱动程序容器的构建和管理,以便在现有 OpenShift 或 Kubernetes 集群上加载内核模块和驱动程序。
- Node Feature Discovery (NFD) Operator 为 CPU 功能、内核版本、PCIe 设备供应商 ID 等添加节点标签。
第 2 章 驱动程序工具包
了解驱动程序工具包以及如何将其用作驱动程序容器的基础镜像,以便在 Kubernetes 上启用特殊软件和硬件设备。
Driver Toolkit 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
2.1. 关于驱动程序工具包
背景信息
Driver Toolkit 是 OpenShift Container Platform 有效负载中的一个容器镜像,用作可构建驱动程序容器的基础镜像。Driver Toolkit 镜像包含通常作为构建或安装内核模块的依赖项所需的内核软件包,以及驱动程序容器所需的一些工具。这些软件包的版本将与相应 OpenShift Container Platform 发行版本中的 Red Hat Enterprise Linux CoreOS(RHCOS)节点上运行的内核版本匹配。
驱动程序容器是容器镜像,用于在容器操作系统(如 RHCOS)上构建和部署树外内核模块和驱动程序。内核模块和驱动程序是在操作系统内核中具有高级别权限运行的软件库。它们扩展了内核功能,或者提供控制新设备所需的硬件特定代码。示例包括 Field Programmable Gate Arrays(FPGA)或 GPU 等硬件设备,以及软件定义型存储(SDS)解决方案(如 Lustre parallel 文件系统,它在客户端机器上需要内核模块)。驱动程序容器是用于在 Kubernetes 上启用这些技术的软件堆栈的第一层。
Driver Toolkit 中的内核软件包列表包括以下内容及其依赖项:
-
kernel-core
-
kernel-devel
-
kernel-headers
-
kernel-modules
-
kernel-modules-extra
另外,Driver Toolkit 还包含相应的实时内核软件包:
-
kernel-rt-core
-
kernel-rt-devel
-
kernel-rt-modules
-
kernel-rt-modules-extra
Driver Toolkit 还有几个通常需要的工具来构建和安装内核模块,其中包括:
-
elfutils-libelf-devel
-
kmod
-
binutilskabi-dw
-
kernel-abi-whitelists
- 以上的依赖项
用途
在出现 Driver Toolkit 之前,您可以在 OpenShift Container Platform 中的一个 pod 中安装内核软件包,或在构建配置中使用 entitled builds,或从主机 machine-os-content
的内核 RPM 进行安装。Driver Toolkit 通过删除授权步骤简化了流程,并避免了访问 pod 中的 machine-os-content 特权操作。Driver Toolkit 也可以由有权访问预发布的 OpenShift Container Platform 版本的合作伙伴使用,用于未来的 OpenShift Container Platform 版本的硬件设备的预构建 driver-containers。
特殊资源 Operator(SRO)也使用 Driver Toolkit,目前作为 OperatorHub 上的社区 Operator 提供。SRO 支持树外和第三方内核驱动程序以及底层操作系统的支持软件。用户可以为 SRO 创建配方(recipes)来构建和部署驱动程序容器,以及支持诸如设备插件或指标的软件。配方可以包含构建配置,以基于 Driver Toolkit 构建驱动程序容器,或者 SRO 可以部署预构建驱动程序容器。
2.2. 拉取 Driver Toolkit 容器镜像
driver-toolkit
镜像包括在 Red Hat Ecosystem Catalog 的容器镜像部分和 OpenShift Container Platform 发行版本有效负载中。与 OpenShift Container Platform 最新次要版本对应的镜像将标记为目录中的版本号。具体版本的镜像 URL 可使用 oc adm
CLI 命令找到。
2.2.1. 从 registry.redhat.io 中拉取 Driver Toolkit 容器镜像
Red Hat Ecosystem Catalog 包括了使用 podman 或 OpenShift Container Platform 从 registry.redhat.io
中拉取 driver-toolkit
镜像的说明。最新次版本的 driver-toolkit 镜像将标记为 registry.redhat.io 中的次版本,如 registry.redhat.io/openshift4/driver-toolkit-rhel8:v4.11
。
2.2.2. 在有效负载中查找驱动程序工具包镜像 URL
先决条件
- 您已从 Red Hat OpenShift Cluster Manager 获取了镜像 pull secret。
-
已安装 OpenShift CLI(
oc
)。
流程
可以使用
oc adm
命令从发行镜像中提取与特定发行版本对应的driver-toolkit
镜像 URL:对于 x86 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:{product-version}.z-x86_64 --image-for=driver-toolkit
对于 ARM 镜像,命令如下:
$ oc adm release info quay.io/openshift-release-dev/ocp-release:{product-version}.z-aarch64 --image-for=driver-toolkit
输出示例
ocp-release:4.11.0-x86_64
镜像的输出如下:quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:514e256367e8707e2c30f18a4f06fbd6c821ab9776602d2488e861f577a357d0
可以使用有效的 pull secret 拉取此镜像,如安装 OpenShift Container Platform 所需的 pull secret。
$ podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>
ARM 镜像仅用于 64 位 Arm (AArch64),目前还是一个技术预览功能。如需有关 ARM 上的 OpenShift Container Platform 的更多信息,请参阅 发行注记。有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
2.3. 使用 Driver Toolkit
例如,Driver Toolkit 可用作基础镜像来构建非常简单的内核模块,名为 simple-kmod。
Driver Toolkit 包含为内核模块签名所需的依赖项、openssl
、mokutil
和 keyutils
。但是,在这个示例中,simple-kmod 内核模块没有签名,因此无法在启用了安全引导(Secure Boot)
的系统中载入。
2.3.1. 在集群中构建并运行 simple-kmod 驱动程序容器
先决条件
- 有一个正在运行的 OpenShift Container Platform 集群。
-
您可以将集群的 Image Registry Operator 状态设置为
Managed
。 -
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录 OpenShift CLI。
流程
创建命名空间。例如:
$ oc new-project simple-kmod-demo
YAML 定义了
ImageStream
,用于存储simple-kmod
驱动程序容器镜像,以及用于构建容器的BuildConfig
。将此 YAML 保存为0000-buildconfig.yaml.template
。apiVersion: image.openshift.io/v1 kind: ImageStream metadata: labels: app: simple-kmod-driver-container name: simple-kmod-driver-container namespace: simple-kmod-demo spec: {} --- apiVersion: build.openshift.io/v1 kind: BuildConfig metadata: labels: app: simple-kmod-driver-build name: simple-kmod-driver-build namespace: simple-kmod-demo spec: nodeSelector: node-role.kubernetes.io/worker: "" runPolicy: "Serial" triggers: - type: "ConfigChange" - type: "ImageChange" source: git: ref: "master" uri: "https://github.com/openshift-psap/kvc-simple-kmod.git" type: Git dockerfile: | FROM DRIVER_TOOLKIT_IMAGE WORKDIR /build/ # Expecting kmod software version as an input to the build ARG KMODVER # Grab the software from upstream RUN git clone https://github.com/openshift-psap/simple-kmod.git WORKDIR simple-kmod # Build and install the module RUN make all KVER=$(rpm -q --qf "%{VERSION}-%{RELEASE}.%{ARCH}" kernel-core) KMODVER=${KMODVER} \ && make install KVER=$(rpm -q --qf "%{VERSION}-%{RELEASE}.%{ARCH}" kernel-core) KMODVER=${KMODVER} # Add the helper tools WORKDIR /root/kvc-simple-kmod ADD Makefile . ADD simple-kmod-lib.sh . ADD simple-kmod-wrapper.sh . ADD simple-kmod.conf . RUN mkdir -p /usr/lib/kvc/ \ && mkdir -p /etc/kvc/ \ && make install RUN systemctl enable kmods-via-containers@simple-kmod strategy: dockerStrategy: buildArgs: - name: KMODVER value: DEMO output: to: kind: ImageStreamTag name: simple-kmod-driver-container:demo
在以下命令中,使用您运行的 OpenShift Container Platform 版本的相关的正确 driver toolki 镜像替换 "DRIVER_TOOLKIT_IMAGE" 部分。
$ OCP_VERSION=$(oc get clusterversion/version -ojsonpath={.status.desired.version})
$ DRIVER_TOOLKIT_IMAGE=$(oc adm release info $OCP_VERSION --image-for=driver-toolkit)
$ sed "s#DRIVER_TOOLKIT_IMAGE#${DRIVER_TOOLKIT_IMAGE}#" 0000-buildconfig.yaml.template > 0000-buildconfig.yaml
使用创建镜像流和构建配置
$ oc create -f 0000-buildconfig.yaml
构建器 Pod 成功完成后,将驱动程序容器镜像部署为
DaemonSet
。驱动程序容器必须使用特权安全上下文运行,才能在主机上加载内核模块。以下 YAML 文件包含用于运行驱动程序容器的 RBAC 规则和
DaemonSet
。将此 YAML 保存为1000-drivercontainer.yaml
。apiVersion: v1 kind: ServiceAccount metadata: name: simple-kmod-driver-container --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: simple-kmod-driver-container rules: - apiGroups: - security.openshift.io resources: - securitycontextconstraints verbs: - use resourceNames: - privileged --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: simple-kmod-driver-container roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: simple-kmod-driver-container subjects: - kind: ServiceAccount name: simple-kmod-driver-container userNames: - system:serviceaccount:simple-kmod-demo:simple-kmod-driver-container --- apiVersion: apps/v1 kind: DaemonSet metadata: name: simple-kmod-driver-container spec: selector: matchLabels: app: simple-kmod-driver-container template: metadata: labels: app: simple-kmod-driver-container spec: serviceAccount: simple-kmod-driver-container serviceAccountName: simple-kmod-driver-container containers: - image: image-registry.openshift-image-registry.svc:5000/simple-kmod-demo/simple-kmod-driver-container:demo name: simple-kmod-driver-container imagePullPolicy: Always command: ["/sbin/init"] lifecycle: preStop: exec: command: ["/bin/sh", "-c", "systemctl stop kmods-via-containers@simple-kmod"] securityContext: privileged: true nodeSelector: node-role.kubernetes.io/worker: ""
创建 RBAC 规则和守护进程集:
$ oc create -f 1000-drivercontainer.yaml
当 pod 在 worker 节点上运行后,使用
lsmod
验证在主机机器上是否成功载入了simple_kmod
内核模块。验证 pod 是否正在运行:
$ oc get pod -n simple-kmod-demo
输出示例
NAME READY STATUS RESTARTS AGE simple-kmod-driver-build-1-build 0/1 Completed 0 6m simple-kmod-driver-container-b22fd 1/1 Running 0 40s simple-kmod-driver-container-jz9vn 1/1 Running 0 40s simple-kmod-driver-container-p45cc 1/1 Running 0 40s
在驱动程序容器 pod 中执行
lsmod
命令:$ oc exec -it pod/simple-kmod-driver-container-p45cc -- lsmod | grep simple
输出示例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
2.4. 其他资源
- 有关为集群配置 registry 存储的更多信息,请参阅 OpenShift Container Platform 中的 Image Registry Operator。
第 3 章 特殊资源 Operator
了解特殊资源 Operator (SRO) 以及如何使用它来构建和管理驱动程序容器,以便将内核模块和设备驱动程序加载到 OpenShift Container Platform 集群的节点上。
特殊资源 Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
3.1. 关于特殊资源 Operator
特殊资源 Operator (SRO) 可帮助您管理现有 OpenShift Container Platform 集群上的内核模块和驱动程序的部署。SRO 可用于像构建和加载单个内核模块那样简单的情况,或者像为硬件加速器部署驱动程序、设备插件和监控堆栈复杂。
对于载入内核模块,SRO 围绕使用驱动程序容器设计。云原生环境(特别是在纯容器操作系统上运行)中越来越多地使用驱动程序容器向主机提供硬件驱动程序。驱动程序容器将内核堆栈扩展至特定内核的现成软件和硬件功能之外。驱动程序容器在各种支持容器的 Linux 发行版上工作。对于驱动程序容器,主机操作系统保持干净,主机上不同库版本或二进制文件之间没有冲突。
描述的功能需要有恒定连接网络连接的环境。这些功能不适用于断开连接的环境。
3.2. 安装特殊资源 Operator
作为集群管理员,您可以使用 OpenShift CLI 或 Web 控制台安装特殊 资源 Operator(SRO)。
3.2.1. 使用 CLI 安装特殊资源 Operator
作为集群管理员,您可以使用 OpenShift CLI 安装特殊资源 Operator (SRO)。
先决条件
- 有一个正在运行的 OpenShift Container Platform 集群。
-
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录 OpenShift CLI。
流程
在
openshift-operators
命名空间中安装 SRO:创建以下
Subscription
CR,并将 YAML 保存到sro-sub.yaml
文件中:Subscription CR 示例
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-special-resource-operator namespace: openshift-operators spec: channel: "stable" installPlanApproval: Automatic name: openshift-special-resource-operator source: redhat-operators sourceNamespace: openshift-marketplace
运行以下命令来创建订阅对象:
$ oc create -f sro-sub.yaml
切换到
openshift-operators
项目:$ oc project openshift-operators
验证
要验证 Operator 部署是否成功,请运行:
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f4c5f5778-4lvvk 2/2 Running 0 89s special-resource-controller-manager-6dbf7d4f6f-9kl8h 2/2 Running 0 81s
一个成功的部署会显示
Running
状态。
3.2.2. 使用 Web 控制台安装特殊资源 Operator
作为集群管理员,您可以使用 OpenShift Container Platform Web 控制台安装特殊 Resource Operator (SRO)。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
安装特殊资源 Operator:
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 Special Resource Operator,然后单击 Install。
- 在 Install Operator 页面中,选择集群上的一个特定命名空间,选择上一节中创建的命名空间,然后点 Install。
验证
验证特殊 Resource Operator 是否已成功安装:
- 进入到 Operators → Installed Operators 页面。
确保 openshift-operators 项目中列出的 Special Resource Operator 的 Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
- 导航到 Operators → Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入到 Workloads → Pods 页面,检查
openshift-operators
项目中的 pod 的日志。
3.3. 使用特殊资源 Operator
特殊资源 Operator (SRO) 用于管理驱动程序容器的构建和部署。构建和部署容器所需的对象可以在 Helm Chart 中定义。
本节中的示例使用 simple-kmod SpecialResource
对象来指向所创建的 ConfigMap
对象来存储 Helm chart。
3.3.1. 使用配置映射构建并运行 simple-kmod SpecialResource
在这个示例中,simple-kmod 内核模块显示特殊资源 Operator(SRO)如何管理驱动程序容器。容器在存储在配置映射中的 Helm Chart 模板中定义。
先决条件
- 有一个正在运行的 OpenShift Container Platform 集群。
-
您可以将集群的 Image Registry Operator 状态设置为
Managed
。 -
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录 OpenShift CLI。 - 已安装 Node Feature Discovery (NFD) Operator。
- 已安装 SRO。
-
已安装 Helm CLI (
helm
)。
流程
要创建 simple-kmod
SpecialResource
对象,请定义用于构建镜像的镜像流和构建配置,以及用于运行容器的服务帐户、角色、角色绑定和守护进程集。需要服务帐户、角色和角色绑定来运行具有特权安全上下文的守护进程集,以便加载内核模块。创建
templates
目录,并更改到此目录:$ mkdir -p chart/simple-kmod-0.0.1/templates
$ cd chart/simple-kmod-0.0.1/templates
将镜像流和构建配置的 YAML 模板保存到
templates
目录中的0000-buildconfig.yaml
中:apiVersion: image.openshift.io/v1 kind: ImageStream metadata: labels: app: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} 1 name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} 2 spec: {} --- apiVersion: build.openshift.io/v1 kind: BuildConfig metadata: labels: app: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverBuild}} 3 name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverBuild}} 4 annotations: specialresource.openshift.io/wait: "true" specialresource.openshift.io/driver-container-vendor: simple-kmod specialresource.openshift.io/kernel-affine: "true" spec: nodeSelector: node-role.kubernetes.io/worker: "" runPolicy: "Serial" triggers: - type: "ConfigChange" - type: "ImageChange" source: git: ref: {{.Values.specialresource.spec.driverContainer.source.git.ref}} uri: {{.Values.specialresource.spec.driverContainer.source.git.uri}} type: Git strategy: dockerStrategy: dockerfilePath: Dockerfile.SRO buildArgs: - name: "IMAGE" value: {{ .Values.driverToolkitImage }} {{- range $arg := .Values.buildArgs }} - name: {{ $arg.name }} value: {{ $arg.value }} {{- end }} - name: KVER value: {{ .Values.kernelFullVersion }} output: to: kind: ImageStreamTag name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}}:v{{.Values.kernelFullVersion}} 5
将
templates
目录中的 RBAC 资源和守护进程设置的以下 YAML 模板保存为1000-driver-container.yaml
:apiVersion: v1 kind: ServiceAccount metadata: name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} rules: - apiGroups: - security.openshift.io resources: - securitycontextconstraints verbs: - use resourceNames: - privileged --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} subjects: - kind: ServiceAccount name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} namespace: {{.Values.specialresource.spec.namespace}} --- apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} annotations: specialresource.openshift.io/wait: "true" specialresource.openshift.io/state: "driver-container" specialresource.openshift.io/driver-container-vendor: simple-kmod specialresource.openshift.io/kernel-affine: "true" specialresource.openshift.io/from-configmap: "true" spec: updateStrategy: type: OnDelete selector: matchLabels: app: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} template: metadata: labels: app: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} spec: priorityClassName: system-node-critical serviceAccount: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} serviceAccountName: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} containers: - image: image-registry.openshift-image-registry.svc:5000/{{.Values.specialresource.spec.namespace}}/{{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}}:v{{.Values.kernelFullVersion}} name: {{.Values.specialresource.metadata.name}}-{{.Values.groupName.driverContainer}} imagePullPolicy: Always command: ["/sbin/init"] lifecycle: preStop: exec: command: ["/bin/sh", "-c", "systemctl stop kmods-via-containers@{{.Values.specialresource.metadata.name}}"] securityContext: privileged: true nodeSelector: node-role.kubernetes.io/worker: "" feature.node.kubernetes.io/kernel-version.full: "{{.Values.KernelFullVersion}}"
进入
chart/simple-kmod-0.0.1
目录:$ cd ..
在
chart/simple-kmod-0.0.1
目录中,将 Chart 的以下 YAML 保存为Chart.yaml
:apiVersion: v2 name: simple-kmod description: Simple kmod will deploy a simple kmod driver-container icon: https://avatars.githubusercontent.com/u/55542927 type: application version: 0.0.1 appVersion: 1.0.0
在
Chart
目录中,使用helm package
命令创建 chart:$ helm package simple-kmod-0.0.1/
输出示例
Successfully packaged chart and saved it to: /data/<username>/git/<github_username>/special-resource-operator/yaml-for-docs/chart/simple-kmod-0.0.1/simple-kmod-0.0.1.tgz
创建配置映射以存储 chart 文件:
为配置映射文件创建目录:
$ mkdir cm
将 Helm Chart 复制到
cm
目录中:$ cp simple-kmod-0.0.1.tgz cm/simple-kmod-0.0.1.tgz
创建一个索引文件,指定包含 Helm Chart 的 Helm 仓库:
$ helm repo index cm --url=cm://simple-kmod/simple-kmod-chart
为 Helm Chart 中定义的对象创建一个命名空间:
$ oc create namespace simple-kmod
创建配置映射对象:
$ oc create cm simple-kmod-chart --from-file=cm/index.yaml --from-file=cm/simple-kmod-0.0.1.tgz -n simple-kmod
使用以下
SpecialResource
清单,使用您在配置映射中创建的 Helm Chart 部署 simple-kmod 对象。将此 YAML 保存为simple-kmod-configmap.yaml
:apiVersion: sro.openshift.io/v1beta1 kind: SpecialResource metadata: name: simple-kmod spec: #debug: true 1 namespace: simple-kmod chart: name: simple-kmod version: 0.0.1 repository: name: example url: cm://simple-kmod/simple-kmod-chart 2 set: kind: Values apiVersion: sro.openshift.io/v1beta1 kmodNames: ["simple-kmod", "simple-procfs-kmod"] buildArgs: - name: "KMODVER" value: "SRO" driverContainer: source: git: ref: "master" uri: "https://github.com/openshift-psap/kvc-simple-kmod.git"
在命令行中创建
SpecialResource
文件:$ oc create -f simple-kmod-configmap.yaml
如果要从节点中删除 simple-kmod 内核模块,请使用 oc delete
命令删除 simple-kmod SpecialResource
API 对象。删除驱动程序容器 pod 时,内核模块会被卸载。
验证
simple-kmod
资源部署在 simple-kmod
命名空间中,如对象清单中指定的。片刻之后,simple-kmod
驱动程序容器的构建 pod 开始运行。构建在几分钟后完成,然后驱动程序容器容器集开始运行。
使用
oc get pods
命令显示构建 pod 的状态:$ oc get pods -n simple-kmod
输出示例
NAME READY STATUS RESTARTS AGE simple-kmod-driver-build-12813789169ac0ee-1-build 0/1 Completed 0 7m12s simple-kmod-driver-container-12813789169ac0ee-mjsnh 1/1 Running 0 8m2s simple-kmod-driver-container-12813789169ac0ee-qtkff 1/1 Running 0 8m2s
使用
oc logs
命令以及从上述oc get pods
命令获取的构建 pod 名称,以显示 simple-kmod 驱动程序容器镜像构建的日志:$ oc logs pod/simple-kmod-driver-build-12813789169ac0ee-1-build -n simple-kmod
要验证是否载入了 simple-kmod 内核模块,请在上面的
oc get pods
命令返回的一个驱动程序容器 pod 中执行lsmod
命令:$ oc exec -n simple-kmod -it pod/simple-kmod-driver-container-12813789169ac0ee-mjsnh -- lsmod | grep simple
输出示例
simple_procfs_kmod 16384 0 simple_kmod 16384 0
sro_kind_completed_info
SRO Prometheus 指标提供有关所部署不同对象的状态的信息,这可用于对 SRO CR 安装进行故障排除。SRO 还提供其他类型的指标,可用于监视环境的健康状况。
3.3.2. 为 hub-and-spoke 拓扑构建并运行 simple-kmod SpecialResource
您可以在 Red Hat Advanced Cluster Management(RHACM)的 hub-and-spoke 部署中使用 Special Resource Operator(SRO)将 hub 集群连接到一个或多个受管集群。
这个示例步骤演示了如何在 hub 中构建驱动程序容器。SRO 监视 hub 集群资源来识别 OpenShift Container Platform 版本的 helm chart,用来创建它要提供给 spoke 的资源。
先决条件
- 有一个正在运行的 OpenShift Container Platform 集群。
-
已安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
权限的用户身份登录 OpenShift CLI。 - 已安装 SRO。
-
已安装 Helm CLI (
helm
)。 - 已安装 Red Hat Advanced Cluster Management(RHACM)。
- 已配置了一个容器 registry。
流程
运行以下命令来创建
templates
目录:$ mkdir -p charts/acm-simple-kmod-0.0.1/templates
运行以下命令来更改
templates
目录:$ cd charts/acm-simple-kmod-0.0.1/templates
为
BuildConfig
、Policy
和PlacementRule
资源创建模板文件。将镜像流和构建配置的 YAML 模板保存在
templates
目录中,存为0001-buildconfig.yaml
。apiVersion: build.openshift.io/v1 kind: BuildConfig metadata: labels: app: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} name: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} annotations: specialresource.openshift.io/wait: "true" spec: nodeSelector: node-role.kubernetes.io/worker: "" runPolicy: "Serial" triggers: - type: "ConfigChange" - type: "ImageChange" source: dockerfile: | FROM {{ .Values.driverToolkitImage }} as builder WORKDIR /build/ RUN git clone -b {{.Values.specialResourceModule.spec.set.git.ref}} {{.Values.specialResourceModule.spec.set.git.uri}} WORKDIR /build/simple-kmod RUN make all install KVER={{ .Values.kernelFullVersion }} FROM registry.redhat.io/ubi8/ubi-minimal RUN microdnf -y install kmod COPY --from=builder /etc/driver-toolkit-release.json /etc/ COPY --from=builder /lib/modules/{{ .Values.kernelFullVersion }}/* /lib/modules/{{ .Values.kernelFullVersion }}/ strategy: dockerStrategy: dockerfilePath: Dockerfile.SRO buildArgs: - name: "IMAGE" value: {{ .Values.driverToolkitImage }} {{- range $arg := .Values.buildArgs }} - name: {{ $arg.name }} value: {{ $arg.value }} {{- end }} - name: KVER value: {{ .Values.kernelFullVersion }} output: to: kind: DockerImage name: {{.Values.registry}}/{{.Values.specialResourceModule.metadata.name}}-{{.Values.groupName.driverContainer}}:{{.Values.kernelFullVersion}}
将 ACM 策略的 YAML 模板保存到
templates
目录中,存为0002-policy.yaml
。apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: policy-{{.Values.specialResourceModule.metadata.name}}-ds annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST-CSF spec: remediationAction: enforce disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: config-{{.Values.specialResourceModule.metadata.name}}-ds spec: remediationAction: enforce severity: low namespaceselector: exclude: - kube-* include: - '*' object-templates: - complianceType: musthave objectDefinition: apiVersion: v1 kind: Namespace metadata: name: {{.Values.specialResourceModule.spec.namespace}} - complianceType: mustonlyhave objectDefinition: apiVersion: v1 kind: ServiceAccount metadata: name: {{.Values.specialResourceModule.metadata.name}} namespace: {{.Values.specialResourceModule.spec.namespace}} - complianceType: mustonlyhave objectDefinition: apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: {{.Values.specialResourceModule.metadata.name}} namespace: {{.Values.specialResourceModule.spec.namespace}} rules: - apiGroups: - security.openshift.io resources: - securitycontextconstraints verbs: - use resourceNames: - privileged - complianceType: mustonlyhave objectDefinition: apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: {{.Values.specialResourceModule.metadata.name}} namespace: {{.Values.specialResourceModule.spec.namespace}} roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: {{.Values.specialResourceModule.metadata.name}} subjects: - kind: ServiceAccount name: {{.Values.specialResourceModule.metadata.name}} namespace: {{.Values.specialResourceModule.spec.namespace}} - complianceType: musthave objectDefinition: apiVersion: apps/v1 kind: DaemonSet metadata: labels: app: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} name: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} namespace: {{.Values.specialResourceModule.spec.namespace}} spec: updateStrategy: type: OnDelete selector: matchLabels: app: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} template: metadata: labels: app: {{ printf "%s-%s" .Values.specialResourceModule.metadata.name .Values.kernelFullVersion | replace "." "-" | replace "_" "-" | trunc 63 }} spec: priorityClassName: system-node-critical serviceAccount: {{.Values.specialResourceModule.metadata.name}} serviceAccountName: {{.Values.specialResourceModule.metadata.name}} containers: - image: {{.Values.registry}}/{{.Values.specialResourceModule.metadata.name}}-{{.Values.groupName.driverContainer}}:{{.Values.kernelFullVersion}} name: {{.Values.specialResourceModule.metadata.name}} imagePullPolicy: Always command: [sleep, infinity] lifecycle: preStop: exec: command: ["modprobe", "-r", "-a" , "simple-kmod", "simple-procfs-kmod"] securityContext: privileged: true
将放置规则的此 YAML 模板保存到
templates
目录中,存为0003-policy.yaml
。apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: name: {{.Values.specialResourceModule.metadata.name}}-placement spec: clusterConditions: - status: "True" type: ManagedClusterConditionAvailable clusterSelector: matchExpressions: - key: name operator: NotIn values: - local-cluster --- apiVersion: policy.open-cluster-management.io/v1 kind: PlacementBinding metadata: name: {{.Values.specialResourceModule.metadata.name}}-binding placementRef: apiGroup: apps.open-cluster-management.io kind: PlacementRule name: {{.Values.specialResourceModule.metadata.name}}-placement subjects: - apiGroup: policy.open-cluster-management.io kind: Policy name: policy-{{.Values.specialResourceModule.metadata.name}}-ds
运行以下命令,进入
chart/acm-simple-kmod-0.0.1
目录:cd ..
在
charts/acm-simple-kmod-0.0.1
目录中将 chart 的以下 YAML 模板保存为Chart.yaml
:apiVersion: v2 name: acm-simple-kmod description: Build ACM enabled simple-kmod driver with SpecialResourceOperator icon: https://avatars.githubusercontent.com/u/55542927 type: application version: 0.0.1 appVersion: 1.6.4
在
chart
目录中,使用以下命令创建 chart:$ helm package acm-simple-kmod-0.0.1/
输出示例
Successfully packaged chart and saved it to: <directory>/charts/acm-simple-kmod-0.0.1.tgz
创建配置映射以存储 chart 文件。
运行以下命令,为配置映射文件创建一个目录:
$ mkdir cm
运行以下命令,将 Helm Chart 复制到
cm
目录中:$ cp acm-simple-kmod-0.0.1.tgz cm/acm-simple-kmod-0.0.1.tgz
运行以下命令,创建指定包含 Helm chart 的 Helm 仓库的索引文件:
$ helm repo index cm --url=cm://acm-simple-kmod/acm-simple-kmod-chart
运行以下命令,为 Helm chart 中定义的对象创建一个命名空间:
$ oc create namespace acm-simple-kmod
运行以下命令来创建配置映射对象:
$ oc create cm acm-simple-kmod-chart --from-file=cm/index.yaml --from-file=cm/acm-simple-kmod-0.0.1.tgz -n acm-simple-kmod
使用以下
SpecialResourceModule
清单,使用配置映射中创建的 Helm chart 部署simple-kmod
对象。将此 YAML 文件保存为acm-simple-kmod.yaml
:apiVersion: sro.openshift.io/v1beta1 kind: SpecialResourceModule metadata: name: acm-simple-kmod spec: namespace: acm-simple-kmod chart: name: acm-simple-kmod version: 0.0.1 repository: name: acm-simple-kmod url: cm://acm-simple-kmod/acm-simple-kmod-chart set: kind: Values apiVersion: sro.openshift.io/v1beta1 buildArgs: - name: "KMODVER" value: "SRO" registry: <your_registry> 1 git: ref: master uri: https://github.com/openshift-psap/kvc-simple-kmod.git watch: - path: "$.metadata.labels.openshiftVersion" apiVersion: cluster.open-cluster-management.io/v1 kind: ManagedCluster name: spoke1
- 1
- 指定您配置的 registry 的 URL。
运行以下命令来创建特殊资源模块:
$ oc apply -f charts/examples/acm-simple-kmod.yaml
验证
运行以下命令,检查构建 pod 的状态:
$ KUBECONFIG=~/hub/auth/kubeconfig oc get pod -n acm-simple-kmod
输出示例
NAME READY STATUS RESTARTS AGE acm-simple-kmod-4-18-0-305-34-2-el8-4-x86-64-1-build 0/1 Completed 0 42m
运行以下命令检查是否创建了策略:
$ KUBECONFIG=~/hub/auth/kubeconfig oc get placementrules,placementbindings,policies -n acm-simple-kmod
输出示例
NAME AGE REPLICAS placementrule.apps.open-cluster-management.io/acm-simple-kmod-placement 40m NAME AGE placementbinding.policy.open-cluster-management.io/acm-simple-kmod-binding 40m NAME REMEDIATION ACTION COMPLIANCE STATE AGE policy.policy.open-cluster-management.io/policy-acm-simple-kmod-ds enforce Compliant 40m
运行以下命令检查资源是否已协调:
$ KUBECONFIG=~/hub/auth/kubeconfig oc get specialresourcemodule acm-simple-kmod -o json | jq -r '.status'
输出示例
{ "versions": { "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:6a3330ef5a178435721ff4efdde762261a9c55212e9b4534385e04037693fbe4": { "complete": true } } }
运行以下命令,检查资源是否在 spoke 中运行:
$ KUBECONFIG=~/spoke1/kubeconfig oc get ds,pod -n acm-simple-kmod
输出示例
AME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/acm-simple-kmod-4-18-0-305-45-1-el8-4-x86-64 3 3 3 3 3 <none> 26m NAME READY STATUS RESTARTS AGE pod/acm-simple-kmod-4-18-0-305-45-1-el8-4-x86-64-brw78 1/1 Running 0 26m pod/acm-simple-kmod-4-18-0-305-45-1-el8-4-x86-64-fqh5h 1/1 Running 0 26m pod/acm-simple-kmod-4-18-0-305-45-1-el8-4-x86-64-m9sfd 1/1 Running 0 26m
3.4. Prometheus Special Resource Operator 指标
Special Resource Operator(SRO)通过 metrics
服务公开以下 Prometheus 指标 :
指标名称 | 描述 |
---|---|
|
返回运行由 SRO 自定义资源(CR)创建的 pod 的节点。此指标仅适用于 |
|
代表 SRO CR 中的 Helm Charts 定义的对象 |
|
代表 SRO 是否已成功完成 CR 成功处理 CR( 值为 |
| 返回集群中的 SRO CR 数量,无论其状态如何。 |
3.5. 其他资源
- 有关在使用特殊 Resource Operator 前恢复 Image Registry Operator 状态的信息,请参阅安装过程中删除的镜像 registry。
- 有关安装 NFD Operator 的详情,请参阅 Node Feature Discovery (NFD) Operator。
- 有关更新包含特殊资源 Operator 的集群的详情,请参考 更新包含特殊资源 Operator 的集群。
第 4 章 Node Feature Discovery Operator
了解 Node Feature Discovery(NFD)Operator 以及如何使用它通过编排节点功能发现(用于检测硬件功能和系统配置的 Kubernetes 附加组件)来公开节点级信息。
4.1. 关于 Node Feature Discovery Operator
Node Feature Discovery Operator(NFD)通过将节点标记为硬件特定信息来管理 OpenShift Container Platform 集群中硬件功能和配置的检测。NFD 使用特定于节点的属性标记主机,如 PCI 卡、内核、操作系统版本等。
NFD Operator 可以通过搜索 "Node Feature Discovery" 在 Operator Hub 上找到。
4.2. 安装 Node Feature Discovery Operator
Node Feature Discovery(NFD)Operator 编排运行 NFD 守护进程集需要的所有资源。作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 NFD Operator。
4.2.1. 使用 CLI 安装 NFD Operator
作为集群管理员,您可以使用 CLI 安装 NFD Operator。
先决条件
- OpenShift Container Platform 集群
-
安装 OpenShift CLI (
oc
) 。 -
以具有
cluster-admin
特权的用户身份登录。
流程
为 NFD Operator 创建命名空间。
创建定义
openshift-nfd
命名空间的以下Namespace
自定义资源(CR),然后在nfd-namespace.yaml
文件中保存 YAML:apiVersion: v1 kind: Namespace metadata: name: openshift-nfd
运行以下命令创建命名空间:
$ oc create -f nfd-namespace.yaml
通过创建以下对象,在您上一步中创建的命名空间中安装 NFD Operator:
创建以下
OperatorGroup
CR,并在 nfd-operatorgroup.yaml
文件中保存 YAML:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: generateName: openshift-nfd- name: openshift-nfd namespace: openshift-nfd spec: targetNamespaces: - openshift-nfd
运行以下命令来创建
OperatorGroup
CR:$ oc create -f nfd-operatorgroup.yaml
创建以下
Subscription
CR,并将 YAML 保存到nfd-sub.yaml
文件中:订阅示例
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: nfd namespace: openshift-nfd spec: channel: "stable" installPlanApproval: Automatic name: nfd source: redhat-operators sourceNamespace: openshift-marketplace
运行以下命令来创建订阅对象:
$ oc create -f nfd-sub.yaml
进入
openshift-nfd
项目:$ oc project openshift-nfd
验证
要验证 Operator 部署是否成功,请运行:
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 10m
一个成功的部署会显示
Running
状态。
4.2.2. 使用 Web 控制台安装 NFD Operator
作为集群管理员,您可以使用 Web 控制台安装 NFD Operator。
流程
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 Node Feature Discovery,然后点 Install。
- 在 Install Operator 页面中,选择 A specific namespace on the cluster,然后点 Install。您不需要创建命名空间,因为它已为您创建。
验证
验证 NFD Operator 是否已成功安装:
- 进入到 Operators → Installed Operators 页面。
确保 openshift-nfd 项目中列出了 Node Feature Discovery,Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
故障排除
如果 Operator 没有被安装,请按照以下步骤进行故障排除:
- 导航到 Operators → Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
导航到 Workloads → Pods 页面,在
openshift-nfd
项目中检查 pod 的日志。
4.3. 使用 Node Feature Discovery Operator
Node Feature Discovery(NFD)Operator 通过监视 NodeFeatureDiscovery
CR 来编排运行 Node-Feature-Discovery 守护进程所需的所有资源。根据 NodeFeatureDiscovery
CR,Operator 将在所需命名空间中创建操作对象(NFD)组件。您可以编辑 CR 来选择另一个 命名空间
、镜像
、imagePullPolicy
和 nfd-worker-conf
,以及其他选项。
作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台创建 NodeFeatureDiscovery
实例。
4.3.1. 使用 CLI 创建 NodeFeatureDiscovery 实例
作为集群管理员,您可以使用 CLI 创建 NodeFeatureDiscovery
CR 实例。
先决条件
- OpenShift Container Platform 集群
-
安装 OpenShift CLI (
oc
) 。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NFD Operator。
流程
创建以下
NodeFeatureDiscovery
自定义资源(CR),然后在NodeFeatureDiscovery.yaml
文件中保存 YAML:apiVersion: nfd.openshift.io/v1 kind: NodeFeatureDiscovery metadata: name: nfd-instance namespace: openshift-nfd spec: instance: "" # instance is empty by default topologyupdater: false # False by default operand: image: registry.redhat.io/openshift4/ose-node-feature-discovery:v4.11 imagePullPolicy: Always workerConfig: configData: | core: # labelWhiteList: # noPublish: false sleepInterval: 60s # sources: [all] # klog: # addDirHeader: false # alsologtostderr: false # logBacktraceAt: # logtostderr: true # skipHeaders: false # stderrthreshold: 2 # v: 0 # vmodule: ## NOTE: the following options are not dynamically run-time configurable ## and require a nfd-worker restart to take effect after being changed # logDir: # logFile: # logFileMaxSize: 1800 # skipLogHeaders: false sources: cpu: cpuid: # NOTE: whitelist has priority over blacklist attributeBlacklist: - "BMI1" - "BMI2" - "CLMUL" - "CMOV" - "CX16" - "ERMS" - "F16C" - "HTT" - "LZCNT" - "MMX" - "MMXEXT" - "NX" - "POPCNT" - "RDRAND" - "RDSEED" - "RDTSCP" - "SGX" - "SSE" - "SSE2" - "SSE3" - "SSE4.1" - "SSE4.2" - "SSSE3" attributeWhitelist: kernel: kconfigFile: "/path/to/kconfig" configOpts: - "NO_HZ" - "X86" - "DMI" pci: deviceClassWhitelist: - "0200" - "03" - "12" deviceLabelFields: - "class" customConfig: configData: | - name: "more.kernel.features" matchOn: - loadedKMod: ["example_kmod3"]
有关如何自定义 NFD worker 的详情,请参考 nfd-worker 的配置文件参考。
运行以下命令来创建
NodeFeatureDiscovery
CR 实例:$ oc create -f NodeFeatureDiscovery.yaml
验证
要验证是否已创建实例,请运行:
$ oc get pods
输出示例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-7f86ccfb58-vgr4x 2/2 Running 0 11m nfd-master-hcn64 1/1 Running 0 60s nfd-master-lnnxx 1/1 Running 0 60s nfd-master-mp6hr 1/1 Running 0 60s nfd-worker-vgcz9 1/1 Running 0 60s nfd-worker-xqbws 1/1 Running 0 60s
一个成功的部署会显示
Running
状态。
4.3.2. 使用 Web 控制台创建 NodeFeatureDiscovery CR
流程
- 进入到 Operators → Installed Operators 页面。
- 查找 Node Feature Discovery,并在 Provided APIs 下看到一个方框。
- 单击 Create instance。
-
编辑
NodeFeatureDiscovery
CR 的值。 - 点 Create。
4.4. 配置 Node Feature Discovery Operator
4.4.1. core
core
部分包含不特定于任何特定功能源的常见配置设置。
core.sleepInterval
core.sleepInterval
指定连续通过功能检测或重新检测之间的间隔,还可指定节点重新标记之间的间隔。非正数值意味着睡眠间隔无限 ; 不进行重新检测或重新标记。
如果指定,这个值会被弃用的 --sleep-interval
命令行标志覆盖。
用法示例
core:
sleepInterval: 60s 1
默认值为 60s
。
core.sources
core.sources
指定启用的功能源列表。特殊值 all
可启用所有功能源。
如果指定,这个值会被弃用的 --sources
命令行标志覆盖。
默认:[all]
用法示例
core: sources: - system - custom
core.labelWhiteList
core.labelWhiteList
根据标签名称指定用于过滤功能标签的正则表达式。不匹配的标签将不会被发布。
正则表达式仅与标签的 basename 部分("/"后的名称部分)进行匹配。标签前缀或命名空间会被省略。
如果指定,这个值会被弃用的 --label-whitelist
命令行标志覆盖。
默认: null
用法示例
core: labelWhiteList: '^cpu-cpuid'
core.noPublish
将 core.noPublish
设置为 true
可禁用与 nfd-master
的所有通信。它实际上是一个空运行标记; nfd-worker
会正常运行功能检测,但不会向 nfd-master
发送实际的标记请求。
如果指定,--no-publish
命令行标志会覆盖这个值。
例如:
用法示例
core:
noPublish: true 1
默认值为 false
。
core.klog
以下选项指定日志记录器配置,其中大多数可以在运行时动态调整。
日志记录器选项也可以使用命令行标志来指定,其优先级高于任何对应的配置文件选项。
core.klog.addDirHeader
如果设置为 true
,core.klog.addDirHeader
将文件目录添加到日志消息的标头中。
默认:false
运行时可配置:是
core.klog.alsologtostderr
将日志信息输出到标准错误以及文件。
默认:false
运行时可配置:是
core.klog.logBacktraceAt
当日志记录达到行 file:N 时,触发堆栈跟踪功能。
默认: 空
运行时可配置:是
core.klog.logDir
如果非空,在此目录中写入日志文件。
默认: 空
运行是时配置:否
core.klog.logFile
如果不为空,则使用此日志文件。
默认: 空
运行是时配置:否
core.klog.logFileMaxSize
core.klog.logFileMaxSize
定义日志文件可增大的最大大小。单位是 MB。如果值为 0
,则最大文件大小没有限制。
默认: 1800
运行是时配置:否
core.klog.logtostderr
将日志信息输出到标准错误而不是文件
默认: true
运行时可配置:是
core.klog.skipHeaders
如果 core.klog.skipHeaders
设为 true
,忽略日志消息中的标头前缀。
默认:false
运行时可配置:是
core.klog.skipLogHeaders
如果 core.klog.skipLogHeaders
设为 true
,在打开日志文件时忽略标头。
默认:false
运行是时配置:否
core.klog.stderrthreshold
处于或超过此阈值的日志输出到 stderr。
默认: 2
运行时可配置:是
core.klog.v
core.klog.v
是日志级别详细程度的值。
默认: 0
运行时可配置:是
core.klog.vmodule
core.klog.vmodule
是文件过滤日志的、以逗号分隔的 pattern=N
设置列表。
默认: 空
运行时可配置:是
4.4.2. sources
sources
部分包含特定于功能源的配置参数。
sources.cpu.cpuid.attributeBlacklist
防止发布此选项中列出的 cpuid
功能。
如果指定,则 source.cpu.cpuid.attributeWhitelist
将覆盖这个值。
默认:[BMI1, BMI2, CLMUL, CMOV, CX16, ERMS, F16C, HTT, LZCNT, MMX, MMXEXT, NX, POPCNT, RDRAND, RDSEED, RDTSCP, SGX, SGXLC, SSE, SSE2, SSE3, SSE4.1, SSE4.2, SSSE3]
用法示例
sources: cpu: cpuid: attributeBlacklist: [MMX, MMXEXT]
sources.cpu.cpuid.attributeWhitelist
仅发布在此选项中列出的 cpuid
功能。
source.cpu.cpuid.attributeWhitelist
优先于 source.cpu.cpuid.attributeBlacklist
。
默认: 空
用法示例
sources: cpu: cpuid: attributeWhitelist: [AVX512BW, AVX512CD, AVX512DQ, AVX512F, AVX512VL]
sources.kernel.kconfigFile
source.kernel.kconfigFile
是内核配置文件的路径。如果为空,NFD 会在已知的标准位置运行搜索。
默认: 空
用法示例
sources: kernel: kconfigFile: "/path/to/kconfig"
sources.kernel.configOpts
sources.kernel.configOpts
代表内核配置选项,作为功能标签发布。
默认:[NO_HZ, NO_HZ_IDLE, NO_HZ_FULL, PREEMPT]
用法示例
sources: kernel: configOpts: [NO_HZ, X86, DMI]
sources.pci.deviceClassWhitelist
sources.pci.deviceClassWhitelist
是用来发布标签的 PCI 设备类 ID 列表。它只能指定为主类(例如 03
)或全类子类组合(例如 0300
)。前者表示接受所有子类。可以使用 deviceLabelFields
进一步配置标签格式。
默认: ["03", "0b40", "12"]
用法示例
sources: pci: deviceClassWhitelist: ["0200", "03"]
sources.pci.deviceLabelFields
sources.pci.deviceLabelFields
是构建功能标签名称时要使用的 PCI ID 字段集合。有效字段包括 class
、vendor
、device
、subsystem_vendor
和 subsystem_device
。
默认: [class, vendor]
用法示例
sources: pci: deviceLabelFields: [class, vendor, device]
在上例配置中,NFD 会发布标签,如 feature.node.kubernetes.io/pci-<class-id>_<vendor-id>_<device-id>.present=true
sources.usb.deviceClassWhitelist
sources.usb.deviceClassWhitelist
是一个 USB 设备类 ID 列表,用于发布功能标签。可以使用 deviceLabelFields
进一步配置标签格式。
默认: ["0e", "ef", "fe", "ff"]
用法示例
sources: usb: deviceClassWhitelist: ["ef", "ff"]
sources.usb.deviceLabelFields
sources.usb.deviceLabelFields
是一组 USB ID 字段,用于编写功能标签的名称。有效字段包括 class
、vendor
和 device
。
默认: [class、vendor、device]
用法示例
sources: pci: deviceLabelFields: [class, vendor]
使用上面的示例配置,NFD 会发布类似如下标签: feature.node.kubernetes.io/usb-<class-id>_<vendor-id>.present=true
。
sources.custom
sources.custom
是在自定义功能源中处理的规则列表,用于创建特定于用户的标签。
默认: 空
用法示例
source: custom: - name: "my.custom.feature" matchOn: - loadedKMod: ["e1000e"] - pciId: class: ["0200"] vendor: ["8086"]
4.5. 使用 NFD Topology Updater
Node Feature Discovery(NFD)Topology Updater 是一个守护进程,负责检查 worker 节点上分配的资源。它考虑可以为每个区分配给新 pod 的资源,其中区域可以是 Non-Uniform Memory Access(NUMA)节点。NFD Topology Updater 将信息发送到 nfd-master,它会创建一个与集群中的所有 worker 节点对应的 NodeResourceTopology
自定义资源(CR)。NFD Topology Updater 其中一个实例在集群的每个节点上运行。
要在 NFD 中启用 Topology Updater worker,将 NodeFeatureDiscovery
CR 中的 topologyupdater
变量设置为 true
,如使用 Node Feature Discovery Operator 一节中所述。
4.5.1. NodeResourceTopology CR
使用 NFD Topology Updater 时,NFD 会创建与节点资源硬件拓扑对应的自定义资源实例,例如:
apiVersion: topology.node.k8s.io/v1alpha1 kind: NodeResourceTopology metadata: name: node1 topologyPolicies: ["SingleNUMANodeContainerLevel"] zones: - name: node-0 type: Node resources: - name: cpu capacity: 20 allocatable: 16 available: 10 - name: vendor/nic1 capacity: 3 allocatable: 3 available: 3 - name: node-1 type: Node resources: - name: cpu capacity: 30 allocatable: 30 available: 15 - name: vendor/nic2 capacity: 6 allocatable: 6 available: 6 - name: node-2 type: Node resources: - name: cpu capacity: 30 allocatable: 30 available: 15 - name: vendor/nic1 capacity: 3 allocatable: 3 available: 3
4.5.2. NFD Topology Updater 命令行标志
要查看可用的命令行标志,请运行 nfd-topology-updater -help
命令。例如,在 podman 容器中,运行以下命令:
$ podman run gcr.io/k8s-staging-nfd/node-feature-discovery:master nfd-topology-updater -help
-ca-file
-ca-file
标志是用于控制 NFD Topology Updater 上的 mutual TLS 身份验证的三个标记之一,其他两个是 -cert-file
和 '-key-file'。此标志指定用于验证 nfd-master 真实性的 TLS root 证书。
默认: 空
-ca-file
标志必须与 -cert-file
和 -key-file
标志一起指定。
Example
$ nfd-topology-updater -ca-file=/opt/nfd/ca.crt -cert-file=/opt/nfd/updater.crt -key-file=/opt/nfd/updater.key
-cert-file
-cert-file
标志是在 NFD Topology Updater 上控制 mutual TLS 身份验证的三个标记之一,其他两个与 -ca-file
和 -key-file flags
。此标志指定为身份验证传出请求的 TLS 证书。
默认: 空
-cert-file
标志必须与 -ca-file
和 -key-file
标志一起指定。
Example
$ nfd-topology-updater -cert-file=/opt/nfd/updater.crt -key-file=/opt/nfd/updater.key -ca-file=/opt/nfd/ca.crt
-h, -help
打印使用方法并退出.
-key-file
key-file
标志是控制 NFD Topology Updater 上的 mutual TLS 身份验证的三个标记之一,其他两个是 -ca-file
和 -cert-file
。此标志指定与给定证书文件或 -cert-file
对应的私钥,用于验证传出请求。
默认: 空
key-file
标志必须与 -ca-file
和 -cert-file
标志一起指定。
Example
$ nfd-topology-updater -key-file=/opt/nfd/updater.key -cert-file=/opt/nfd/updater.crt -ca-file=/opt/nfd/ca.crt
-kubelet-config-file
-kubelet-config-file
指定到 Kubelet 配置文件的路径。
默认:/host-var/lib/kubelet/config.yaml
Example
$ nfd-topology-updater -kubelet-config-file=/var/lib/kubelet/config.yaml
-no-publish
-no-publish
标志禁用与 nfd-master 的所有通信,使其成为 nfd-topology-updater 的空运行标记。NFD Topology Updater 会正常运行资源硬件拓扑检测,但不会将 CR 请求发送到 nfd-master。
默认:false
Example
$ nfd-topology-updater -no-publish
4.5.2.1. -oneshot
-oneshot
标志会导致 NFD Topology Updater 在传递资源硬件拓扑检测后退出。
默认:false
Example
$ nfd-topology-updater -oneshot -no-publish
-podresources-socket
-podresources-socket
标志指定 Unix 套接字的路径,其中 kubelet 会导出 gRPC 服务来启用使用中的 CPU 和设备的发现,并为它们提供元数据。
默认:/host-var/liblib/kubelet/pod-resources/kubelet.sock
Example
$ nfd-topology-updater -podresources-socket=/var/lib/kubelet/pod-resources/kubelet.sock
-server
-server
标志指定要连接到的 nfd-master 端点的地址。
默认:localhost:8080
Example
$ nfd-topology-updater -server=nfd-master.nfd.svc.cluster.local:443
-server-name-override
-server-name-override
标志指定从 nfd-master TLS 证书期望的通用名称(CN)。这个标志主要用于开发和调试目的。
默认: 空
Example
$ nfd-topology-updater -server-name-override=localhost
-sleep-interval
-sleep-interval
标志指定资源硬件拓扑重新检查和自定义资源更新之间的间隔。非正数值意味着睡眠间隔无限,不会进行重新检测。
默认:60s
Example
$ nfd-topology-updater -sleep-interval=1h
-version
打印版本并退出。
-watch-namespace
watch-namespace
标志指定命名空间,以确保仅在指定命名空间中运行的容器集发生资源硬件拓扑考试。在资源核算过程中不考虑在指定命名空间中运行的 Pod。这对于测试和调试目的特别有用。*
值表示所有命名空间中的所有 pod 在计数过程中都会考虑。
默认:*
Example
$ nfd-topology-updater -watch-namespace=rte
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.