共计 2576 个字符,预计需要花费 7 分钟才能阅读完成。
对于小规模集群,因为数据量不大,kube-state-metrics 能够应用 deploy 部署 1 个 replica,失常提供 metrics 的采集和拉取。
对于大规模集群,因为 pod/deploy 等资源对象较多,仅通过一个 kube-state-metrics 实例来提供 metrics 还是十分吃力的,可能会导致 pod 宕机,频繁重启。
这种状况下,kube-state-metrics 提供了分片机制,也就是部署多个 kube-state-metrics Pod,让每个 Pod 负责一部分数据的采集。
一. 手动分片
kube-state-metrics 的启动参数中,提供了 shard 参数:
# kube-state-metrics -h
kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects.
Usage:
kube-state-metrics [flags]
kube-state-metrics [command]
Available Commands:
completion Generate completion script for kube-state-metrics.
help Help about any command
version Print version information.
Flags:
--shard int32 The instances shard nominal (zero indexed) within the total number of shards. (default 0)
--total-shards int The total number of shards. Sharding is disabled when total shards is set to 1. (default 1)
...
分片是通过对 kubernetes 资源对象的 uid 计算 md5,而后 % total_shards 失去 shard,每个 kube-state-metrics 仅负责采集本人的 shard。
这种分片形式,须要手动指定 shard 和 total-shards,不够灵便,不举荐。
二. 主动分片
主动分片通过 statefulset 部署多个正本的 kube-state-metrics,启用主动分片的办法:
- 以 statefulset 部署 kube-state-metrics;
- kube-state-metrics 的启动参数,传入 –pod 和 –pod-namespace;
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: kube-state-metrics
namespace: kube-system
spec:
replicas: 2
template:
spec:
containers:
- args:
- --pod=$(POD_NAME)
- --pod-namespace=$(POD_NAMESPACE)
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0
......
传入 –pod 和 –namespace 参数后,kube-state-metrics 过程会主动进行分片采集,它会通过 client-go 检测 statefulset 有几个 replicas,而后主动给 replicas 进行分片:
func (m *MetricsHandler) Run(ctx context.Context) error {autoSharding := len(m.opts.Pod) > 0 && len(m.opts.Namespace) > 0 // 主动分片
ss, err := detectStatefulSet(m.kubeClient, m.opts.Pod, m.opts.Namespace) // pod 所属的 statefulset
…
shard, totalShards, err := shardingSettingsFromStatefulSet(ss, m.opts.Pod) // 对 statefulset 的 replica 分片
...
}
当然,应用主动分片也是有毛病的,因为 statefulset 的滚动降级策略是一个一个的替换 pod,导致降级的速度较慢,可能会导致每个分片呈现短暂的宕机。
三. 针对 pod 的按节点分片
针对大规模集群中 pod 资源较多,kube-state-metrics 采集的 pod 指标量较大的状况,能够独自针对 pod 的指标进行分片:
- 分片的办法是按 node 调配,也就是部署 daemonset,每个节点部署一个 replica,而后每个 replica 仅负责采集本人所在 node 的 pod 指标;
-
kube-state-metrics 启动参数指定:
- –resources=pod:仅采集 pod 的指标;
- –node=${NODE_NAME}:仅采集本节点的 pod 指标;
apiVersion: apps/v1
kind: DaemonSet
spec:
template:
spec:
containers:
- image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.7.0
name: kube-state-metrics
args:
- --resource=pods
- --node=$(NODE_NAME)
env:
- name: NODE_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
这种形式是针对 pod 指标做的分片办法,也天然就采集不到其它指标了,比方 kube_deploy_*、kube_configmap_* 等。
参考
1. 官网 doc: https://github.com/kubernetes…
2. 指标信息:https://github.com/kubernetes…