Kubernetes 1.12 以前使用 Heapster 做集群监控,以提供数据给 kubectl top 命令以及 kubernetes-dashboard 的 Web UI 查看。Heapster 默认使用 InfluxDB,而 InfluxDB 默认设置的 retention policy 是七天一个 shard,无限保留,使用内存索引,所以时间久了后 InfluxDB 会消耗接近 10GB 内存。

InfluxDB 这个 default retention policy 无法在环境变量和配置文件里修改,只能在 CRETE DATABASE WITH DURATION m REPLICATION 1 SHARD DURATION n 或者创建数据库后用 ALTER RETENTION POLICY autogen ON db DURATION m REPLICATION 1 SHARD DURATION n修改。其员工 Michael Desa 在 stackoverflow 上解释了下:

Unfortunately there is no way to set the default retention policy via the configuration. The reason for this is that typically retention policy duration is defined during database creation.

If users were allowed to set a default retention duration via the configuration, the results of the command CREATE DATABASE mydb would vary from instance to instance. While this isn’t necessarily problematic, it isn’t ideal either.

个人觉得这个解释很牵强,可以类似 InfluxDB 的 Graphite listener 那样,提供多个环境变量比如 INFLUXDB_RETENTION_POLICY_<db>_<policy>="DURATION 30d REPLICATION 1 SHARD DURATION 30m" 这样配置嘛,其中 INFLUXDB_RETENTION_POLICY_DEFAULT 是特殊的默认设置。

不过不管怎样,不改代码的话只能事后去修改 RETENTION POLICY 了:

# kubectl exec -it 进入一个带 curl 命令的 pod

curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=alter retention policy default on k8s duration 1d replication 1 shard duration 30m'

curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=alter retention policy monitor on _internal duration 1d replication 1 shard duration 30m'


curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=show retention policies on k8s'

curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=show retention policies on _internal'

curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=show shards'

# 这里 N 是 shard id,可以从上一条命令中解析得到并批量处理
curl -s monitoring-influxdb.kube-system:8086/query?pretty=true --data-urlencode 'q=drop shard N'

# 然后 kubectl exec -it 进入 kube-system namespace 的 monitoring-influxdb-xxxxx 容器
# 执行 kill 1 让 pod 重启

# 使用上面的 show shards 和 show retention polices 命令查看生效与否,这是为了避免 K8S 把
# influxdb 调度到另外一台机器上,重新初始化了 /data/ 目录。

除此之外,还可以 kubectl edit -n kube-system deploy/monitoring-influxdb 加几个环境变量以限制 InfluxDB 的资源消耗:

GOMAXPROCS=2
INFLUXDB_DATA_INDEX_VERSION=tsi1
INFLUXDB_DATA_MAX_CONCURRENT_COMPACTIONS=1