Adminerでデータベース管理 – KubernetesにAdminerをインストールしてみよう –

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データベースの管理にどのようなツールを利用していますか?よく使われているのはphpMyAdminでしょうか?phpMyAdminに代わるデータベース管理ツールとして、Adminer(https://www.adminer.org/)があります。Adminerは1つのPHPファイルだけで構成されているので、インストールや設定が非常に簡単にできます。

しかし、Kubernetes上など、コンテナ管理のプラットフォーム上にAdminerをインストールしたい場合は、どのようにしたらよいのでしょうか。本記事では、AdminaerをKubernetes上にHelmでインストールする方法をご紹介します。

Adminerとは?

AdminerはphpMyAdminとおなじPHP上で動作するWebUIのデータベース管理ツールです。

  • MySQL以外にもPostgreSQLやOracleにも対応している。
  • 1つのPHPファイルだけで構成されていて、サイズも小さい。
  • 1つのPHPファイルを置くだけで、設定はいらない。

phpMyAdminと比較して、機能やパフォーマンス、セキュリティなどに大きな違いがあります。少し古いデータですが、phpMyAdminとAdminerの機能を比較した資料(https://www.adminer.org/en/phpmyadmin/)が公開されています。phpMyAdminのパフォーマンスに不満を持っているのであれば、Adminerを検討してみてはいかがでしょうか?

Adminerのインストールは簡単です。Adminerは1つのPHPだけで構成されています。既存のPHPが動作するWebサーバがあれば、Adminerをダウンロードして、Webサーバに配置するだけでインストールは完了です。

公式でDockerイメージ(https://hub.docker.com/_/adminer)も提供されているので、コンテナとして動作させることもできます。本記事では、公式のDockerイメージは利用しないで、独自のDockerイメージを利用してKubernetes上にインストールします。

KubernetesにAdminerをインストールする

インストール構成

フロントのWebサーバとしてNginx、バックエンドのAP(PHP)サーバとしてNginx Unitを利用する構成です。Nginx、Nginx Unitを1つのPODとして動作させます。構成のイメージ図は以下の通りです。

今回の記事では、LoadBalancer(Ingress)の部分は説明していません。外部からのアクセスでIngressを利用する場合は、利用するのKubernetes環境に合わせて設定を行ってください。

Dockerfileを作る

Adminerは公式のDockerイメージが提供されています。今回はNginx Unit上でAdminerを動かしたいので、Nginx UnitのDockerイメージが必要になります。Nginx Unitも公式のDockerイメージが提供されていますが、PDOなどのデータベース接続モジュールがインストールされていません。このため、独自のDockerfileを作ることにします。Dockerfileの基本的な内容は、Nginx Unitのインストール手順(http://unit.nginx.org/installation/)に従っています。作ったDockerfileは以下のようになります。

DockerファイルはGit Hubでも公開しているので、参考にしてください。

Dockerファイルを作成したら、DockerのビルドコマンドでDockerイメージを作成します。タグ名はご利用の環境やプロジェクトに合わせて、変更をしてください。

作成したDockerイメージはDocker Hubでも配布しているので、参考にしてください。

HelmのChartを作る

作成したDockerイメージをKubernetesにインストールするためのHelm Chartを作成します。ここではHelm Chartの概要と構成のポイントを説明します。作成したすべてのHelm ChartはGitHubで公開しているので参考にしてください。

Helmをインストールしていない場合は、HelmクライアントとHelmサーバ(Tiller)のインストールが必要です。Helmのインストールと設定が終わっていない場合は、Helmのインストールと設定を先に完了させておいてください。Helmのインストールと設定方法は、別のブログ記事を参考にしてください。

configmap.yaml

NginxおよびNginx Unitの設定ファイルを定義しています。

configmap/{{ チャート名 }}-adminer-nginx-confとして定義されたデータはNginxのdefault.confにマッピングされます。Nginxの設定を変更したい場合は、このデータ部分を修正してください。

この例ではプレフィックスとして/adminerのパス(例: http://localhost/adminer)でAdminerにアクセスしてくる想定となっています。プレフィックスなしや異なるプレフィックスでアクセスさせる場合は、proxy_set_headerの部分をご利用の環境に合わせて修正してください。

configmap/{{ チャート名 }}-adminer-confはNginx Unit用の設定ファイルです。Nginx Unitはこのファイルの内容をAPIにPUTすることで設定を動的に反映させます。Nginx UnitのAPIへのPUT処理は、次に説明するdeployment.yaml内で定義しています。

取得するデータ量が多いなど、タイムアウトが発生する場合はtimeoutの値などを変更してください。

deployment.yaml

Nginx Unitの設定は従来のファイルベースの設定とは異なり、APIにPUTすることで設定を動的に反映させます。APIへのPUTはKubernetesのライフサイクルにおけるpostStartを利用しておこなっています。以下は、deployment.yamlファイルのlifecycle部分の抜粋です。

postStartでコンテナが作成された後に実行するコマンドを定義していきます。

はじめにAdminerのファイルを公式ページからダウンロードしています。次のwhileループでNginx Unitのソケットファイルを確認し、Nginx Unitの起動まで待機させています。これは、コンテナのEntrypointの実行前にpostStartが実行される保証がないからです(参考リンク)。

PostStart

This hook executes immediately after a container is created. However, there is no guarantee that the hook will execute before the container ENTRYPOINT. No parameters are passed to the handler.

このため、Nginx Unit(Entrypoint)が実行されたかの確認を行うためにソケットの存在確認を行っています。ソケットファイルが存在した場合、そのソケットに対してNginx Unitの設定内容をPUTし、設定を反映させます。

deployment.yamlの全内容は、GitHub上のファイルを参照してください。

HelmでAdminerをインストールする

Helm Chartの準備ができたら、helm installコマンドでadminerをKubernetes上にインストールします。Helm Chartは以下のリポジトリにおいてあります。このリポジトリを利用する場合は、初めにリポジトリの登録をおこなってください。

リポジトリの登録の完了後、以下のコマンドでkubernetes上にAdminerのインストールを行うことができます。

デプロイ後にWebブラウザからアクセスし、以下の画面が表示されればインストールは成功です。

サーバにはデータベースへ接続するKubernetesのService名などを指定してください。

さいごに

本記事では、AdminerをKubernetes上にHelmでインストールする方法を紹介しました。Adminerはインストールや設定が非常に簡単で、軽量であるため、phpMyAdminの代替として十分な力を発揮してくれます。ぜひAdminerを試してみてください。

また、Adminerを動かすAPサーバとして、Nginx Unitを利用したインストール例を紹介しました。今回の設定例はNginx UnitをKubernetes上で動かす例としても利用できます。Nginx Unitの設定や動作事例は少ないですが、多言語対応を単一の設定で動作できるので、コンテナとの相性がよさそうです。

なお、今回作成したコードはGitHubでも公開しているので、参考にしてください。

スカイアーチ ファンタジー研究室

スカイアーチ ファンタジー研究室

投稿者プロフィール

スカイブロガー

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


Time limit is exhausted. Please reload CAPTCHA.