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は準備されている。

僕は雑に下記のコードで削除を試みました。

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の状況を一度チェックしておくと良さそうです。