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は以下のようになります。

FROM ubuntu:18.04

RUN set -x \
    && apt update \
    && apt install --no-install-recommends --no-install-suggests -y curl gnupg1 apt-transport-https ca-certificates \
    && curl -O https://nginx.org/keys/nginx_signing.key \
    && apt-key add nginx_signing.key \
    && echo "deb https://packages.nginx.org/unit/ubuntu/ bionic unit" >> /etc/apt/sources.list.d/unit.list \
    && echo "deb-src https://packages.nginx.org/unit/ubuntu/ bionic unit" >> /etc/apt/sources.list.d/unit.list \
    && apt update \
    && apt install --no-install-recommends --no-install-suggests -y unit unit-php php7.2-mysql \
    && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/unit.list
    
RUN set -x \
    && ln -sf /dev/stdout /var/log/unit.log

STOPSIGNAL SIGTERM

CMD ["unitd", "--no-daemon", "--control", "unix:/var/run/control.unit.sock"]

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

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

$ docker build -t easydoggie/adminer .

作成した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の設定を変更したい場合は、このデータ部分を修正してください。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Chart.Name }}-nginx-conf
data:
  default.conf: |-
    upstream unit_backend {
       server 127.0.0.1:{{ .Values.appServer.port }};
    }
    
    server {
        listen       {{ .Values.service.port }};
        server_name  localhost;
        
        location /index.html {
            return 200;
        }
            
        location / {
            proxy_pass http://unit_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Prefix "/adminer";
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
    }

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

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Chart.Name }}-conf
data:
  unit.conf.json: |-
    {
      "listeners": {
        "*:{{ .Values.appServer.port }}": {
          "pass": "applications/adminer"
        }
      },  
      "applications": {
        "adminer": {
          "type": "php",
          "processes": 2,
          "root": "/app/adminer",
          "index": "adminer.php",
          "limits": {
              "timeout": 30,
              "requests": 1000
          }
        }
      },
      "settings": {
          "http": {
              "header_read_timeout": 30,
              "body_read_timeout": 30,
              "send_timeout": 30,
              "idle_timeout": 120,
              "max_body_size": 6291456
          }
      },
    }

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

deployment.yaml

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

lifecycle:
  postStart:
    exec: 
      command:
        - sh
        - -c
        - "curl -Lo /app/adminer/adminer.php https://github.com/vrana/adminer/releases/download/v4.7.1/adminer-4.7.1.php \
        && while [ ! -e /var/run/control.unit.sock ]; do sleep 1; done \
        && curl -X PUT --data-binary @/tmp/unit/unit.conf.json --unix-socket /var/run/control.unit.sock http://localhost/config"

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は以下のリポジトリにおいてあります。このリポジトリを利用する場合は、初めにリポジトリの登録をおこなってください。

$ helm repo add easydoggie https://easydoggie.github.io/helm-repo/releases

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

$ helm install --name adminer easydoggie/adminer

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

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

さいごに

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

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

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

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

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

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。