現象
Ruby on RailsとpostgresそれぞれをDockerコンテナ上で動かしているシステムについて、それまで問題なかったのに、ある日突然リモートからpostgresにSSH接続できなくなった。
それどころか、アプリを動かしているコンテナからの接続も
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
このありさま。
ただ、アプリは生きていて、postgresのローカルホストからは特に問題が見受けられない。
さらに
・postgresの接続情報は適切か?
・ファイアウォールルールは適切か?
これらは問題ないことを確認した。
現象は、どうも新規の接続を受けなくなっている状態らしい。
しかもpostgresよりももっと低レイヤの部分で。
つまり、OS(GCPのDebian7.0系)より低レイヤな部分に問題があるようだ。
ここで、正常に動作しているステージング環境とのpodの状態比較を行ってみることにした。
$ kubectl describe pod "ステージング環境"
Name: ステージング環境のpostgresのpod
~中略~
Status: Running
~中略~
Conditions:
Type Status
Ready True
$ kubectl describe pod "問題環境"
Name: 問題環境のpostgresのpod
~中略~
Status: Running
~中略~
Conditions:
Type Status
Ready False
StatusはRunning(正常に起動している状態)で、ConditionsがFalseになっている問題環境。
とりあえず、何が原因かは不明だが(本当はクライアントログとサーバーログ辿るべきなんだけど)、緊急なのでこの壊れているpodを物理環境のバックアップから復旧することにした。
やったこと
物理環境自体は何の問題もないので、この状態でスナップショットを取得して、そこから再度ディスクを作成して、rcを作り直した。
元通り正常動作するようになった。
まとめ
kubernetesでDBのpodがRunning状態のままReadyがFalseになった。
するとDBへの新規リモート接続はできなくなったのに、アプリはDB接続できて正常動作したままという状態に陥った。
気持ち悪いのでその状態の物理環境だけバックアップとって復旧したら元通りに戻った。
復旧は大した手間じゃないけど、ずっとまともに動いていたものがある日突然自分の管理下にない環境(IaaS)下で壊れるのって気持ち悪い。
この問題の原因知ってる人いたら教えて頂けると嬉しいです。