0


K8S篇之实现利用Prometheus监控pod的实时数据指标

一、监控部署
1、将k8s集群中kube-state-metrics指标进行收集,服务进行部署
1.1 pod性能指标(k8s集群组件自动集成)
k8s组件本身提供组件自身运行的监控指标以及容器相关的监控指标。通过cAdvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,集成到 Kubelet中,当Kubelet启动时会同时启动cAdvisor,且一个cAdvisor只监控一个Node节点的信息。cAdvisor 自动查找所有在其所在节点上的容器,自动采集 CPU、内存、文件系统和网络使用的统计信息。cAdvisor 通过它所在节点机的 Root 容器,采集并分析该节点机的全面使用情况。
当然kubelet也会输出一些监控指标数据,因此pod的监控数据有kubelet和cadvisor,监控url分别为
https://NodeIP:10250/metrics
https://NodeIP:10250/metrics/cadvisor
1.2 K8S资源监控(k8s集群内部署)
kube-state-metrics是一个简单的服务,它监听Kubernetes API服务器并生成关联对象的指标。它不关注单个Kubernetes组件的运行状况,而是关注内部各种对象(如deployment、node、pod等)的运行状况。
注:先手动检查下集群,是否已经安装kube-state-metrics
在这里插入图片描述
如果集群没有安装,可参考如下步骤进行部署:

  1. docker pull gcr.io/google_containers/kube-state-metrics:v1.6.0// 镜像打标签,设置为当前k8s配置的镜像仓库地址
  2. docker tag quay.io/coreos/kube-state-metrics:v1.9.0 dockerhub.kubekey.local/library/kube-state-metrics:v1.9.0// 推进仓库
  3. docker push dockerhub.kubekey.local/library/kube-state-metrics:v1.9.0

1.3 编辑kube-state-metrics.yml文件

  1. vim kube-state-metrics.yml
  1. ---
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. labels:
  6. app: kube-state-metrics
  7. name: kube-state-metrics
  8. namespace: prometheus
  9. ---
  10. apiVersion: rbac.authorization.k8s.io/v1
  11. kind: ClusterRole
  12. metadata:
  13. name: kube-state-metrics
  14. rules:- apiGroups:[""]
  15. resources:- configmaps
  16. - secrets
  17. - nodes
  18. - pods
  19. - services
  20. - resourcequotas
  21. - replicationcontrollers
  22. - limitranges
  23. - persistentvolumeclaims
  24. - persistentvolumes
  25. - namespaces
  26. - endpoints
  27. verbs:["list","watch"]- apiGroups:["extensions"]
  28. resources:- daemonsets
  29. - deployments
  30. - replicasets
  31. - ingresses
  32. verbs:["list","watch"]- apiGroups:["apps"]
  33. resources:- daemonsets
  34. - deployments
  35. - replicasets
  36. - statefulsets
  37. verbs:["list","watch"]- apiGroups:["batch"]
  38. resources:- cronjobs
  39. - jobs
  40. verbs:["list","watch"]- apiGroups:["autoscaling"]
  41. resources:- horizontalpodautoscalers
  42. verbs:["list","watch"]- apiGroups:["policy"]
  43. resources:- poddisruptionbudgets
  44. verbs:["list","watch"]- apiGroups:["certificates.k8s.io"]
  45. resources:- certificatesigningrequests
  46. verbs:["list","watch"]- apiGroups:["storage.k8s.io"]
  47. resources:- storageclasses
  48. verbs:["list","watch"]- apiGroups:["autoscaling.k8s.io"]
  49. resources:- verticalpodautoscalers
  50. verbs:["list","watch"]---
  51. apiVersion: rbac.authorization.k8s.io/v1
  52. kind: ClusterRoleBinding
  53. metadata:
  54. labels:
  55. app: kube-state-metrics
  56. name: kube-state-metrics
  57. roleRef:
  58. apiGroup: rbac.authorization.k8s.io
  59. kind: ClusterRole
  60. name: kube-state-metrics
  61. subjects:- kind: ServiceAccount
  62. name: kube-state-metrics
  63. namespace: prometheus
  64. ---#apiVersion: extensions/v1beta1
  65. apiVersion: apps/v1
  66. kind: Deployment
  67. metadata:
  68. labels:
  69. app: kube-state-metrics
  70. name: kube-state-metrics
  71. namespace: prometheus
  72. spec:
  73. replicas:1
  74. selector:
  75. matchLabels:
  76. app: kube-state-metrics
  77. strategy:
  78. rollingUpdate:
  79. maxSurge:1
  80. maxUnavailable:0type: RollingUpdate
  81. template:
  82. metadata:
  83. labels:
  84. app: kube-state-metrics
  85. spec:
  86. containers:# 注意,这里image地址修改为你k8s配置的仓库地址- image: dockerhub.kubekey.local/library/kube-state-metrics:v1.9.0
  87. imagePullPolicy: IfNotPresent
  88. livenessProbe:
  89. failureThreshold:3
  90. httpGet:
  91. path:/
  92. port:8080
  93. scheme: HTTP
  94. initialDelaySeconds:30
  95. periodSeconds:10
  96. successThreshold:1
  97. timeoutSeconds:30
  98. name: kube-state-metrics
  99. ports:- containerPort:8080
  100. protocol: TCP
  101. readinessProbe:
  102. failureThreshold:3
  103. httpGet:
  104. path:/
  105. port:8080
  106. scheme: HTTP
  107. initialDelaySeconds:30
  108. periodSeconds:10
  109. successThreshold:1
  110. timeoutSeconds:5
  111. resources:
  112. limits:
  113. cpu: 500m
  114. memory: 768Mi
  115. requests:
  116. cpu: 250m
  117. memory: 768Mi
  118. restartPolicy: Always
  119. serviceAccount: kube-state-metrics
  120. serviceAccountName: kube-state-metrics
  121. ---
  122. apiVersion: v1
  123. kind: Service
  124. metadata:
  125. labels:
  126. app: kube-state-metrics
  127. name: kube-state-metrics
  128. namespace: prometheus
  129. spec:
  130. ports:- name: kube-state-metrics
  131. port:80
  132. protocol: TCP
  133. targetPort:8080
  134. selector:
  135. app: kube-state-metrics
  136. ## 注意这里kube-state-metrics暴露类型修改为NodePort对外暴露type: NodePort

1.4 启动yaml文件

  1. kubectl apply-f kube-state-metrics.yaml

在这里插入图片描述
1.5 查看pod信息

  1. kubectl get pod -n prometheus

在这里插入图片描述
1.6 查看service信息

  1. kubectl get svc -n prometheus

在这里插入图片描述
这里可以看到k8s集群对外暴露的端口为 62177
1.7 查看集群信息

  1. kubectl get po -n prometheus -owide

在这里插入图片描述
然后查看metrics信息
可以手动

  1. curl k8s02:62177/metrics

正常,数据metrics就会出现
在这里插入图片描述
二、创建token供集群外部访问
集群外部监控K8s集群,通过访问kube-apiserver来访问集群资源。通过这种方式集群外部prometheus也能自动发现k8s集群服务

  1. # 1.创建serviceaccounts
  2. kubectl create sa prometheus -n default
  3. # 2.创建prometheus角色并对其绑定cluster-admin
  4. kubectl create clusterrolebinding prometheus --clusterrole cluster-admin --serviceaccount=default:prometheus
  5. # 3. 创建secret; k8s1.24之后默认不会为serveiceaccounts创建secret
  6. kubectl apply-f -<<EOF
  7. apiVersion: v1
  8. kind: Secret
  9. type: kubernetes.io/service-account-token
  10. metadata:
  11. name: prometheus-token
  12. namespace: default
  13. annotations:
  14. kubernetes.io/service-account.name:"prometheus"
  15. EOF
  16. # 4. 测试访问kube-apiserver
  17. APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
  18. TOKEN=$(kubectl get secret prometheus-token -n default -o jsonpath='{.data.token}'| base64 --decode)
  19. curl $APISERVER/api --header "Authorization: Bearer $TOKEN"--insecure
  20. # 5. 保存token
  21. echo $TOKEN > k8s_token
  22. # 6. 测试访问指标# 访问pod性能资源指标:(访问kubelet)# 注意:master1为当前master节点的hostname,需要修改
  23. curl $APISERVER/api/v1/nodes/master1:10250/proxy/metrics --header "Authorization: Bearer $TOKEN"--insecure

三、集成Prometheus配置

  1. vim prometheus.yml
  1. scrape_configs:- job_name:"k8s-cadvisor"
  2. honor_timestamps: true
  3. metrics_path:/metrics
  4. scheme: https
  5. kubernetes_sd_configs:- api_server: https://10.142.155.202:6443
  6. role: node
  7. bearer_token_file:/prometheus/data/k8s_token
  8. tls_config:
  9. insecure_skip_verify: true
  10. bearer_token_file:/prometheus/data/k8s_token
  11. tls_config:
  12. insecure_skip_verify: true
  13. relabel_configs:- action: labelmap
  14. regex: __meta_kubernetes_node_label_(.+)- separator:;
  15. regex:(.*)
  16. target_label: __address__
  17. replacement:10.142.155.202:6443
  18. action: replace
  19. - source_labels:[__meta_kubernetes_node_name]
  20. separator:;
  21. regex:(.+)
  22. target_label: __metrics_path__
  23. replacement:/api/v1/nodes/${1}:10250/proxy/metrics/cadvisor
  24. action: replace
  25. - job_name:"kube-node-kubelet"
  26. scheme: https
  27. tls_config:
  28. insecure_skip_verify: true
  29. bearer_token_file:/prometheus/data/k8s_token
  30. kubernetes_sd_configs:- role: node
  31. api_server:"https://10.142.155.202:6443"// 修改为对应的k8s master的节点
  32. tls_config:
  33. insecure_skip_verify: true
  34. bearer_token_file:/prometheus/data/k8s_token
  35. relabel_configs:- target_label: __address__
  36. replacement:10.142.155.202:6443- source_labels:[__meta_kubernetes_node_name]
  37. regex:(.+)
  38. target_label: __metrics_path__
  39. replacement:/api/v1/nodes/${1}:10250/proxy/metrics
  40. - action: labelmap
  41. regex: __meta_kubernetes_service_label_(.+)- source_labels:[__meta_kubernetes_namespace]
  42. action: replace
  43. target_label: kubernetes_namespace
  44. - source_labels:[__meta_kubernetes_service_name]
  45. action: replace
  46. target_label: service_name

注意:bearer_token_file: /prometheus/data/k8s_token
这里的token为上面生成的token信息,请根据目录进行配置即可

然后重启prometheus
如果是容器部署的prometheus,需要考虑映射token,可docker cp到/prometheus/data/ 即可
即可

  1. docker restart prometheus

3、进入prometheus界面,查看相关指标
默认情况下 prometheus url: http://IP:9090
在这里插入图片描述
4、集成grafana
导入grafana JSON ID, 747
4.1、导入node信息指标
在这里插入图片描述
load 即可
在这里插入图片描述
4.2、导入pod信息指标
JSON ID:15760
在这里插入图片描述
大盘信息即可完全展示~


本文转载自: https://blog.csdn.net/xu710263124/article/details/134448120
版权归原作者 听说唐僧不吃肉 所有, 如有侵权,请联系我们删除。

“K8S篇之实现利用Prometheus监控pod的实时数据指标”的评论:

还没有评论