検索

3.3. Special Resource Operator の使用

download PDF

Special Resource Operator(SRO) は、ドライバーコンテナーのビルドおよびデプロイメント管理に使用されます。コンテナーのビルドおよびデプロイに必要なオブジェクトは Helm チャートに定義できます。

このセクションの例では、simple-kmod SpecialResource オブジェクトを使用して、Helm チャートを格納するために作成された ConfigMap オブジェクトをポイントしています。

3.3.1. 設定マップを使用した simple-kmod SpecialResource のビルドおよび実行

この例では、simple-kmod カーネルモジュールは、Special Resource Operator (SRO) がドライバーコンテナーを管理する方法を示しています。コンテナーは、設定マップに保存されている Helm チャートテンプレートで定義されます。

前提条件

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

手順

  1. simple-kmod SpecialResource オブジェクトを作成するには、イメージをビルドするイメージストリームおよびビルド設定を定義し、コンテナーを実行するサービスアカウント、ロール、ロールバインディング、およびデーモンセットを定義します。カーネルモジュールを読み込めるように、特権付きセキュリティーコンテキストでデーモンセットを実行するにはサービスアカウント、ロール、およびロールバインディングが必要です。

    1. templates ディレクトリーを作成して、このディレクトリーに移動します。

      $ mkdir -p chart/simple-kmod-0.0.1/templates
      $ cd chart/simple-kmod-0.0.1/templates
    2. イメージストリームおよびビルド設定の YAML テンプレートを 0000-buildconfig.yaml として templates ディレクトリーに保存します。

      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
      1 2 3 4 5
      {{.Values.specialresource.metadata.name}} などのテンプレートは、SpecialResource CR のフィールドおよび {{.Values.KernelFullVersion}} などの Operator に認識される変数に基づいて SRO により入力されます。
    3. RBAC リソースおよびデーモンセットの以下の YAML テンプレートを 1000-driver-container.yaml として templates ディレクトリーに保存します。

      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}}"
    4. chart/simple-kmod-0.0.1 ディレクトリーに移動します。

      $ cd ..
    5. チャートに関する以下の YAML を Chart.yaml として chart/simple-kmod-0.0.1 ディレクトリーに保存します。

      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
  2. chart ディレクトリーから、helm package コマンドを使用してチャートを作成します。

    $ 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

  3. 設定マップを作成して、チャートファイルを保存します。

    1. 設定マップファイルのディレクトリーを作成します。

      $ mkdir cm
    2. Helm チャートを cm ディレクトリーにコピーします。

      $ cp simple-kmod-0.0.1.tgz cm/simple-kmod-0.0.1.tgz
    3. Helm チャートが含まれる Helm リポジトリーを指定してインデックスファイルを作成します。

      $ helm repo index cm --url=cm://simple-kmod/simple-kmod-chart
    4. Helm チャートで定義されるオブジェクトの namespace を作成します。

      $ oc create namespace simple-kmod
    5. 設定マップオブジェクトを作成します。

      $ oc create cm simple-kmod-chart --from-file=cm/index.yaml --from-file=cm/simple-kmod-0.0.1.tgz -n simple-kmod
  4. 以下の SpecialResource マニフェストを使用して、設定マップで作成した Helm チャートにより 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"
    1
    オプション:#debug: true 行のコメントを解除して、チャートに YAML ファイルを Operator ログに完全に出力し、ログが作成され、適切にテンプレート化されていることを確認します。
    2
    spec.chart.repository.url フィールドは SRO に対して設定マップでチャートを検索するように指示します。
  5. コマンドラインで、SpecialResource ファイルを作成します。

    $ oc create -f simple-kmod-configmap.yaml
注記

ノードから simple-kmod カーネルモジュールを削除する場合は、oc delete コマンドを使用して simple-kmod SpecialResource API オブジェクトを削除します。カーネルモジュールは、ドライバーコンテナー Pod が削除されるとアンロードされます。

検証

simple-kmod リソースは、オブジェクトマニフェストで指定された simple-kmod namespace にデプロイされます。しばらくすると、simple-kmod ドライバーコンテナーのビルド Pod の実行が開始されます。ビルドは数分後に完了し、ドライバーコンテナー Pod の実行が開始されます。

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

  2. 上記の oc get pods コマンドから取得したビルド Pod 名と共に oc logs コマンドを使用して、simple-kmod ドライバーコンテナーイメージビルドのログを表示します。

    $ oc logs pod/simple-kmod-driver-build-12813789169ac0ee-1-build -n simple-kmod
  3. 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 メトリックから、デプロイされているさまざまなオブジェクトのステータスに関する情報が分かるので、SROCR インストールのトラブルシューティングに役立ちます。SRO には、環境の正常性監視に使用できる他のタイプのメトリックも含まれます。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.