Hashicorp VaultのバックエンドにConsulを利用していて、メモリが過剰に利用されていた
Kubernetesの証明書管理などでVaultのPKIエンジンを利用している。PKIエンジンはかんたんに言うと、証明書の発行管理を自動化してくれるもので、ConsulTemplateと組み合わせることで、短命な証明書をローテーションしつつ、任意のTLS通信などを実現することができる。
今僕が管理しているペパボのマネージドサービス、「owada」では、Vaultを提供しており、そのストレージバックエンドはConsulを利用している。
ある時からConsulのメモリが以上に利用されており、僕が観測した最大値は32Gくらい利用されていた。Vaultを利用していたことから、原因はVaultだろうとすぐに分かったので調べてみた。調査方法は公式のドキュメントが詳しい。
僕の環境で調べてみると
# curl -s http://xxxxx/v1/kv/vault/logical/\?keys | jq . | awk -F"/" '{print $3}' | sort | uniq -c | sort -nr
5870066 some uuid
34848 some uuid
600万近くの証明書のデータが有ることがわかり、中身を見てみると
% openssl x509 -text -noout -fingerprint -in /tmp/sample.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
xxxxxxxxxxxxxxxxxxxx
Signature Algorithm: xxxxxxxxxxxxx
Issuer: CN = example.com
Validity
Not Before: Feb 11 21:03:20 2021 GMT
Not After : Feb 12 21:03:50 2021 GMT
このように期限切れの証明書が残っていることがわかった。つまり、失効した証明書は何かしらの操作をしないと消えない。削除用のAPIは準備されている。
https://www.vaultproject.io/api/secret/pki#tidy
僕は雑に下記のコードで削除を試みました。
vault read /sys/mounts |grep type:pki |awk '{ print $1 }' | while read line
do
vault write $line/tidy tidy_cert_store=true tidy_revoked_certs=true
done
僕はデータを溜め込みすぎていたのでそれなりに過負荷になり、時間もかかりましたが無事データの整理ができ、その後Consulを再起動することで、メモリ使用量を減らすことができました。
同じようにVaultを運用されているかたで、削除をしていない人は、Consulの状況を一度チェックしておくと良さそうです。