概述
Kube-state-metrics轮询kubernetes API获取metrics,不做任何的更改。因此稳定性和kubernetes API是一致的,但是这也意味着在某些情况下Kube-state-metrics提供的值可能与kubectl提供的不一样,因为前者提供的是未经任何修改的原始数据,而后者 kubectl提供启发式可理解的数据。
- The metrics are exported on the HTTP endpoint /metrics on the listening port (default 8080).
- kube-state-metrics exposes its own general process metrics under --telemetry-host and --telemetry-port (default 8081).
对kube-state-metrics资源的限制
对于超过100节点,每个节点至少30个pods的集群至少分配:
200MiB memory 0.1 cores
2MiB memory per node
0.001 cores per node
主要镜像
官方推荐使用quay.io仓库
- quay.io/coreos/kube-state-metrics:v1.9.5
- k8s.gcr.io/kube-state-metrics:v1.9.5
kube-state-metrics自身的metrics
代表获取metrics成功、失败的次数和总的次数,可以用来计算成功率失败率。
- kube_state_metrics_list_total{resource="*v1.Node",result=“success”} 1
- kube_state_metrics_list_total{resource="*v1.Node",result=“error”} 52
- kube_state_metrics_watch_total{resource="*v1beta1.Ingress",result=“success”} 1
SetUp
在 $GOPATH中install这个项目
go get k8s.io/kube-state-metrics
在kube-state-metrics目录下运行:
make container
Kubernetes Deployment
部署kube-state-metrics,最简单的是直接运行
kubectl apply -f examples/standard
这样一个 K8s service 和 deployment就会被创建,如果想让Prometheus发现Kube-state-metrics,可以创建一个专门的Prometheus scrape 配置。
有限特权环境
如果运行在没有集群读取权限的环境中,可以创建一个
- serviceaccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: kube-state-metrics
namespace: your-namespace-where-kube-state-metrics-will-deployed
- 使用roleBinding赋予其view权限
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kube-state-metrics
namespace: project1
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: view
subjects:
- kind: ServiceAccount
name: kube-state-metrics
namespace: your-namespace-where-kube-state-metrics-will-deployed
- 然后指定一组名称空间(使用–namespace选项)和一组kubernetes对象(使用–resources)
spec:
template:
spec:
containers:
- name: kube-state-metrics
args:
- '--resources=pods'
- '--namespace=project1'
配置collectors
kubectl可以配置开启哪些collectors,甚至可以精确开启哪些metrics。主要配置以下三项:
- –metric-allowlist string Comma-separated list of metrics to be exposed. This list comprises of exact metric names and/or regex patterns. The allowlist and denylist are mutually exclusive.
- –metric-denylist string Comma-separated list of metrics not to be enabled. This list comprises of exact metric names and/or regex patterns. The allowlist and denylist are mutually exclusive.
- –collectors string Comma-separated list of collectors to be enabled.
配置文件中设置开启nodes,pods的collectors
spec:
template:
spec:
containers:
- args:
- '--telemetry-port=8081'
- '--kubeconfig=<KUBE-CONFIG>'
- '--apiserver=<APISERVER>'
- '--collectors="nodes,pods"'
默认的collectors:
- certificatesigningrequests:用于请求由指定的签名者签名证书,然后在最终签名之前,可以批准或拒绝该请求。
- configmaps:configmap是k8s的一个配置管理组件,可以将配置以key-value的形式传递,通常用来保存不需要加密的配置信息,加密信息则需用到Secret
- cronjobs:Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。而CronJob则就是在Job上加上了时间调度。
- daemonsets:确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本。如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入Node上运行。删除一个DaemonSet也会级联删除所有其创建的Pod。
- deployments:为Pod和Replica Set提供声明式更新。
- endpoints:动态存储pod名字与pod ip对应关系的list,并提供将请求转发到实际pod上的能力
- horizontalpodautoscalers:让service中的Pod个数自动调整
- ingresses:入口,负责统一管理外部对k8s cluster中service的请求。(k8s现在提供三种暴露服务的方式:LoadBlancer、NodePort 、Ingress。)
- jobs:Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
- limitranges:区分的粒度是container,则是在为了在同一个namespace下,限制container的最大最小值。
- persistentvolumeclaims:PVC代表了用户对PV资源的请求。用户需要使用PV资源时,只需要创建一个PVC对象(包括指定使用何种存储资源,使用多少GB,以何种模式使用PV等信息),Kubernetes会自动为我们分配我们所需的PV。
- persistentvolumes:群集中的一块存储区域
- poddisruptionbudgets:终止pod前 通过labelSelector机制获取正常运行的pod数目的限制,目的是对主动驱逐的保护措施。
- resourcequotas:Resource Quota区分的粒度是namespace,其目的是为了不同namespace之间的公平,防止某些流氓team占用了太多的资源。
- secrets:Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec
中。 - storageclasses:通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了。
- pods
- replicasets
- replicationcontrollers
- services
- statefulsets
- namespaces
- nodes
通过配置开启哪些collectors,可以明显减少收集到的数据量
开启所有collectors时的数据量:
只开启nodes的collectors时的数据量:
可以看到数据量明显减少。