専用のハードウェアおよびドライバーの有効化

OpenShift Container Platform 4.12

OpenShift Container Platform でのハードウェアの有効化について確認します。

概要

本書では、OpenShift Container Platform でのハードウェアの有効化に関して解説します。

第1章 専用のハードウェアおよびドライバーの有効化

Driver Toolkit (DTK) は、OpenShift Container Platform ペイロードのコンテナーイメージであり、ドライバーコンテナーを構築するベースイメージとして使用することが目的です。Driver Toolkit イメージには、カーネルモジュールをビルドまたはインストールするための依存関係として一般的に必要なカーネルパッケージと、ドライバーコンテナーに必要ないくつかのツールが含まれています。これらのパッケージのバージョンは、対応する OpenShift Container Platform リリースの RHCOS ノードで実行されているカーネルのバージョンと一致します。

ドライバーコンテナーは、コンテナーオペレーティングシステム (:op-system-first: など) でツリー外のカーネルモジュールとドライバーをビルドおよびデプロイメントするために使用されるコンテナーイメージです。カーネルモジュールおよびドライバーは、レベルの高い権限で、オペレーティングシステムカーネル内で実行されるソフトウェアライブラリーです。また、カーネル機能の拡張や、新しいデバイスの制御に必要なハードウェア固有のコードを提供します。例としては、field-programmable gate arrays (FPGA) や graphics processing units (GPU) などのハードウェアデバイスや、ソフトウェア定義のストレージソリューションなどがあります。これらはすべて、クライアントマシンでカーネルモジュールを必要とします。ドライバーコンテナーは、OpenShift Container Platform デプロイメントでこれらのテクノロジーを有効にするために使用されるソフトウェアスタックの最初の階層です。

第2章 ドライバーツールキット

Driver Toolkit について、およびドライバーコンテナーのベースイメージとしてそれを使用して、OpenShift Container Platform デプロイメントで特別なソフトウェアおよびハードウェアデバイスを有効にする方法について説明します。

2.1. Driver Toolkit について

背景情報

Driver Toolkit は、ドライバーコンテナーをビルドできるベースイメージとして使用する OpenShift Container Platform ペイロードのコンテナーイメージです。Driver Toolkit イメージには、カーネルモジュールをビルドまたはインストールするための依存関係として一般的に必要なカーネルパッケージと、ドライバーコンテナーに必要ないくつかのツールが含まれています。これらのパッケージのバージョンは、対応する OpenShift Container Platform リリースの Red Hat Enterprise Linux CoreOS (RHCOS) ノードで実行されているカーネルバージョンと同じです。

ドライバーコンテナーは、RHCOS などのコンテナーオペレーティングシステムで out-of-tree カーネルモジュールをビルドしてデプロイするのに使用するコンテナーイメージです。カーネルモジュールおよびドライバーは、レベルの高い権限で、オペレーティングシステムカーネル内で実行されるソフトウェアライブラリーです。また、カーネル機能の拡張や、新しいデバイスの制御に必要なハードウェア固有のコードを提供します。例として、Field Programmable Gate Arrays (FPGA) または GPU などのハードウェアデバイスや、クライアントマシンでカーネルモジュールを必要とする Lustre parallel ファイルシステムなどのソフトウェア定義のストレージ (SDS) ソリューションなどがあります。ドライバーコンテナーは、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 がリリースされる前は、エンタイトルメントのあるビルド を使用するか、または ホストの machine-os-content のカーネル RPM からインストールして、Pod またはビルド設定のカーネルパッケージを OpenShift Container Platform にインストールすることができていました。Driver Toolkit を使用すると、エンタイトルメントステップがなくなりプロセスが単純化され、Pod で machine-os-content にアクセスする特権操作を回避できます。Driver Toolkit は、プレリリース済みの OpenShift Container Platform バージョンにアクセスできるパートナーも使用でき、今後の OpenShift Container Platform リリース用にハードウェアデバイスのドライバーコンテナーを事前にビルドできます。

Driver Toolkit は Kernel Module Management (KMM) でも使用されます。Kernel Module Management (KMM) は、現在 OperatorHub でコミュニティー Operator として利用できます。KMM は、out-of-tree およびサードパーティーのカーネルドライバー、および基礎となるオペレーティングシステムのサポートソフトウェアをサポートします。ユーザーは、KMM のレシピを作成してドライバーコンテナーを構築してデプロイしたり、デバイスプラグインやメトリックなどのソフトウェアをサポートしたりできます。モジュールには、ビルド設定を追加して、Driver Toolkit をベースにドライバーコンテナーをビルドできます。または KMM で事前ビルドされたドライバーコンテナーをデプロイできます。

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 コンテナーイメージのプル

podman または OpenShift Container Platform を使用して registry.redhat.io から driver-toolkit イメージをプルする手順は、Red Hat Ecosystem Catalog を参照してください。最新のマイナーリリースのドライバーツールキットイメージは、registry.redhat.io のマイナーリリースバージョンでタグ付けされます (例: registry.redhat.io/openshift4/driver-toolkit-rhel8:v4.12)。

2.2.2. ペイロードでの Driver Toolkit イメージ URL の検索

前提条件

手順

  1. 特定のリリースに対応する driver-toolkit のイメージ URL は、oc adm コマンドを使用してリリースイメージから取得できます。

    # For x86 image:
    $ oc adm release info quay.io/openshift-release-dev/ocp-release:4.12.z-x86_64 --image-for=driver-toolkit
    
    # For ARM image:
    $ oc adm release info quay.io/openshift-release-dev/ocp-release:4.12.z-aarch64 --image-for=driver-toolkit

    出力例

    quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:0fd84aee79606178b6561ac71f8540f404d518ae5deff45f6d6ac8f02636c7f4

  2. このイメージは、OpenShift Container Platform のインストールに必要なプルシークレットなどの有効なプルシークレットを使用して取得できます。
$ podman pull --authfile=path/to/pullsecret.json quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:<SHA>

2.3. Driver Toolkit の使用

たとえば、Driver Toolkit は simple-kmod と呼ばれる単純なカーネルモジュールを構築するベースイメージとして使用できます。

注記

Driver Toolkit には、カーネルモジュールに署名するために必要な依存関係である opensslmokutil、および keyutils が含まれています。ただし、この例では、simple-kmod カーネルモジュールは署名されていないため、Secure Boot が有効になっているシステムにはロードできません。

2.3.1. クラスターでの simple-kmod ドライバーコンテナーをビルドし、実行します。

前提条件

  • OpenShift Container Platform クラスターが実行中である。
  • クラスターのイメージレジストリー Operator の状態を Managed に設定します。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限があるユーザーとして OpenShift CLI にログインしている。

手順

namespace を作成します。以下は例になります。

$ oc new-project simple-kmod-demo
  1. YAML は、simple-kmod ドライバーコンテナーイメージを保存する ImageStream と、コンテナーをビルドする 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:
        dockerfile: |
          ARG DTK
          FROM ${DTK} as builder
    
          ARG KVER
    
          WORKDIR /build/
    
          RUN git clone https://github.com/openshift-psap/simple-kmod.git
    
          WORKDIR /build/simple-kmod
    
          RUN make all install KVER=${KVER}
    
          FROM registry.redhat.io/ubi8/ubi-minimal
    
          ARG KVER
    
          # Required for installing `modprobe`
          RUN microdnf install kmod
    
          COPY --from=builder /lib/modules/${KVER}/simple-kmod.ko /lib/modules/${KVER}/
          COPY --from=builder /lib/modules/${KVER}/simple-procfs-kmod.ko /lib/modules/${KVER}/
          RUN depmod ${KVER}
      strategy:
        dockerStrategy:
          buildArgs:
            - name: KMODVER
              value: DEMO
              # $ oc adm release info quay.io/openshift-release-dev/ocp-release:<cluster version>-x86_64 --image-for=driver-toolkit
            - name: DTK
              value: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:34864ccd2f4b6e385705a730864c04a40908e57acede44457a783d739e377cae
            - name: KVER
              value: 4.18.0-372.26.1.el8_6.x86_64
      output:
        to:
          kind: ImageStreamTag
          name: simple-kmod-driver-container:demo
  2. 以下のコマンドで、DRIVER_TOOLKIT_IMAGE の代わりに、実行中の OpenShift Container Platform バージョンのドライバーツールキットイメージを置き換えます。

    $ 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
  3. 以下でイメージストリームおよびビルド設定を作成します。

    $ oc create -f 0000-buildconfig.yaml
  4. ビルダー Pod が正常に完了したら、ドライバーコンテナーイメージを DaemonSet としてデプロイします。

    1. ホスト上でカーネルモジュールを読み込むには、特権付きセキュリティーコンテキストでドライバーコンテナーを実行する必要があります。以下の 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: [sleep, infinity]
              lifecycle:
                postStart:
                  exec:
                    command: ["modprobe", "-v", "-a" , "simple-kmod", "simple-procfs-kmod"]
                preStop:
                  exec:
                    command: ["modprobe", "-r", "-a" , "simple-kmod", "simple-procfs-kmod"]
              securityContext:
                privileged: true
            nodeSelector:
              node-role.kubernetes.io/worker: ""
    2. RBAC ルールおよびデーモンセットを作成します。

      $ oc create -f 1000-drivercontainer.yaml
  5. Pod がワーカーノードで実行された後に、simple_kmod カーネルモジュールが lsmod のホストマシンで正常に読み込まれることを確認します。

    1. 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

    2. ドライバーコンテナー 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. 関連情報

第3章 Node Feature Discovery Operator

Node Feature Discovery (NFD) Operator および、これを使用して Node Feature Discovery (ハードウェア機能やシステム設定を検出するための Kubernetes アドオン) をオーケストレーションしてノードレベルの情報を公開する方法を説明します。

3.1. Node Feature Discovery Operator について

Node Feature Discovery Operator (NFD) は、ハードウェア固有の情報でノードにラベルを付け、OpenShift Container Platform クラスターのハードウェア機能と設定の検出を管理します。NFD は、PCI カード、カーネル、オペレーティングシステムのバージョンなど、ノード固有の属性でホストにラベルを付けます。

NFD Operator は、Node Feature Discovery と検索して Operator Hub で確認できます。

3.2. Node Feature Discovery Operator のインストール

Node Feature Discovery (NFD) Operator は、NFD デーモンセットの実行に必要なすべてのリソースをオーケストレーションします。クラスター管理者は、OpenShift Container Platform CLI または Web コンソールを使用して NFD Operator をインストールできます。

3.2.1. CLI を使用した NFD Operator のインストール

クラスター管理者は、CLI を使用して NFD Operator をインストールできます。

前提条件

  • OpenShift Container Platform クラスター
  • OpenShift CLI (oc) をインストールすること。
  • cluster-admin 権限を持つユーザーとしてログインすること。

手順

  1. NFD Operator の namespace を作成します。

    1. openshift-nfd namespace を定義する以下の Namespace カスタムリソース (CR) を作成し、YAML を nfd-namespace.yaml ファイルに保存します。

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-nfd
    2. 以下のコマンドを実行して namespace を作成します。

      $ oc create -f nfd-namespace.yaml
  2. 以下のオブジェクトを作成して、直前の手順で作成した namespace に NFD Operator をインストールします。

    1. 以下の OperatorGroup CR を作成し、YAML を nfd-operatorgroup.yaml ファイルに保存します。

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        generateName: openshift-nfd-
        name: openshift-nfd
        namespace: openshift-nfd
      spec:
        targetNamespaces:
        - openshift-nfd
    2. 以下のコマンドを実行して OperatorGroup CR を作成します。

      $ oc create -f nfd-operatorgroup.yaml
    3. 以下の Subscription CR を作成し、YAML を nfd-sub.yaml ファイルに保存します。

      Subscription の例

      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

    4. 以下のコマンドを実行して Subscription オブジェクトを作成します。

      $ oc create -f nfd-sub.yaml
    5. 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 ステータスが表示されます。

3.2.2. Web コンソールでの NFD Operator のインストール

クラスター管理者は、Web コンソールを使用して NFD Operator をインストールできます。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsOperatorHub をクリックします。
  2. 利用可能な Operator の一覧から Node Feature Discovery を選択してから Install をクリックします。
  3. Install Operator ページで A specific namespace on the cluster を選択し、Install をクリックします。namespace が作成されるため、これを作成する必要はありません。

検証

以下のように、NFD Operator が正常にインストールされていることを確認します。

  1. OperatorsInstalled Operators ページに移動します。
  2. StatusInstallSucceededNode Feature Discoveryopenshift-nfd プロジェクトに一覧表示され ていることを確認します。

    注記

    インストール時に、 Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。

トラブルシューティング

Operator がインストール済みとして表示されない場合に、さらにトラブルシューティングを実行します。

  1. OperatorsInstalled Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
  2. WorkloadsPods ページに移動し、openshift-nfd プロジェクトで Pod のログを確認します。

3.3. Node Feature Discovery Operator の使用

Node Feature Discovery (NFD) Operator は、NodeFeatureDiscovery CR を監視して Node-Feature-Discovery デーモンセットの実行に必要な全リソースをオーケストレーションします。NodeFeatureDiscovery CR に基づいて、Operator は任意の namespace にオペランド (NFD) コンポーネントを作成します。CR を編集して、他にあるオプションの中から、別の namespaceimageimagePullPolicy、および nfd-worker-conf を選択することができます。

クラスター管理者は、OpenShift Container Platform CLI または Web コンソールを使用して NodeFeatureDiscovery を作成できます。

3.3.1. CLI を使用した NodeFeatureDiscovery インスタンスの作成

クラスター管理者は、CLI を使用して NodeFeatureDiscovery CR インスタンスを作成できます。

前提条件

  • OpenShift Container Platform クラスター
  • OpenShift CLI (oc) をインストールすること。
  • cluster-admin 権限を持つユーザーとしてログインすること。
  • NFD Operator をインストールすること。

手順

  1. 以下の NodeFeatureDiscovery カスタムリソース (CR) を作成し、YAML を NodeFeatureDiscovery .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.12
        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 ワーカーをカスタマイズする方法は、nfd-worker の設定ファイルリファレンス を参照してください。

  1. 以下のコマンドを実行し、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 ステータスが表示されます。

3.3.2. Web コンソールを使用した NodeFeatureDiscovery CR の作成

手順

  1. OperatorsInstalled Operators ページに移動します。
  2. Node Feature Discovery を見つけ、Provided APIs でボックスを表示します。
  3. Create instance をクリックします。
  4. NodeFeatureDiscovery CR の値を編集します。
  5. Create をクリックします。

3.4. Node Feature Discovery Operator の設定

3.4.1. コア

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 は、正規表現を指定してラベル名に基づいて機能ラベルをフィルターします。一致しないラベルは公開されません。

正規表現は、ラベルのベース名 ('/' の後に名前の一部) だけを照合します。ラベルの接頭辞または namespace は省略されます。

この値は、指定されている場合は、非推奨の --label-whitelist コマンドラインフラグで上書きされます。

デフォルト: null

使用例

core:
  labelWhiteList: '^cpu-cpuid'

core.noPublish

core.noPublishtrue に設定すると、nfd-master による全通信が無効になります。これは実質的にはドライランフラグです。nfd-worker は通常通り機能検出を実行しますが、ラベル付け要求は nfd-master に送信されます。

この値は、指定されている場合には、--no-publish コマンドラインフラグにより上書きされます。

例:

使用例

core:
  noPublish: true 1

デフォルト値は false です。

core.klog

以下のオプションは、実行時にほとんどを動的に調整できるロガー設定を指定します。

ロガーオプションはコマンドラインフラグを使用して指定することもできますが、対応する設定ファイルオプションよりもこちらが優先されます。

core.klog.addDirHeader

true に設定すると、core.klog.addDirHeader がファイルディレクトリーをログメッセージのヘッダーに追加します。

デフォルト: false

ランタイム設定可能: yes

core.klog.alsologtostderr

標準エラーおよびファイルにロギングします。

デフォルト: false

ランタイム設定可能: yes

core.klog.logBacktraceAt

file:N の行にロギングが到達すると、スタックストレースを出力します。

デフォルト: empty

ランタイム設定可能: yes

core.klog.logDir

空でない場合は、このディレクトリーにログファイルを書き込みます。

デフォルト: empty

ランタイム設定可能: no

core.klog.logFile

空でない場合は、このログファイルを使用します。

デフォルト: empty

ランタイム設定可能: no

core.klog.logFileMaxSize

core.klog.logFileMaxSize は、ログファイルの最大サイズを定義します。単位はメガバイトです。値が 0 の場合には、最大ファイルサイズは無制限になります。

デフォルト: 1800

ランタイム設定可能: no

core.klog.logtostderr

ファイルの代わりに標準エラーにログを記録します。

デフォルト: true

ランタイム設定可能: yes

core.klog.skipHeaders

core.klog.skipHeaderstrue に設定されている場合には、ログメッセージでヘッダー接頭辞を使用しません。

デフォルト: false

ランタイム設定可能: yes

core.klog.skipLogHeaders

core.klog.skipLogHeaderstrue に設定されている場合は、ログファイルを表示する時にヘッダーは使用されません。

デフォルト: false

ランタイム設定可能: no

core.klog.stderrthreshold

このしきい値以上のログは stderr になります。

デフォルト: 2

ランタイム設定可能: yes

core.klog.v

core.klog.v はログレベルの詳細度の数値です。

デフォルト: 0

ランタイム設定可能: yes

core.klog.vmodule

core.klog.vmodule は、ファイルでフィルターされたロギングの pattern=N 設定 (コンマ区切りの一覧) です。

デフォルト: empty

ランタイム設定可能: yes

3.4.2. ソース

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 機能のみを公開します。

sources.cpu.cpuid.attributeWhitelistsources.cpu.cpuid.attributeBlacklist よりも優先されます。

デフォルト: empty

使用例

sources:
  cpu:
    cpuid:
      attributeWhitelist: [AVX512BW, AVX512CD, AVX512DQ, AVX512F, AVX512VL]

sources.kernel.kconfigFile

sources.kernel.kconfigFile は、カーネル設定ファイルのパスです。空の場合には、NFD は一般的な標準場所で検索を実行します。

デフォルト: empty

使用例

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 フィールドのセットです。有効なフィールドは classvendordevicesubsystem_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 フィールドのセットです。有効なフィールドは classvendor、および 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 は、ユーザー固有のラベルを作成するためにカスタム機能ソースで処理するルールの一覧です。

デフォルト: empty

使用例

source:
  custom:
  - name: "my.custom.feature"
    matchOn:
    - loadedKMod: ["e1000e"]
    - pciId:
        class: ["0200"]
        vendor: ["8086"]

3.5. NFD トポロジーアップデータの使用

Node Feature Discovery (NFD) Topology Updater は、ワーカーノードに割り当てられたリソースを調べるデーモンです。これは、ゾーンごとに新規 Pod に割り当てることができるリソースに対応し、ゾーンを Non-Uniform Memory Access (NUMA) ノードにすることができます。NFD Topology Updater は、情報を nfd-master に伝達します。これにより、クラスター内のすべてのワーカーノードに対応するNodeResourceTopologyカスタムリソース (CR) が作成されます。NFD Topology Updater のインスタンスが 1 台、クラスターの各ノードで実行されます。

NFD で Topology Updater ワーカーを有効にするにはNode Feature Discovery Operator の使用のセクションで説明されているように、Node Feature Discovery CRtopologyupdater変数をtrueに設定します。

3.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

3.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フラグは、 -cert-fileフラグおよび `-key-file`フラグとともに、NFD トポロジーアップデータで相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、nfd-master の信頼性検証に使用する TLS ルート証明書を指定します。

デフォルト: empty

重要

-ca-fileフラグは、-cert-file-key-fileフラグと一緒に指定する必要があります。

$ 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 フラグは、 -ca-file-key-file flagsとともに、NFD トポロジーアップデータで相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、送信要求の認証時に提示する TLS 証明書を指定します。

デフォルト: empty

重要

-cert-file フラグは、 -ca-file-key-fileフラグと一緒に指定する必要があります。

$ 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フラグは、 -ca-file-cert-file フラグとともに、NFD Topology Updater で相互 TLS 認証を制御する 3 つのフラグの 1 つです。このフラグは、指定の証明書ファイルまたは-cert-fileに対応する秘密鍵 (送信要求の認証に使用) を指定します。

デフォルト: empty

重要

-key-fileフラグは、 -ca-file-cert-file フラグと一緒に指定する必要があります。

$ 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

$ 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

$ nfd-topology-updater -no-publish

3.5.2.1. -oneshot

-oneshotフラグを使用すると、リソースハードウェアトポロジーの検出が 1 回行われた後も、NFD Topology Updater が終了します。

デフォルト: false

$ nfd-topology-updater -oneshot -no-publish

-podresources-socket

-podresources-socketフラグは、kubelet が gRPC サービスをエクスポートして使用中の CPU とデバイスを検出できるようにし、それらのメタデータを提供する Unix ソケットへのパスを指定します。

デフォルト: /host-var/liblib/kubelet/pod-resources/kubelet.sock

$ nfd-topology-updater -podresources-socket=/var/lib/kubelet/pod-resources/kubelet.sock

-server

-serverフラグは、接続する nfd-master エンドポイントのアドレスを指定します。

デフォルト: localhost:8080

$ nfd-topology-updater -server=nfd-master.nfd.svc.cluster.local:443

-server-name-override

-server-name-overrideフラグは、nfd-master TLS 証明書から必要とされるコモンネーム (CN) を指定します。このフラグは、主に開発とデバッグを目的としています。

デフォルト: empty

$ nfd-topology-updater -server-name-override=localhost

-sleep-interval

-sleep-intervalフラグは、リソースハードウェアトポロジーの再検査とカスタムリソースの更新の間隔を指定します。正でない値は、スリープ間隔が無限であることを意味し、再検出は行われません。

デフォルト: 60s

$ nfd-topology-updater -sleep-interval=1h

-version

バージョンを出力して終了します。

-watch-namespace

-watch-namespaceフラグは namespace を指定して、指定された namespace で実行されている Pod に対してのみリソースハードウェアトポロジーの検査が行われるようにします。指定された namespace で実行されていない Pod は、リソースアカウンティングでは考慮されません。これは、テストとデバッグの目的で特に役立ちます。*値は、全 namespace に含まれるすべての Pod がアカウンティングプロセス中に考慮されることを意味します。

デフォルト: *

$ nfd-topology-updater -watch-namespace=rte

第4章 Kernel Module Management Operator

Kernel Module Management (KMM) Operator について、およびそれを使用して out-of-tree のカーネルモジュールとデバイスプラグインを OpenShift Container Platform クラスターにデプロイする方法について説明します。

4.1. Kernel Module Management Operator について

Kernel Module Management (KMM) Operator は、OpenShift Container Platform クラスター上の out-of-tree のカーネルモジュールとデバイスプラグインを管理、ビルド、署名、およびデプロイします。

KMM は、ツリー外のカーネルモジュールとそれに関連するデバイスプラグインを記述する新しい Module CRD を追加します。モジュール リソースを使用して、モジュールをロードする方法を設定し、カーネルバージョンの ModuleLoader イメージを定義し、特定のカーネルバージョンのモジュールをビルドして署名するための指示を含めることができます。

KMM は、任意のカーネルモジュールに対して一度に複数のカーネルバージョンに対応できるように設計されているため、ノードのシームレスなアップグレードとアプリケーションのダウンタイムの削減が可能になります。

4.2. Kernel Module Management Operator のインストール

クラスター管理者は、OpenShift CLI または Web コンソールを使用して Kernel Module Management (KMM) Operator をインストールできます。

KMM Operator は、OpenShift Container Platform 4.12 以降でサポートされています。バージョン 4.11 に KMM をインストールする場合、特に追加手順は必要ありません。KMM をバージョン 4.10 以前にインストールする方法の詳細は、「以前のバージョンの OpenShift Container Platform への Kernel Module Management Operator のインストール」セクションを参照してください。

4.2.1. Web コンソールを使用した Kernel Module Management Operator のインストール

クラスター管理者は、OpenShift Container Platform Web コンソールを使用して Kernel Module Management (KMM) Operator をインストールできます。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. Kernel Module Management Operator をインストールします。

    1. OpenShift Container Platform Web コンソールで、OperatorsOperatorHub をクリックします。
    2. 使用可能な Operator のリストから Kernel Module Management Operator を選択し、Install をクリックします。
    3. Install Operator ページで、Installation modeA specific namespace on the cluster として選択します。
    4. Installed Namespace リストから、openshift-kmm namespace を選択します。
    5. Install をクリックします。

検証

KMM Operator が正常にインストールされたことを確認するには、以下を実行します。

  1. OperatorsInstalled Operators ページに移動します。
  2. Kernel Module Management Operatoropenshift-kmm プロジェクトにリストされ、StatusInstallSucceeded であることを確認します。

    注記

    インストール時に、Operator は Failed ステータスを表示する可能性があります。インストールが後に InstallSucceeded メッセージを出して正常に実行される場合は、Failed メッセージを無視できます。

トラブルシューティング

  1. Operator のインストールに関する問題をトラブルシューティングするには、以下を実行します。

    1. OperatorsInstalled Operators ページに移動し、Operator Subscriptions および Install Plans タブで Status にエラーがあるかどうかを検査します。
    2. WorkloadsPods ページに移動し、openshift-kmm プロジェクトで Pod のログを確認します。

4.2.2. CLI を使用した Kernel Module Management Operator のインストール

クラスター管理者は、OpenShift CLI を使用して Kernel Module Management (KMM) Operator をインストールできます。

前提条件

  • OpenShift Container Platform クラスターが実行中である。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限があるユーザーとして OpenShift CLI にログインしている。

手順

  1. KMM を openshift-kmm namespace にインストールします。

    1. 次の Namespace CR を作成し、YAML ファイル (kmm-namespace.yaml など) を保存します。

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-kmm
    2. 次の OperatorGroup CR を作成し、YAML ファイル (kmm-op-group.yaml など) を保存します。

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: kernel-module-management
        namespace: openshift-kmm
    3. 次の Subscription CR を作成し、YAML ファイル (kmm-sub.yaml など) を保存します。

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: kernel-module-management
        namespace: openshift-kmm
      spec:
        channel: release-1.0
        installPlanApproval: Automatic
        name: kernel-module-management
        source: redhat-operators
        sourceNamespace: openshift-marketplace
        startingCSV: kernel-module-management.v1.0.0
    4. 以下のコマンドを実行して Subscription オブジェクトを作成します。

      $ oc create -f kmm-sub.yaml

検証

  • Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。

    $ oc get -n openshift-kmm deployments.apps kmm-operator-controller-manager

    出力例

    NAME                              READY UP-TO-DATE  AVAILABLE AGE
    kmm-operator-controller-manager   1/1   1           1         97s

    Operator は利用可能です。

4.2.3. 以前のバージョンの OpenShift Container Platform への Kernel Module Management Operator のインストール

KMM Operator は、OpenShift Container Platform 4.12 以降でサポートされています。バージョン 4.10 以前では、新しい SecurityContextConstraint オブジェクトを作成し、それを Operator の ServiceAccount にバインドする必要があります。クラスター管理者は、OpenShift CLI を使用して Kernel Module Management (KMM) Operator をインストールできます。

前提条件

  • OpenShift Container Platform クラスターが実行中である。
  • OpenShift CLI (oc) がインストールされている。
  • cluster-admin 権限があるユーザーとして OpenShift CLI にログインしている。

手順

  1. KMM を openshift-kmm namespace にインストールします。

    1. 次の Namespace CR を作成し、YAML ファイル (kmm-namespace.yaml ファイルなど) を保存します。

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-kmm
    2. 次の SecurityContextConstraint オブジェクトを作成し、YAML ファイル (kmm-security-constraint.yaml など) を保存します。

      allowHostDirVolumePlugin: false
      allowHostIPC: false
      allowHostNetwork: false
      allowHostPID: false
      allowHostPorts: false
      allowPrivilegeEscalation: false
      allowPrivilegedContainer: false
      allowedCapabilities:
        - NET_BIND_SERVICE
      apiVersion: security.openshift.io/v1
      defaultAddCapabilities: null
      fsGroup:
        type: MustRunAs
      groups: []
      kind: SecurityContextConstraints
      metadata:
        name: restricted-v2
      priority: null
      readOnlyRootFilesystem: false
      requiredDropCapabilities:
        - ALL
      runAsUser:
        type: MustRunAsRange
      seLinuxContext:
        type: MustRunAs
      seccompProfiles:
        - runtime/default
      supplementalGroups:
        type: RunAsAny
      users: []
      volumes:
        - configMap
        - downwardAPI
        - emptyDir
        - persistentVolumeClaim
        - projected
        - secret
    3. 次のコマンドを実行して、SecurityContextConstraint オブジェクトを Operator の ServiceAccount にバインドします。

      $ oc apply -f kmm-security-constraint.yaml
      $ oc adm policy add-scc-to-user kmm-security-constraint -z kmm-operator-controller-manager -n openshift-kmm
    4. 次の OperatorGroup CR を作成し、YAML ファイル (kmm-op-group.yaml など) を保存します。

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: kernel-module-management
        namespace: openshift-kmm
    5. 次の Subscription CR を作成し、YAML ファイル (kmm-sub.yaml など) を保存します。

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: kernel-module-management
        namespace: openshift-kmm
      spec:
        channel: release-1.0
        installPlanApproval: Automatic
        name: kernel-module-management
        source: redhat-operators
        sourceNamespace: openshift-marketplace
        startingCSV: kernel-module-management.v1.0.0
    6. 以下のコマンドを実行して Subscription オブジェクトを作成します。

      $ oc create -f kmm-sub.yaml

検証

  • Operator のデプロイメントが正常に行われたことを確認するには、次のコマンドを実行します。

    $ oc get -n openshift-kmm deployments.apps kmm-operator-controller-manager

    出力例

    NAME                              READY UP-TO-DATE  AVAILABLE AGE
    kmm-operator-controller-manager   1/1   1           1         97s

    Operator は利用可能です。