Kubernetes上のnode.jsアプリケーションでメモリーリークをしている可能性があったので、Heapdumpを取って解析をすることにしました。
どのようにKubernetes上のnode.jsアプリケーションのHeapdumpを取得したか紹介したいと思います。
Deploymentの変更
実際にある程度のロードがある状態でHeapdumpを取りたかったので、すでにデプロイされているDeploymentを少し変更して、そこからHeapdumpを取ることにしました。
本来はPodでNode.jsがスタートするように設定しますが、スタートのパラメータを変更したいので、一時的に
kubectl -n mynodejs edit deployment mynodejs
で以下のようにtail -f /dev/null
とかしてPodはスタートしてもNode.jsはスタートしないようにします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mynodejs
namespace: mynodejs
labels:
app: mynodejs
spec:
replicas: 1
selector:
matchLabels:
app: mynodejs
template:
metadata:
labels:
app: mynodejs
spec:
containers:
- name: mynodejs
image: mynodejs:1.2.3
command: ["/bin/bash", "-c"]
args:
- tail -f /dev/null
これでNode.jsのPodをデプロイして、自動的に開始されないようにできました。何かの都合でデバッグ中にNode.jsが止まってもPod自体は動き続けるので、再度Node.jsをスタートしてデバッグでき便利です。
Node.jsのスタートパラメータの変更
次にPod内のNode.jsにパラメータをつけてスタートします。
kubectl -n mynodejs exec mynodejs-1bw5d-1234 -it -- /bin/sh
node --inspect main.js
これによりデバッガーをアッタッチできるようになります。デフォルトで9229のポートを使っています。
Podのポート9299でデバッガーをアッタッチできる状態になりました。
ポート転送
次にポート転送を行ってデバッガーでHeapdumpを採取します。
kubectl -n mynodejs port-forward mynodejs-1bw5d-1234 9999:9229
Forwarding from 127.0.0.1:9999 -> 9229
Forwarding from [::1]:9999 -> 9229
この例ですとLocal hostの9999からNode.jsの9229に転送されます
Chrome DevTools
次にChrome DevToolsをつかってポート転送されたデータを採取します。
Chromeでchrome://inspect
を開き
ここでinspect
をクリックすると、デバッガーをアッタッチできます。