はじめに
こんにちは〜nayaaaaです。
最近、Kubernetesの学習しており、学習の際にKubernetes環境でWordppressの構築を行なっていたのですが、以下のようにデータベースの接続エラーが発生してしまいました。
解決までに意外に時間がかかってしまったので、エラー解決までに行なったことと原因について記事にしてみました。
環境情報
Pod構成
WordPress Pod
コンテナ:
nginx
php
MySQL Pod
コンテナ:
mysql
使用しているDockerイメージ
nginx: 1.27.3-alpine
php: 8.3-fpm-alpine
mysql: 8.0.28
対処
まずはデータベースの接続エラーということで、MySQL Podのerror.logを確認してみたのですが、何もログは吐かれていませんでした。
その際に私が原因としてぱっと浮かんだのが以下の点でした。
- wp-config.phpの設定に誤りがある。
- データベースの設定が正しく行われていない(権限が足りない、スキーマ情報が作成されていないなど)。
- secrets.ymlファイルから変数の値を取得できていない(変数の呼び出しにsecretを使用)。
ファイルへのアクセス権限が設定されていない、またはそもそもPodが動作していないなど。
ということで一つずつ確認してみました。
まず、wp-config.phpの設定についてなのですが、secrets.ymlファイルから変数を呼び出す形で値を設定しており、本当に値を取得できているのか以下の通り確認しました。
kubectl describe secret {secret名} -n {名前空間名}
mysql-secret -n dev-techbull-k8s
Name: mysql-secret
Namespace: dev-techbull-k8s
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
MYSQL_PASSWORD: 8 bytes
MYSQL_ROOT_PASSWORD: 8 bytes
MYSQL_USER: 7 bytes
MYSQL_DATABASE: 7 bytes
root@DESKTOP-SR0ND96:/mnt/c/Users/PC_User/Desktop/menta/Kubernetes#
ちゃんと出力されており、変数が登録されていそうでした。
データベースの設定についても、今回作成したユーザでログインが可能なのを確認し、データベースの作成、アクセス権限が付与されているのを確認して特に問題はございませんでした。
ファイルのアクセス権限については644
でファイルが設定されていたため、基本的には読み取り動作に影響はないはず。podについてもステータスを確認するとrunning
表示となっており異常なし。
どうしても解決ができなかったので、同コミュニティに所属しているエンジニア
仲間の方に助けを求めました。
確認できたこと
・mysqlのスキーマ情報については正しく設定されている。
・変数の取得については正しく取得できており、設定ファイルにも誤りはなさそう。
・Pod間の通信も正常に行われている。
実際にWordpress Pod内部からnslookupとpingで確認した結果↓
wordpress-7d5cdcc5d9-78gf6:/# nslookup mysql
Server: 10.96.0.10
Address: 10.96.0.10:53
** server can't find mysql.cluster.local: NXDOMAIN
** server can't find mysql.svc.cluster.local: NXDOMAIN
Name: mysql.dev-techbull-k8s.svc.cluster.local
Address: 10.1.0.79
** server can't find mysql.cluster.local: NXDOMAIN
** server can't find mysql.svc.cluster.local: NXDOMAIN
wordpress-7d5cdcc5d9-78gf6:/# ping mysql
PING mysql (10.1.0.79): 56 data bytes
64 bytes from 10.1.0.79: seq=0 ttl=64 time=0.518 ms
64 bytes from 10.1.0.79: seq=1 ttl=64 time=0.296 ms
64 bytes from 10.1.0.79: seq=2 ttl=64 time=0.279 ms
64 bytes from 10.1.0.79: seq=3 ttl=64 time=0.104 ms
64 bytes from 10.1.0.79: seq=4 ttl=64 time=0.307 ms
名前解決、ping疎通ともに問題なし。
結局その日は結局解決することはできずに諦めて就寝。
翌朝、wp-config.phpのファイルを見直していたらDB_HOST
の値がlocalhost
となっており、これか!ということでlocalhostからmysqlへの通信に変更いたしました。
修正前 define( 'DB_HOST', 'localhost' );
修正後 define( 'DB_HOST', 'mysql' );
すると、ちゃんと接続ができました。
今まで、1つのサーバにnginx、php、mysqlを導入し、Wordpressを構築していたのでlocalhost
で設定しており、
その際の設定ファイルを使い回していたので確認していなかったのですが、
今回は、WordPress Pod (nginx、php)、MySQL Pod(mysql)という2つのサービス実行環境(Pod)で動作しており、Pod内はlocalhost
での通信が可能ですが、異なるPod同士だと異なるIPアドレス
なのでwp-config.phpでlocalhostを指定してもmysqlに接続できないということが原因でした。
原因とは直接関係ないのですが、確認の際に以下のようにport
も開いているかどうかを確認するべきでしたね。
wordpress-7d5cdcc5d9-78gf6:/# nc -zv mysql 3306 mysql
(10.1.0.79:3306) open
まとめ
個人的にKubernetesは勉強してて楽しいなと思いますね。
Kubernetesは機能が多く、勉強すればするだけ自分の力になっている感覚とやりがいがあるのでモチベーションに繋がりますね。
次はKubernetesを学習した際によく使用したコマンドなどを自分なりにまとめて記事にしたいと思います。
あと、ファイルを使いまわす際はちゃんと確認するようにします....
では、ありがとうございました〜