对于小规模集群,因为数据量不大,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 -hkube-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/v1kind: StatefulSetmetadata:  name: kube-state-metrics  namespace: kube-systemspec:  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/v1kind: DaemonSetspec:  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...