环境
Ubuntu 22.04
k8s kubernetes 1.29
kube-prometheus 0.14.0
calico 3.29
kuboard v3
本地运维、生产网段:192.168.120.0/24
描述
使用 kube-prometheus 部署时,社区建议使用 jsonnet (以编程的形式编辑 json)自定义生成 yaml 或 json 文件,初学者可不考虑,直接修改已有 yaml 文件。
本地加速IP:192.168.120.2:10809
若无加速IP,请更换相关 url 以及组件源,如:Docker相关url,apt 源,容器源
步骤操作执行条件:已成功部署 K8S,Calico,Kuboard,IngressNginxController,已配置相关组件加速
若未部署或不清楚,请查阅:
Kube-Prometheus 相关组件
Prometheus Operator:自动管理 Prometheus 和 Alertmanager 实例,简化 Kubernetes 中的部署和配置。
Prometheus:收集和存储指标的核心,它根据来自 Kubernetes 服务的定义指标抓取时间序列数据。
Alertmanager:管理和路由来自 Prometheus 的警报,支持复杂的规则和多种通知渠道。
Node Exporter:从集群节点收集硬件和操作系统指标。
Kube State Metrics:生成有关各种 Kubernetes 对象状态的指标。
Grafana:提供可视化功能,与 Prometheus 集成以获得详细的监控仪表板。
ServiceMonitor 和 PodMonitor:用于监控服务或 Pod 组的自定义资源定义 (CRD)。
步骤
安装配置 kube-prometheus
apt install -y unzip
wget -O kp.zip https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.zip
unzip kp.zip
cd kube-prometheus-*
修改以下三个文件:
manifests/grafana-networkPolicy.yaml
manifests/prometheus-networkPolicy.yaml
manifests/alertmanager-networkPolicy.yaml
向其中插入以下内容,得到如下部分显示:
grafana-networkPolicy.yaml
...
spec:
egress:
- {}
ingress:
- from:
- podSelector:
matchLabels:
app.kubernetes.io/name: prometheus
# 插入
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
- ipBlock:
cidr: 192.168.120.0/24
# 结束
ports:
- port: 3000
protocol: TCP
...
prometheus-networkPolicy.yaml
...
spec:
egress:
- {}
ingress:
- from:
- podSelector:
matchLabels:
app.kubernetes.io/name: prometheus
# 插入
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
- ipBlock:
cidr: 192.168.120.0/24
# 结束
ports:
- port: 9093
protocol: TCP
- port: 8080
protocol: TCP
...
manifests/prometheus-networkPolicy.yaml
spec:
egress:
- {}
ingress:
- from:
- podSelector:
matchLabels:
app.kubernetes.io/name: prometheus
# 插入
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
- ipBlock:
cidr: 192.168.120.0/24
# 结束
ports:
- port: 9090
protocol: TCP
- port: 8080
protocol: TCP
安装
kubectl create --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
kubectl create -f manifests/
# 如果需要卸载
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
使用 Kuboard 配置 ingress 应用路由
首页,选择集群以 kuboard-admin 身份进入 monitoring 命名空间
应用程序,应用路由,创建,填写如下信息,效果如图
名 称:kube-prometheus-ing
IngressClass:启用,选择 ingress
路由规则
域名:grafana.kp.yudelei.com,映射路径:前缀匹配(/,grafana,3000:http)
域名:prometheus.kp.yudelei.com,映射路径:前缀匹配(/,prometheus-k8s,9090:web)
域名:alertmanager.kp.yudelei.com,映射路径:前缀匹配(/,alertmanager-main,9093:web)
配置本地解析
在本地网络DNS添加相关解析:
grafana.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)
prometheus.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)
alertmanager.kp.yudelei.com,记录类型A,IP:192.168.120.81(K8S集群任一主机IP)
若无本地 DNS 仅测试,可配置本地 hosts:
# Windows hosts 文件
# 移动到桌面打开写入,在将其移动到 C:\Windows\System32\drivers\etc\ 目录下
C:\Windows\System32\drivers\etc\hosts
# Linux hosts 文件
/etc/hosts
# 追加写入即可
192.168.120.83 grafana.kp.yudelei.com
192.168.120.83 prometheus.kp.yudelei.com
192.168.120.83 alertmanager.kp.yudelei.com
完成
现在即可在本地运维网络,通过域名访问对应组件。
端口 32763 为 IngressNginxController 暴露的端口。
若遗忘:
通过 kuboard:首页(左上角 Kuboard 图标),选择集群通过 kuboard-admin 身份访问集群概要,网络,IngressClass,点击 ingress 点击进入即可查阅到 IngressNginxController 相关端口。
通过 kubectl: kubectl get svc -n ingress-nginx
grafana:http://grafana.kp.yudelei.com:32763
prometheus:http://prometheus.kp.yudelei.com:32763
alertmanager:http://alertmanager.kp.yudelei.com:32763
数据持久化
以下数据均根据 kube-prometheus 0.14.0 官方示例配置,请注意修改。
监控类组件建议使用支持高 IO 的 SSD 存储类;以下以低 IO NFS SSD 为例,配置方式均类似。
若无其他可用存储,可自行搭建 NFS 服务器,以下为 Windows Server NFS Server 配置参数。
# 注意:NFS 通常只用于学习测试,勿用于生产环境
NFS服务器:192.168.120.52
NFS路径:/nfs
无服务器身份验证:勾选
启动未映射的用户访问(通过UID/GID):勾选
共享权限:
All Machines:勾选
共享权限:读写
允许根目录访问:勾选
确认所有K8S节点均可连接 NFS 服务器端。
apt install -y nfs-client
mkdir -p /tmp/testnfs && mount -t nfs 192.168.120.52:/nfs /tmp/testnfs && echo "hello nfs\n" >> /tmp/testnfs/test.txt && cat /tmp/testnfs/test.txt
成功输出1-3行"hello nfs",即为正常,然后可执行卸载挂载umount /tmp/testnfs
。
配置 storageClass
k8S 可视化面板 Kuboard:首页,选择集群,使用 kuboard-admin 身份访问集群概要,存储,存储类,创建存储类,填写如图(注意容量:建议300g)
Prometheus 数据持久化
Prometheus 是有状态服务 StatefulSet,通过修改 yaml 文件,配置 storage 相关信息即可。vim manifests/prometheus-prometheus.yaml
修改后执行kubectl apply -f manifests/prometheus-prometheus.yaml --server-side
# 末尾追加
spec:
...
retention: 3d # 保留3天
storage:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi # 容量1G
storageClassName: nfs-ssd # 存储类名称
问题
kube-prometheus 部署后 无法访问 访问不了
新接触 k8s 的人在安装 kube-prometheus 社区安装步骤配置 prometheus,grafana,Alertmanager 等组件后,会发现通过本地网络无法访问。社区中演示了 port-forward k8s宿主机访问方式,且 port-forward 并不是生产部署方式。
其原因为 kube-prometheus 部署启用了 Network Policy 网络策略,默认仅允许来自内部指定 Pod prometheus 的访问。
网上通常教程通过删除 Network Policy 网络策略,并使用 NodePort 来进行访问,不适合生产环境,仅适用于测试环境。
为使本地运维或生产网段能够访问以及 ingress-controller 能够正常通过域名转发流量至指定 service,需进行网络策略配置。
以 kube-prometheus 中的 grafana 举例。
编辑网络策略文件kube-prometheus-0.14.0/manifests/grafana-networkPolicy.yaml
× 允许来自 ingress-nginx-controller 所在 namespace 命名空间 ingress-nginx 的访问
× 允许来自本地维护网段 192.168.120.0/24 的访问
...
spec:
egress:
- {}
ingress:
- from:
- podSelector:
matchLabels:
app.kubernetes.io/name: prometheus
# 添加
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: ingress-nginx
- ipBlock:
cidr: 192.168.120.0/24
# 结束
...
参考
prometheus-operator.dev/docs/getting-started/installation/
prometheus-operator.dev/kube-prometheus/kube/access-ui/
github.com/prometheus-operator/kube-prometheus