Kubenetes上のMy SQLが起動できなくなった。
Podを再生成して、すぐにエラーになってしまう。
最悪なことにエラーログも出ておらず 原因がわからない。
原因調査
手で動かして確認するのがいいんだけど、
起動すらしないのでどうしたものかと悩んでしまった。
どうにかする方法がないかとぐぐると
Kubenetes MySQLのPod(Yaml)ファイル 内にcommandを定義することで、
MySQLのDockerのCMD※を上書きできることがわかった。
※コンテナ起動時にデフォルトで実行するコマンド
MySQLのDockerファイル
CMDでmysqldコマンド(mysqlデーモン起動コマンド)を記載
ENTRYPOINT [ \ "prehook", \ "add-server-id.sh", \ "--", \ "/entrypoint.sh" \ ] CMD ["mysqld"]
Kubenetes MySQL Podファイル
commandを追加して、コンテナ起動時にはシェルを動かして待機するようにした。
template: metadata: labels: app: mysql-master spec: terminationGracePeriodSeconds: 600 containers: - name: mysql image: XXXXXXXX imagePullPolicy: Always command: ["/bin/sh"] args: ["-c", "sleep 600 && cat /var/log/mysql/mysql-error.log > /dev/termination-log"]
コンテナにログイン
kubctlコマンドでPodを再デプロイ→コンテナにログイン
コンテナに入れるようになった
#kubectl delete -f mysql-master.yaml #kubectl apply -f mysql-master.yaml #kubectl get pods NAME READY STATUS RESTARTS AGE mysql-master-0 1/1 Running 0 9m #kubectl exec --stdin --tty mysql-master-0 -- /bin/bash root@mysql-master-0:/#
原因判明
MySQL起動コマンドを打ってみるが反応なし ログフォルダを確認してみるとmysql-error.log が出力されていた
root@mysql-master-0:/# mysqld root@mysql-master-0:/# cd /var/log/mysql root@mysql-master-0:/var/log/mysql# ls mysql-bin.index mysql-error.log
mysql-error.logを確認するとスペースがないとログが出ていた。
root@mysql-master-0:/var/log/mysql# cat mysql-error.log . . 2023-02-09T06:23:33.696585+09:00 0 [ERROR] [MY-012640] [InnoDB] Error number 28 means 'No space left on device'
df コマンドを打ってみると/var/lib/mysqlが100%になっていることがわかった。 KubenetesのPersistant Volumeの容量を使い切ってしまっていた。
root@mysql-master-0:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 95G 43G 52G 46% / tmpfs 64M 0 64M 0% /dev tmpfs 16G 0 16G 0% /sys/fs/cgroup shm 64M 0 64M 0% /dev/shm /dev/sda1 95G 43G 52G 46% /etc/hosts /dev/sdp 3.9G 3.9G 288K 100% /var/lib/mysql tmpfs 6.0G 12K 6.0G 1% /run/secrets/kubernetes.io/serviceaccount tmpfs 16G 0 16G 0% /proc/acpi tmpfs 16G 0 16G 0% /proc/scsi tmpfs 16G 0 16G 0% /sys/firmware
解決
Persistant Volumeにパッチを当てて、容量を拡張
# kubenetes % kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE ramentweet-log-pv-claim Pending okteto-standard 203d ramentweet-mysql-pv-claim Bound pvc-3a245f8b-1f10-48e8-b4ed-35673dc49beb 4Gi RWO okteto-standard 404d # kubectl get pv Error from server (Forbidden): persistentvolumes is forbidden: User "system:serviceaccount:okteto:d54deb2f-213a-4b07-98d6-e4aaad41815b" cannot list resource "persistentvolumes" in API group "" at the cluster scope # kubectl patch pvc ramentweet-mysql-pv-claim -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\": \"10Gi\"}}}}" persistentvolumeclaim/ramentweet-mysql-pv-claim patched
MySQL Podを再生成するとエラーにならず起動するようになった!
#kubectl delete -f mysql-master.yaml #kubectl apply -f mysql-master.yaml