1- 方案说明
- 适用场景:Java程序直接运行在Linux机器上
- 组件说明:
1)k8s集群,使用NodePort方式暴露48888端口用于JVM监控
2)JMX sidecar容器用于将jmx的相关配置共享给业务容器
3)配置好servicemonitor,prometheus根据配置的target自动发现并获取JVM信息
4)使用influxDB作为prometheus的remote storage,由于prometheus内部实现了influxDB的remote storage接口,所以不需要再配置类似prom2click的中间件。也可以说,prometheus的数据格式可以与influxDB兼容。
5)使用grafana作为监控数据的展示
2- 实验环境说明
1)k8s环境
2)influx安装在宿主机上,其他都安装在k8s集群中实验环境描述:共2个节点。
节点1: 172.16.212.11,主机名 db,配置2C2G,安装influx,mysql, grafana
节点2:172.16.212.12, 主机名 k8s,配置4C8G,安装k8s集群,业务程序
此外,prometheus部署在k8s集群中
3 - 安装配置mysql(Java程序需要使用)
- 安装配置mysql5.7
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
yum install mysql-community-server -y
systemctl start mysqld
systemctl enable mysqld
systemctl status mysqld
#查看密码
cat /var/log/mysqld.log | grep pass
2021-02-09T08:25:49.035598Z 1 [Note] A temporary password is generated for root@localhost: nr2pK2jxQo<j
#重新初始化
mysql_secure_installation
#登录数据库
mysql -uroot -p
#修改密码复杂度,可以不做
set global validate_password_policy=LOW;
set global validate_password_length=6;
#创建业务数据库
create database java_demo;
create user java@'%' IDENTIFIED by '123456';
grant all on java.* to java@'%';
flush privileges;
exit
4- 安装k8s集群
- 可以下载使用我的一键安装脚本:
https://download.youkuaiyun.com/download/qq_35550345/14909351- 也可以根据文档一步步手动安装:
https://github.com/opsnull/follow-me-install-kubernetes-cluster- 记得安装coredns
- 我使用自己的一键安装脚本部署,所以此处就省略了该步骤~
- 验证一下集群功能:
5- k8s中部署prometheus
git clone https://github.com/coreos/kube-prometheus.git
cd kube-prometheus
# kube-prometheus/manifests/alertmanager-alertmanager.yaml 的replicas数改成1(replicas=3时,alertmanager一直crash不知道为什么,后续再看吧。)
cd manifests/setup && kubectl apply -f .
cd manifest && kubectl apply -f .
# 配置集群外部访问各组件的端口
# alertmanager: kubectl edit svc alertmanager-main -n monitoring
apiVersion: v1
kind: Service
metadata:
labels:
alertmanager: main
name: alertmanager-main
namespace: monitoring
spec:
ports:
- name: web
port: 9093
targetPort: web
nodePort: 30093
type: NodePort
selector:
alertmanager: main
app: alertmanager
sessionAffinity: ClientIP
# grafana: kubectl edit svc grafana -n monitoring
apiVersion: v1
kind: Service
metadata:
labels:
app: grafana
name: grafana
namespace: monitoring
spec:
ports:
- name: http
port: 3000
targetPort: http
nodePort: 30030
type: NodePort
selector:
app: grafana
# prometheus: kubectl edit prometheus-k8s grafana -n monitoring
apiVersion: v1
kind: Service
metadata:
labels:
prometheus: k8s
name: prometheus-k8s
namespace: monitoring
spec:
ports:
- name: web
port: 9090
targetPort: web
nodePort: 29090
type: NodePort
selector:
app: prometheus
prometheus: k8s
sessionAffinity: Client