相关地址

组件说明

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-exporter 往 prometheus 中写入数据正常,接下来我们就可以部署 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 的值