仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

MicroK8sでPG-Stromコンテナを動かす

今回はMicroK8sでPG-Stromコンテナを動かしてみようと思います。 MicroK8sはこのブログで何度か取り上げたように、Kubernetesクラスターを簡単にセットアップすることができるツールです。

microk8s.io

PG-StromはPostgreSQLデータベースの拡張機能です。GPUやNVME-SSDなどを利用して、主にバッチおよび分析ワークロードを高速化することを目的としたソフトウェアです。

github.com

今回はMicroK8sでKubernetesを動かし、PodでGPUが使える環境をセットアップした上でPodでPG-Stromを動かしてみようと思います。

事前作業

OSを導入

今回はMicroK8sでGPUアドオンを使ってKubernetesとGPU周りの導入や設定を自動化するため、Ubuntuをホストにインストールします。GPUアドオンはNVIDIA GPU Operatorを内部的に利用しており、次のドキュメントによるとUbuntu 22.04でのMicroK8sをサポートすると書かれているため、今回はUbuntu 22.04を利用します。マイナーバージョンは特に記載がなかったため、その日時点で最新のUbuntu Server 22.04.2を導入しています。

GPUのドライバーを導入

今回はMicroK8sとMicroK8sのGPUアドオンを使って環境を作るため、事前に実行するノードにNVIDIA GPUを活用したGPUコンピューティングに必要なCUDA Driverのインストールが必要になります。

ホストでそのようなアプリケーションを実行するときはCUDAとCUDA Driverの導入が必要ですが、今回はアプリケーションはコンテナーの中で動かすことを前提としているのでCUDAをインストールする必要はありません。対応するCUDA Driverだけをインストールします。

DockerとNVIDIA Container Toolkitのインストール

コンテナアプリケーションのイメージを作成するためにDocker、コンテナーでGPUをアタッチして使えるようにするためにNVIDIA Container Toolkitのインストールを行います。

MicroK8sのインストール

MicroK8sを次にインストールします。OSの導入のところでご紹介したGPU Operatorのマトリックス表によると、MicroK8s 1.26でGPU Operatorの利用が可能になっています。

KubernetesのGPUオーケストレーションについては次にドキュメントが用意されています。長いこと開発用途でのみ利用という状況でしたが、このAPIはKubernetes 1.26でStableになりました。

というわけで、次のようにバージョン指定してMicroK8sをインストールします。インストール後に必要なことについてはMicroK8s Get started を参考にします。

sudo snap install microk8s --classic --channel=1.26/stable
sudo microk8s.start

アドオンの導入

次にアドオンの導入を行います。MicroK8sは名前が示すように、導入直後は最小限のKubernetesクラスターとして稼働します。必要な機能はアドオンとして簡単に追加できるようになっています。今回は次の3つをアドオンとして追加します。

sudo microk8s enable gpu registry hostpath-storage

GPUアドオンはNVIDIA GPU Operatorとその他必要なコンポーネントを追加するアドオン、RegistryはMicroK8sにローカルのイメージレジストリーを追加するアドオン、hostpath-storageはPodに永続ストレージをアタッチするためのアドオンです。hostpath-storageは簡単に導入できますが、あくまでシングルノードで動かした時に使えるアドオンです。複数のノードからなるクラスターでは利用できないため、その場合は他のソリューションを使う必要があります。

アドオンは追加するほどKubernetesクラスターに機能が追加されますが、追加するほどそれを利用するためのリソースも大きくなります。リソースにある程度制限があるハードウェアで動かす場合は注意してください。

PG-Strom イメージを作成

PG-Stromの実行にはCUDAとCUDA Driverが最低限必要です。CUDA Driverはホストに導入済みなので、CUDAをコンテナイメージに含める必要があります。

でも安心してください。コンテナでCUDAアプリケーション手軽に使えるようにするため、NVIDIAがCUDAイメージをオフィシャルで用意してくれています。

これを使ってPG-Stromを動かすためのコンテナイメージを作ってみます。 次のようなDockerfileを作ってみてください。

FROM docker.io/nvidia/cuda:12.0.1-devel-rockylinux8

RUN curl -LO https://heterodb.github.io/swdc/yum/rhel8-noarch/heterodb-swdc-1.2-1.el8.noarch.rpm && \
    curl -LO https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && \
    curl -LO https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

RUN rpm -i heterodb-swdc-1.2-1.el8.noarch.rpm && \
    rpm -i epel-release-latest-8.noarch.rpm && \
    rpm -i pgdg-redhat-repo-latest.noarch.rpm

RUN dnf -y module disable postgresql
RUN dnf install --enablerepo=powertools -y postgresql14-devel postgresql14-server postgresql-alternatives pg_strom-PG14

ENV PATH /usr/pgsql-14/bin:$PATH
ENV PGDATA /var/lib/pgsql/14/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA"
VOLUME /var/lib/pgsql/14/data

EXPOSE 5432

このDockerfileを使って、イメージを作成します。

sudo docker image build --compress -t mypg14-rocky8:test1 -f Dockerfile .

PG-Strom イメージをレジストリーに登録

前の手順によりDockerにビルドしたイメージが登録されたので、DockerやDocker Composeを使ってこのイメージでPG-Stromを動かすことができるようになりましたが、現在のMicroK8sはcontainerdを標準のランタイムとして使っています。以前はMicroK8sのランタイムをDockerに切り替えるオプションとかがあったのですが、現在はありません。

従って、Dockerに存在するイメージをMicroK8sクラスターで利用できるように保管する必要があります。でも安心してください。先ほどアドオンとしてregistryを追加しました。これでMicroK8s上にローカルレジストリーが追加されたので、ここに登録すればOKです。次のように実行します。

sudo docker tag mypg14-rocky8:test1 localhost:32000/mypg14-rocky8:test1 
sudo docker push localhost:32000/mypg14-rocky8:test1 

registryアドオンはデフォルトで20GBまでのイメージを格納できます。20GBじゃ作ったイメージを格納できないよという場合は次を確認してください。できれば少しイメージを小さくする努力をしましょう。

PG-Strom Podを作成

ここまでできたらあとは次のようなマニフェストを作成してPodを作成するだけで、KubeenetesでPG-Stromが動かせます。 あれ、PersistentVolumeClaimってなんですかと思った方にざっくり説明するとPodに永続ストレージを提供するためのものです。このガイドに従ってhostpath-storageアドオンを追加さえしていれば利用可能になっています。

Pod作成後はkubectl execでPodのシェルに入って、設定していきます。設定方法などについては以下をご覧ください。

$ psql -U postgres
psql (14.8)
Type "help" for help.

postgres=# CREATE EXTENSION pg_strom;
CREATE EXTENSION

本記事の内容は次でも確認できます。