相关地址

组件说明

1.MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等。
2.PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。
3.NodeExporter:用于各node的关键度量指标状态数据。
4.KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。
5.Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。
6.Grafana:是可视化数据统计和监控平台。

构建记录

  1. $ git clone https://github.com/coreos/kube-prometheus.git
  2. $ cd kube-prometheus/manifests

修改 grafana-service.yaml 文件

默认使用的访问方式是 ClusterIP ,修改为 NodePode 方式访问

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: grafana
  5. namespace: monitoring
  6. spec:
  7. type: NodePort #添加内容
  8. ports:
  9. - name: http
  10. port: 3000
  11. targetPort: http
  12. nodePort: 30100 #添加内容
  13. selector:
  14. app: grafana

修改 prometheus-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. prometheus: k8s
  6. name: prometheus-k8s
  7. namespace: monitoring
  8. spec:
  9. type: NodePort #添加内容
  10. ports:
  11. - name: web
  12. port: 9090
  13. targetPort: web
  14. nodePort: 30200 #添加内容
  15. selector:
  16. app: prometheus
  17. prometheus: k8s

修改 alertmanager-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. alertmanager: main
  6. name: alertmanager-main
  7. namespace: monitoring
  8. spec:
  9. type: NodePort #添加内容
  10. ports:
  11. - name: web
  12. port: 9093
  13. targetPort: web
  14. nodePort: 30300 #添加内容
  15. selector:
  16. alertmanager: main
  17. app: alertmanager

替换镜像地址

quay.io -> quay.azk8s.cn

  1. $ sed -i "s/quay.io/quay.azk8s.cn/g" `grep quay.io -rl ./kube-prometheus/manifests/`

初始化

  1. $ kubectl apply -f manifests/setup/
  2. namespace/monitoring created
  3. customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
  4. customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
  5. customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
  6. customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
  7. customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
  8. clusterrole.rbac.authorization.k8s.io/prometheus-operator created
  9. clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator created
  10. deployment.apps/prometheus-operator created
  11. service/prometheus-operator created
  12. serviceaccount/prometheus-operator created
  13. $ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
  14. No resources found.
  15. $ kubectl apply -f manifests/
  16. alertmanager.monitoring.coreos.com/main created
  17. secret/alertmanager-main created
  18. service/alertmanager-main created
  19. ...
  20. servicemonitor.monitoring.coreos.com/kube-controller-manager created
  21. servicemonitor.monitoring.coreos.com/kube-scheduler created
  22. servicemonitor.monitoring.coreos.com/kubelet created
  23. $ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
  24. NAMESPACE NAME AGE
  25. monitoring alertmanager 47s
  26. monitoring coredns 45s
  27. monitoring grafana 46s
  28. monitoring kube-apiserver 45s
  29. monitoring kube-controller-manager 45s
  30. monitoring kube-scheduler 45s
  31. monitoring kube-state-metrics 46s
  32. monitoring kubelet 45s
  33. monitoring node-exporter 46s
  34. monitoring prometheus 45s
  35. monitoring prometheus-operator 45s

pull镜像比较慢!!! 经过漫长的等待,终于启动成功了!!!

查看 pod 状态

**

  1. $ kubectl get pod -n monitoring
  2. NAME READY STATUS RESTARTS AGE
  3. alertmanager-main-0 2/2 Running 0 10m
  4. alertmanager-main-1 2/2 Running 0 10m
  5. alertmanager-main-2 2/2 Running 0 10m
  6. grafana-77978cbbdc-577hl 1/1 Running 0 10m
  7. kube-state-metrics-85957fb76d-whzt6 3/3 Running 0 10m
  8. node-exporter-l878g 2/2 Running 0 10m
  9. node-exporter-r4knd 2/2 Running 0 10m
  10. node-exporter-wq5nd 2/2 Running 0 10m
  11. prometheus-adapter-859b94658d-b82jr 1/1 Running 0 10m
  12. prometheus-k8s-0 3/3 Running 1 10m
  13. prometheus-k8s-1 3/3 Running 0 10m
  14. prometheus-operator-5748cc95dd-g8fxl 1/1 Running 0 14m

安装成功后,支持 top 命令查看资源状态

  1. $ kubectl top node
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. k8s-master01 1900m 47% 1548Mi 19%
  4. k8s-node01 1885m 47% 1952Mi 24%
  5. k8s-node02 2016m 50% 2328Mi 29%
  6. $ kubectl top pod
  7. NAME CPU(cores) MEMORY(bytes)
  8. kafka-0 7m 277Mi
  9. kafka-1 8m 468Mi
  10. kafka-2 7m 280Mi
  11. zookeeper-0 2m 162Mi
  12. zookeeper-1 2m 175Mi
  13. zookeeper-2 3m 225Mi

访问 Prometheus

访问

prometheus 对应的 NodePort 端口为 30200 ,访问:http://MasterIP:30200/

image.png

image.png

查看 Targets 连接状态

访问地址:http://MasterIP:30200/targets 可以看到 prometheus 已经成功连接上 k8s 的apiserver

image.png

查看 Service Discovery

访问地址:http://MasterIP:30200/metrics

image.png

查看自己的指标

访问地址:http://MasterIP:30200/metrics

image.png

查询解析器

访问地址:http://MasterIP:30200/graph

输入查询语句:

  1. sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

image.png

image.png

上述的查询有出现数据,说明 node-exporterprometheus 中写入数据正常,接下来我们就可以部署 grafana 组件,实现更友好的 webui 展示数据了

访问 Grafana

查看 grafana 服务暴露的端口号

  1. $ kubectl get service -n monitoring | grep grafana
  2. grafana NodePort 10.106.235.215 <none> 3000:30100/TCP 53m

访问

访问地址:http://MasterIP:30100 默认账号 用户名:admin 密 码:admin

image.png

修改密码并登陆

image.png

添加数据源

添加数据源 grafana 默认已经添加了 Prometheus 数据源,grafana 支持多种时序数据源,每种数据源都有各自的查询编辑器

image.png

配置数据源,使用默认填写的信息进行 Test

image.png

Dashboard 中导入模板

image.png

查看监控面板

image.png

Horizontal Pod Autoscaling

Horizontal Pod Autoscaling 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量

  1. $ kubectl run php-apache --image=gcr.io/google_containers/hpa-example \
  2. --requests=cpu=200m --expose --port=80

创建 HPA 控制器 - 相关算法的详情请参阅 这篇文档

  1. $ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

增加负载,查看负载节点数目

  1. $ kubectl run -i --tty load-generator --image=busybox /bin/sh
  2. $ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

资源限制 - Pod

Kubernetes 对资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup

默认情况下,Pod 运行没有 CPU 和内存的限额。 这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样,消耗足够多的 CPU 和内存 。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过 resources 的 requests 和 limits 来实现

  1. spec:
  2. containers:
  3. - image: xxxx
  4. imagePullPolicy: Always
  5. name: auth
  6. ports:
  7. - containerPort: 8080
  8. protocol: TCP
  9. resources:
  10. limits:
  11. cpu: "4"
  12. memory: 2Gi
  13. requests:
  14. cpu: 250m
  15. memory: 250Mi


requests 要分分配的资源,limits 为最高请求的资源值。可以简单理解为初始值和最大值

资源限制 - 名称空间

Ⅰ、计算资源配额

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: compute-resources
  5. namespace: spark-cluster
  6. spec:
  7. hard:
  8. pods: "20"
  9. requests.cpu: "20"
  10. requests.memory: 100Gi
  11. limits.cpu: "40"
  12. limits.memory: 200Gi

Ⅱ、配置对象数量配额限制

  1. apiVersion: v1
  2. kind: ResourceQuota
  3. metadata:
  4. name: object-counts
  5. namespace: spark-cluster
  6. spec:
  7. hard:
  8. configmaps: "10"
  9. persistentvolumeclaims: "4"
  10. replicationcontrollers: "20"
  11. secrets: "10"
  12. services: "10"
  13. services.loadbalancers: "2"

Ⅲ、配置 CPU 和 内存 LimitRange

  1. apiVersion: v1
  2. kind: LimitRange
  3. metadata:
  4. name: mem-limit-range
  5. spec:
  6. limits:
  7. - default:
  8. memory: 50Gi
  9. cpu: 5
  10. defaultRequest:
  11. memory: 1Gi
  12. cpu: 1
  13. type: Container
  • default 即 limit 的值
  • defaultRequest 即 request 的值