前言简述:
描述: 作者前面发布了几篇我们在日常生活中的几种事物的攻略总结,是不是感觉作者有不务正业的样子, 不过从文章阅读来看还是很受欢迎的, 不过总归还是要技术中来 ,所以经过一段时间的学习、实践后,作者又为大家带来在云原生环境下多种设备(
Linux、Windows、Web、K8s 集群、网络设备、数据库
)等资源监控预警, 此专栏文章使用Minio+ Mimir + Prometheus + Alertmanager + Grafana
来实现企业中监控指标采集与持久化存储、监控预警以及可视化的展示采集信息实践。
此篇文章是作者抽取当前自己企业中正在使用的监控架构方案,以多个日日夜夜搭建环境,实践部署总结而来,希望大家多多支持(购买
)此专栏,定会让看友你有所收获(PS: 物有所值
),同时让你快速搭建部署一套企业内部云原生环境下的监控预警及可视化平台。
温馨提示:除了企业内部的监控预警,作者也会在此专栏中持续更新,符合当前等保要求的企业内部各类安全日志收集(例如: 系统、应用、安全设备
等日志)与可视化展示,尽情大家持续关注【WeiyiGeek】作者。
温馨提示:文中资源清单配置文件可以在【文章末尾】获取下载连接。
文章目录:
0x01 快速了解
1.实践目标
描述: 此项目实践所实现的目标是使用 Mimir+Minio
来持久化 Promethus (普罗米修斯
)采集的相关系统、应用、设备指标,其次使用 Alertmanager 根据 rules 告警规则,触发实现 Email 邮件报警、企业微信机器人报警或者自行编写的 Webhooks 应用服务端预警,最后使用 Grafana 的 Promtheus 模板 dashboard 实现采集指标的分类显示更加直观高大上。
此文实践目标实现简单架构图,如下所示:
weiyigeek.top-项目架构图
环境一览
# 系统节点
OS-IMAGE: Kylin Linux Advanced Server V10 (Lance)
KERNEL-VERSION: 4.19.90-52.26.v2207.ky10.x86_64
KUBERNETES-VERSION: v1.28.1
CONTAINER-RUNTIME: containerd://1.6.22
NODES: weiyigeek-02、weiyigeek-03、weiyigeek-04 ( control-plane ) / weiyigeek-05 ( work )
IP: 10.10.10.2~5
# 应用版本
minio:RELEASE.2023-10-25T06-33-25Z
mimir:2.10.0
prometheus:v2.47.0
alertmanager:v0.26.0
grafana:10.1.5
域名一览
描述: 在实际环境中需要将下述域名添加A解析(10.10.10.4/10.10.10.5
)到企业内部DNS服务器中,或者进行硬解析/etc/hosts
很简单此处不再累述了。
# 指标对象存储域名: 主要用于访问 Minio Console 以及 Minio 存储桶
minio-sec.weiyigeek.top
# 监控指标采集域名:主要用于访问 Prometheus 和 Alertmanager 后台页面
monitor-sec.weiyigeek.top
# 数据日志采集域名:主要用于访问日志收集服务
log-sec.weiyigeek.top
# 可视化平台域名:主要用于访问 grafana 可视化数据展示页面
view-sec.weiyigeek.top
2.环境准备
描述: 如果你是从头开始,此处作者建议在此文实践前的,可以参照作者的前置环境的搭建部署一文,也是此专栏中的第一篇文章《从零开始:新手快速在国产操作系统中搭建高可用K8S(V1.28)集群落地实践》,减少入坑的几率,并跟到作者的安装部署流程走,基本上你遇到的坑,都被作者填满了😳。
Step 1.在部署 Minio
、Mimir
以及 Prometheus
时可以使用Ceph或NFS作为存储后端,具体选择哪个取决于你的需求和环境, 不过官方在文档中说明为了一致性建议使用本地磁盘来存储抓取的指标,若非要使用NFS作为后端存储
尽量采用NFSv4版本
协议挂载。
- Ceph存储:Ceph是一个分布式存储系统,可以提供高可用性和可扩展性。如果你的集群已经使用Ceph作为存储后端,那么使用Ceph作为Prometheus的存储后端是一个不错的选择。你可以在Kubernetes中创建一个PersistentVolumeClaim(PVC)来动态分配Ceph存储,并将其挂载到Prometheus容器中。
- NFS存储:NFS(Network File System)是一个网络文件系统协议,可以在不同的操作系统之间共享文件。如果你的环境中已经有一个NFS服务器,并且你希望将Prometheus的数据存储在共享的NFS目录中,那么你可以将NFS目录作为PersistentVolume(PV)并在Kubernetes中进行配置。
总结:无论选择Ceph还是NFS作为存储后端,都需要在Kubernetes中创建相应的PV和PVC,并将其绑定到Prometheus的Deployment或StatefulSet中, 具体的配置和部署步骤可以根据所使用的存储后端和Kubernetes集群的要求进行调整。
Step 2.提前准备好私有Hub仓库的认证账号密码,以及申请一个通配符的证书,若没有相关环境且想部署的,可以参考作者下面两篇文章,当然也可以不使用私有的Hub仓库
或者不为 ingress 配置 ssl 证书
访问。
- GitOps实践 | 快速在银河麒麟KylinOS国产系统部署最新Harbor企业私有镜像仓库
- Let'sEncrypt快速颁发及自动续签泛域名证书实践指南
Step 3.在准备上述环境之后,快速执行下述命令,以创建后续所需的名称空间、docker-registry 认证票据,以及 tls 类型的 secret
,当然你也可以单独根据实际情况执行。
# 批量创建名称空间
for ns in "ingress-nginx" "logging" "monitoring" "dashboard";do
# 创建名称空间
kubectl create namespace ${ns}
# 在各名称空间下,创建内部的 docker registry 认证的 secret
kubectl create secret docker-registry harbor-cloud \
--docker-server=harbor.weiyigeek.top \
--docker-username=weiyigeek \
--docker-password=2023.weiyigeek.top \
--namespace ${ns}
# 为多个名称空间,创建企业域名或私有域名 tls 的 secret
kubectl create secret tls ssl-weiyigeek-top --key=2023.weiyigeek.top.key --cert=2023.weiyigeek.top.pem --namespace $i
doen
# 为 03 ~ 04 节点设置标签,让Pod根据设定的节点标签进行绑定,从而减去主 weiyigeek-02 节点压力
kubectl label nodes weiyigeek-03 weiyigeek-04 weiyigeek-05 node=app
# 查看创建的 私有仓库认证 与 私有域名证书 的 secret
kubectl get secret -n monitoring
# NAME TYPE DATA AGE
# secret/harbor-cloud kubernetes.io/dockerconfigjson 1 30d
# secret/ssl-weiyigeek-top kubernetes.io/tls 2 29d
0x02 搭建企业内部监控预警平台实践
Minio 对象存储快速部署
Q: 什么是 Minio 对象存储?
Minio 是由 GlusterFS 创始人之一的 Anand Babu Periasamy
发布新的开源项目, MinIO 是一种对象存储解决方案,它是一个基于 Go 语言 (跨平台运行
)的开源的对象存储系统,专门设计用于云原生和容器化环境,或者部署在任何地方而构建 公共云或私有云、裸机基础架构、编排环境和边缘基础架构。
Minio 提供与亚马逊云科技 S3 兼容的 API,并支持所有核心 S3 功能, 所以也可以看做是S3的开源版本;它允许用户通过简单的 API 接口进行数据的存储和检索,同时提供高度可扩展性和强大的数据保护机制。
MinIo主要是在微服务系统中使用,非常适合于存储大容量非结构化的数据,例如 图片、视频、日志文件、备份数据和容器/虚拟机
镜像等,而一个对象文件可以是任意大小,从几 kb 到最大 5T 不等,并且其安装配置简单,单行命令可以运行起来; 也可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
温馨提示:若需要快手了解Minio 对象存储的朋友可以参考作者此篇文章《云原生 | 从零开始,Minio 高性能分布式对象存储快速入手指南》
安装流程:
描述: 此处作者使用Kubectl命令加资源清单方式部署单实例的Minio,具体操作命令如下所示:
Step 1.在挂载的 NFS 网络存储创建持久化目录:mkdir -vp /storage/app/monitoring/minio/{data,deploy}
Step 2.准备好部署Minio的相关资源清单,此处是配置的deployment控制器以及Services服务发现的yaml清单。
# deployment 控制器 -> 创建 Pod 应用
tee /storage/app/monitoring/minio/deploy/minio-deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio-server
namespace: monitoring
labels:
app: minio-server
spec:
replicas: 1
selector:
matchLabels:
app: minio-server
template:
metadata:
labels:
app: minio-server
spec:
imagePullSecrets:
- name: harbor-cloud
nodeSelector:
node: app
containers:
- image: quay.io/minio/minio:RELEASE.2023-10-25T06-33-25Z
name: minio
command:
- /bin/bash
- -c
args:
- minio server /minio/data --console-address :9090 --address :9000
env:
- name: MINIO_BROWSER_REDIRECT_URL
value: https://minio-sec.weiyigeek.top/admin/
- name: MINIO_BROWSER_SESSION_DURATION
value: 30m
- name: MINIO_SERVER_URL
value: https://minio-sec.weiyigeek.top
- name: MINIO_ROOT_USER
value: root
- name: MINIO_ROOT_PASSWORD
value: weiyigeek.top
ports:
- containerPort: 9000
protocol: TCP
name: http
- containerPort: 9090
protocol: TCP
name: console
volumeMounts:
- name: data
mountPath: "/minio/data"
resources:
requests:
cpu: 2
memory: 1Gi
limits:
cpu: 4
memory: 4Gi
volumes:
- name: data
hostPath:
type: DirectoryOrCreate
path: /storage/app/monitoring/minio/data
EOF
# Service 控制器 -> 创建服务名并与Pod应用绑定
tee /storage/app/monitoring/minio/deploy/minio-svc.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
name: minio-server
namespace: monitoring
labels:
app: minio-server
spec:
selector:
app: minio-server
type: NodePort
ports:
- name: http
port: 9000
targetPort: http
nodePort: 30087
- name: console
port: 9090
targetPort: console
nodePort: 30088
EOF
# 根据清单部署 minio 服务
kubectl apply -f deploy/minio-deployment.yaml
kubectl apply -f deploy/minio-svc.yaml
Step 3.查看并验证部署的 Minio 对象存储服务是否正常。
$ kubectl get deployments,pods,svc -n monitoring -l app=minio-server
# NAME READY UP-TO-DATE AVAILABLE AGE
# deployment.apps/minio-server 1/1 1 1 100s
# NAME READY STATUS RESTARTS AGE
# pod/minio-server-9c4b768c9-tsts6 1/1 Running 0 100s
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# service/minio-server NodePort 10.96.189.101 <none> 9000:30087/TCP,9090:30088/TCP 97s
$ kubectl logs -f -n monitoring pod/minio-server-9c4b768c9-tsts6
# Status: 1 Online, 0 Offline.
# S3-API: https://minio-sec.weiyigeek.top
# Console: https://minio-sec.weiyigeek.top/admin/
Step 4.创建 ingress 访问入口,即使用上述配置的https://minio-sec.weiyigeek.top
来访问S3-API以及Console,配置如下:
# 根域名 (`pathType: Prefix`) 创建 minio 访问入口
kubectl create ingress minio --class=nginx --rule="minio-sec.weiyigeek.top/*=minio-server:9000,tls=ssl-weiyigeek.top" --namespace monitoring
# 根域名/子目录 访问 minio 的管理后台
echo '
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio-console
namespace: monitoring
annotations:
# 解决: 413 Request Entity Too Large 问题
nginx.ingress.kubernetes.io/proxy-body-size: '128m'
# 解决:后端大文件上传问题
nginx.ingress.kubernetes.io/client-body-buffer-size: '64m'
nginx.ingress.kubernetes.io/proxy-max-temp-file-size: '128m'
# 解决: 上传文件较慢问题
nginx.ingress.kubernetes.io/proxy-buffer-size: '64m'
nginx.ingress.kubernetes.io/proxy-buffering: 'on'
# nginx.ingress.kubernetes.io/proxy-buffers-number: "4"
# 解决: 504 网关超时即后端backend超时问题
nginx.ingress.kubernetes.io/proxy-connect-timeout: '30s'
nginx.ingress.kubernetes.io/proxy-read-timeout: '60s'
nginx.ingress.kubernetes.io/proxy-send-timeout: '60s'
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: minio-sec.weiyigeek.top
http:
paths:
- backend:
service:
name: minio-server
port:
number: 9090
path: /admin(/|$)(.*)
pathType: ImplementationSpecific
tls:
- hosts:
- minio-sec.weiyigeek.top
secretName: ssl-weiyigeek-top
' | kubectl apply -f -
# 查看创建的 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
minio nginx minio-sec.weiyigeek.top 80, 443 15s
minio-console nginx minio-sec.weiyigeek.top 80, 443 14s
Step 5.在Kubernetes集群内部以及企业内部DNS服务器上,添加 minio-sec.weiyigeek.top 域名解析。
# 1.验证K8S集群服务发现解析是否正常
dig +noall +answer -t A minio-server.monitoring.svc.cluster.sec @10.96.0.10
# 3.在K8S集群内部节点上以及DNS服务器上设置域名解析,或者直接设置硬解析也是可以的。
# 批量设置硬解析
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.4 minio-sec.weiyigeek.top" create=yes' -o
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.5 minio-sec.weiyigeek.top" create=yes' -o
# 4.也可以在K8S集群内部的coredns服务使用hosts插件解析,下面编辑coredns的ConfigMap资源清单。
kubectl edit cm -n kube-system coredns
......
ready
# 新增部分开始----------------
hosts {
10.10.10.4 minio-sec.weiyigeek.top
10.10.10.5 minio-sec.weiyigeek.top
fallthrough
}
# 新增部分结束----------------
kubernetes cluster.sec in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
......
# 5.若 coredns Pod的没有自动重启,建议手动重启。
kubectl delete pod -n kube-system -l k8s-app=kube-dns
# 6.等待Pod成功启动后验证域名解析
dig +noall +answer -t A minio-sec.weiyigeek.top @10.96.0.10
# minio-sec.weiyigeek.top. 30 IN A 10.10.10.4
# minio-sec.weiyigeek.top. 30 IN A 10.10.10.5
温馨提示: 若需要在企业中快速搭建内部DNS服务器,请参考《Ops实践 | 国产化KylinOS系统中快速部署企业内部高性能DNS服务器、时间同步服务器 (精选)》
Step 6.使用浏览器访问绑定的域名,并使用设置的root:weiyigeek.top
账号密码进行登录 Minio Console。
weiyigeek.top-Minio Console图
Step 7.登录后点击Buckets
创建一个名为mimir的存储桶,后续在 Grafana minir
中使用。
weiyigeek.top-在Minio中创建mimir的存储桶图
Step 8.然后再点击Access Keys
将会自动创建一个keys键值对,以供后续 Grafana minir
连接使用,为了安全Secret Key只在创建时显示之后便不会显示,建议自行存储在安全的地方。
- Access Key: SRDboWItc0ObMwNP04Nu
- Secret Key: ehvIsPwvR****************sJM (安全打码)