目录
- 前言
- 一、Node Exporter 监控k8s节点
- 二、监控coreDns服务
- 三、监控Ingress-nginx
- 四、监控k8s-state-metrics(重要)
- 五、修改Prometheus的configmap并重载Prometheus
- 六、Grafana展示监控的数据
- 七、问题总结
- 八、Kubernetes常见故障处理
-
- 问题1:Kubernetes集群服务访问失败?
- 问题2:Kubernetes集群服务访问失败?
- 问题3:Kubernetes集群服务暴露失败?
- 问题4:外网无法访问Kubernetes集群提供的服务?
- 问题5:Pod状态为ErrImagePull?
- 问题6:创建init C容器后,其状态不正常?
- 问题6:创建init C容器后,其状态不正常?
- 问题7:探测存活Pod状态为CrashLoopBackOff?
- 问题8:Pod创建失败?
- 问题9:Pod的ready状态未进入?
- 问题10:Pod创建失败?
- 问题11: kube-flannel-ds-amd64-ndsf7插件Pod的status为Init:0/1?
前言
此前已经在树莓派集群中部署k3s+node_exporter+Prometheus+Grafana进行集群的监测:
https://blog.csdn.net/weixin_39589455/article/details/125759769?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167324234616782425650741%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167324234616782425650741&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-2-125759769-null-null.blog_rank_default&utm_term=k3s&spm=1018.2226.3001.4450
本文钟,我们要实现通过Prometheus监控k8s集群中各种资源:如微服务,容器资源指标 并在Grafana显示
思路
-
可以通过外部prometheus通过连接apiserver去监控k8s集群内指标。(前提k8s集群内安装好相应的exports)
-
可以通过部署kube-prometheus(集群内部起了一套监控) 在通过联邦的方式,进行监控。
包括监控k8s节点、监控coreDns服务以及监控Ingress-nginx,但是本文侧重于监控k8s的指标
以下采用 外部prometheus监控cadvisor,kube-state-metrics来获取k8s集群指标资源
一、Node Exporter 监控k8s节点
安装node_exporter,我这边是采用的DaemonSet来确保每个节点都有对应的pod。创建node-export.yaml
如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitor
labels:
k8s-app: node-exporter
spec:
selector:
matchLabels:
k8s-app: node-exporter
template:
metadata:
labels:
k8s-app: node-exporter
spec:
hostPID: true #这几项是定义了该pod直接共享node的资源,这样也不需要用svc来暴露端口了
hostIPC: true
hostNetwork: true
containers:
- image: bitnami/node-exporter:latest
args:
- --web.listen-address=$(HOSTIP):9100
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --path.rootfs=/host/root
- --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+)($|/)
- --collector.filesystem.ignored-fs-types=^(autofs|binfmt_misc|cgroup|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$
name: node-exporter
env:
- name: HOSTIP
valueFrom:
fieldRef:
fieldPath: status.hostIP
resources:
requests:
cpu: 150m
memory: 180Mi
limits:
cpu: 150m
memory: 180Mi
securityContext:
runAsNonRoot: true
runAsUser: 65534
volumeMounts:
- name: proc # 我对应的卷都是用的hostPath,直接将宿主机卷挂给pod避免pod无法正常获取node信息
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: root
mountPath: /host/root
mountPropagation: HostToContainer
readOnly: true
ports:
- containerPort: 9100
protocol: TCP
name: http
tolerations: #这里是为了让pod能在master上运行,加了容忍度
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /
应用:
kubectl apply -f node-export.yaml
查看状态
kubectl get pod -n monitor
监控web端查看状况,可以看到它直接使用了宿主机的9100端口
ss -lntp |grep node_exporter
返回:
LISTEN 0 4096 10.10.21.170:9100 0.0.0.0:* users:(("node_exporter",pid=2597275,fd=3))
二、监控coreDns服务
coredns自身提供了/metrics接口,我们直接配置prometheus去它的9153拿数据即可
kubectl -n kube-system get svc
kubectl -n kube-system get cm
kubectl -n kube-system get cm coredns -o yaml
三、监控Ingress-nginx
ngress-nginx自身默认也提供了/metrics接口,但是需要我们先给他暴露10254端口,暴露之后我们直接配置prometheus去它的9153拿数据即可
暴露Ingress端口有多种方法,比如把对应deployment的网络模式改为hostNetwork,直接将node的10254给到Ingress
或者先在deployment中将端口加上,再去Ingress对应的svc里面将10254端口代理一下
这边我用的是第一种方式
kubectl -n ingress-nginx edit deployments.apps ingress-nginx-controller
需要改的地方有两处
kubectl -n ingress-nginx get deployments.apps ingress-nginx-controller -o yaml