今回はMicroK8sでPG-Stromコンテナを動かしてみようと思います。 MicroK8sはこのブログで何度か取り上げたように、Kubernetesクラスターを簡単にセットアップすることができるツールです。
PG-StromはPostgreSQLデータベースの拡張機能です。GPUやNVME-SSDなどを利用して、主にバッチおよび分析ワークロードを高速化することを目的としたソフトウェアです。
今回は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
本記事の内容は次でも確認できます。