3.3. Special Resource Operator の使用
Special Resource Operator(SRO) は、ドライバーコンテナーのビルドおよびデプロイメント管理に使用されます。コンテナーのビルドおよびデプロイに必要なオブジェクトは Helm チャートに定義できます。
このセクションの例では、simple-kmod SpecialResource オブジェクトを使用して、Helm チャートを格納するために作成された ConfigMap オブジェクトをポイントしています。
3.3.1. 設定マップを使用した simple-kmod SpecialResource のビルドおよび実行 リンクのコピーリンクがクリップボードにコピーされました!
この例では、simple-kmod カーネルモジュールを使用して、SRO が設定マップに保存されている Helm チャートテンプレートで定義されているドライバーコンテナーを管理する方法を示しています。
前提条件
- OpenShift Container Platform クラスターが実行中である。
-
クラスターのイメージレジストリー Operator の状態を
Managedに設定します。 -
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限があるユーザーとして OpenShift CLI にログインしている。 - Node Feature Discovery(NFD)Operator がインストールされている。
- Special Resource Operator がインストールされている。
-
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 テンプレートを
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 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}}"chart/simple-kmod-0.0.1ディレクトリーに移動します。$ cd ..チャートに関する以下の 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
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設定マップを作成して、チャートファイルを保存します。
設定マップファイルのディレクトリーを作成します。
$ mkdir cmHelm チャートを
cmディレクトリーにコピーします。$ cp simple-kmod-0.0.1.tgz cm/simple-kmod-0.0.1.tgzHelm チャートが含まれる Helm リポジトリーを指定してインデックスファイルを作成します。
$ helm repo index cm --url=cm://simple-kmod/simple-kmod-chartHelm チャートで定義されるオブジェクトの namespace を作成します。
$ 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 チャートにより simple-kmod オブジェクトをデプロイします。この YAML をsimple-kmod-configmap.yamlとして保存します。apiVersion: sro.openshift.io/v1beta1 kind: SpecialResource metadata: name: simple-kmod spec: #debug: true1 namespace: simple-kmod chart: name: simple-kmod version: 0.0.1 repository: name: example url: cm://simple-kmod/simple-kmod-chart2 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.yamlsimple-kmodリソースは、オブジェクトマニフェストで指定されたsimple-kmodnamespace にデプロイされます。しばらくすると、simple-kmodドライバーコンテナーのビルド Pod の実行が開始されます。ビルドは数分後に完了し、ドライバーコンテナー 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 get podsコマンドから取得したビルド Pod 名と共にoc logsコマンドを使用して、simple-kmod ドライバーコンテナーイメージビルドのログを表示します。$ oc logs pod/simple-kmod-driver-build-12813789169ac0ee-1-build -n simple-kmodsimple-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
ノードから simple-kmod カーネルモジュールを削除する場合は、oc delete コマンドを使用して simple-kmod SpecialResource API オブジェクトを削除します。カーネルモジュールは、ドライバーコンテナー Pod が削除されるとアンロードされます。