データベースの管理にどのようなツールを利用していますか?よく使われているのは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は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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イメージを作成します。タグ名はご利用の環境やプロジェクトに合わせて、変更をしてください。
1 |
$ 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の設定を変更したい場合は、このデータ部分を修正してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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内で定義しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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部分の抜粋です。
1 2 3 4 5 6 7 8 9 |
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は以下のリポジトリにおいてあります。このリポジトリを利用する場合は、初めにリポジトリの登録をおこなってください。
1 |
$ helm repo add easydoggie https://easydoggie.github.io/helm-repo/releases |
リポジトリの登録の完了後、以下のコマンドでkubernetes上にAdminerのインストールを行うことができます。
1 |
$ 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でも公開しているので、参考にしてください。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?