基于Prometheus监控Kubernetes集群
在 ports 中定义暴露的端口库号列表,对外暴露访问的端口是 80,容器内部的端口也是 80。Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上查看节点信息都是“Not Ready”状态、Pod 的 CoreDNS无法提供服务等。Harbor 私有仓库程序,采用 docker-compose 方式部署,不同的功能和应用处
Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB);Prometheus使用Go语言开发,是Google BorgMon监控系统的开源版本;2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目;Prometheus和Heapster(Heapster是K8S的一个子项目,用于获取集群的性能数据),相比功能更完善、更全面;Prometheus性能也足够支撑上万台规模的集群 。
官网地址:Prometheus - Monitoring system & time series database
(一)Prometheus的基本原理
通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。
这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。
目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。
目前官方最新版本为2-51.2版本。
(二)Prometheus优势
·多维度数据模型。
·灵活的查询语言。
·不依赖分布式存储,单个服务器节点是自主的。
·通过基于HTTP的pull方式采集时序数据。
·可以通过中间网关进行时序列数据推送。
·通过服务发现或者静态配置来发现目标服务对象。
·支持多种多样的图表和界面展示,比如Grafana等。
(三)Prometheus工作服务过程
1、Prometheus Daemon负责定时去目标上抓取metrics(指标)数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup服务注册与发现等方式指定抓取目标。Prometheus采用PULL的方式进行监控,即服务器可以直接通过目标PULL数据或者间接地通过中间网关来Push数据。
2、Prometheus在本地存储抓取的所有数据,并通过一定规则进行清理和整理数据,并把得到的结果存储到新的时间序列中。
3、Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持很多方式的图表可视化,例如Grafana、自带的Promdash以及自身提供的模版引擎等等。Prometheus还提供HTTP API的查询方式,自定义所需要的输出。
4、PushGateway支持Client主动推送metrics到PushGateway,而Prometheus只是定时去Gateway上抓取数据。
5、Alertmanager是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。
(四)Prometheus核心组件
·Server 主要负责数据采集和存储,提供PromQL查询语言的支持
·Alertmanager 警告管理器,用来进行报警
·Push Gateway 主要是实现接收由Client push过来的指标数据,在指定的时间间隔,由主程序来抓取。
·node_exporter 用来监控服务器CPU、内存、磁盘、I/O等信息。
(五)Prometheus实践架构图
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。
支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。
·Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器。支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。
·Grafana支持许多不同的时间序列数据(数据源)存储后端。每个数据源都有一个特定查询编辑器。官方支持以下数据源:Graphite、infloxdb、opensdb、prometheus、elasticsearch、cloudwatch。每个数据源的查询语言和功能明显不同。你可以将来自多个数据源的数据组合到一个仪表板上,但每个面板都要绑定到属于特定组织的特定数据源。
·Grafana中的警报允许您将规则附加到仪表板面板上。保存仪表板时,Gravana会将警报规则提取到单独的警报规则存储中,并安排它们进行评估。报警消息还能通过钉钉、邮箱等推送至移动端。但目前grafana只支持graph面板的报警。
·Grafana使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;
·Grafana使用Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询
三、安装部署
(一)环境准备
IP地址 | 主机名 | 组件 |
192.168.100.131 | k8s-master | kubeadm、kubelet、kubectl、docker-ce |
192.168.100.132 | k8s-node01 | kubeadm、kubelet、kubectl、docker-ce |
192.168.100.133 | k8s-node02 | kubeadm、kubelet、kubectl、docker-ce |
注意:所有主机配置推荐CPU:2C+ Memory:2G+
项目拓扑
所有主机配置禁用防火墙和selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable NetworkManager
[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
2、配置主机名并绑定hosts,不同主机名称不同
[root@localhost ~]# hostname k8s-master
[root@localhost ~]# bash
[root@k8s-master ~]# cat << EOF >> /etc/hosts
192.168.100.131 k8s-master
192.168.100.132 k8s-node01
192.168.100.133 k8s-node02
EOF
[root@localhost ~]# hostname k8s-node01
[root@k8s-node01 ~]# cat /etc/hosts
[root@localhost ~]# hostname k8s-node02
[root@k8s-node02 ~]#cat /etc/hosts
3、主机配置初始化
[root@k8s-master ~]# yum -y install vim wget net-tools lrzsz
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sed -i '/swap/s/^/#/' /etc/fstab
[root@k8s-master ~]# cat << EOF >> /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# sysctl -p
4、部署docker环境
1)三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。
[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
2)使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。
[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3)清除缓存
[root@k8s-master ~]# yum clean all && yum makecache fast
4)启动docker
[root@k8s-master ~]# yum -y install docker-ce
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable docker
5)镜像加速器(所有主机配置)
[root@k8s-master ~]# cat << END > /etc/docker/daemon.json
{ "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
6)重启docker
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker
(二)部署kubernetes集群
三个节点都需要安装下面三个组件
kubeadm:安装工具,使所有的组件都会以容器的方式运行
kubectl:客户端连接K8S API工具
kubelet:运行在node节点,用来启动容器的工具
使用 YUM 方式安装 Kubernetes时,推荐使用阿里的 YUM 源。
[root@k8s-master ~]# ls /etc/yum.repos.d/
[root@k8s-master ~]# cat > /etc/yum.repos.d/kubernetes.repo
3、安装kubelet kubeadm kubectl
所有主机配置
[root@k8s-master ~]# yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0
[root@k8s-master ~]# systemctl enable kubelet
[root@k8s-master ~]# kubectl version
kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。
Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。
在master节点安装,master 定于为192.168.100.131,通过如下指令创建默认的init-config.yaml文件:
[root@k8s-master ~]# kubeadm config print init-defaults > init-config.yaml
init-config.yaml配置
[root@k8s-master ~]# cat init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.100.131 //master节点IP地址
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master //如果使用域名保证可以解析,或直接使用 IP 地址
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd //etcd 容器挂载到本地的目录
imageRepository: registry.aliyuncs.com/google_containers //修改为国内地址
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 //新增加 Pod 网段
scheduler: {}
5、安装master节点
1)拉取所需镜像
[root@k8s-master ~]# kubeadm config images list --config init-config.yaml
[root@k8s-master ~]# kubeadm config images pull --config init-config.yaml
2)安装matser节点
[root@k8s-master ~]# kubeadm init --config=init-config.yaml //初始化安装K8S
3)根据提示操作
kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf 拷贝到.kube/config
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上查看节点信息都是“Not Ready”状态、Pod 的 CoreDNS无法提供服务等。
6、安装node节点
1)根据master安装时的提示信息
[root@k8s-node01 ~]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae
[root@k8s-master ~]# kubectl get nodes
[root@k8s-node02 ~]# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae
Master操作:
[root@k8s-master ~]# kubectl get nodes
前面已经提到,在初始化 k8s-master 时并没有网络相关配置,所以无法跟 node 节点通信,因此状态都是“NotReady”。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。
Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。
所有主机:
master上传kube-flannel.yml,所有主机上传flannel_v0.12.0-amd64.tar,cni-plugins-linux-amd64-v0.8.6.tgz
[root@k8s-master ~]# docker load < flannel_v0.12.0-amd64.tar
上传插件:
[root@k8s-master ~]# tar xf cni-plugins-linux-amd64-v0.8.6.tgz
[root@k8s-master ~]# cp flannel /opt/cni/bin/
master上传kube-flannel.yml
master主机配置:
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
[root@k8s-master ~]# kubectl get nodes
[root@k8s-master ~]# kubectl get pods -n kube-system
已经是ready状态
8、部署测试应用
1)所有node主机导入测试镜像
[root@k8s-node01 ~]# docker pull nginx
2)在Kubernetes集群中创建一个pod,验证是否正常运行。
[root@k8s-master ~]# mkdir demo
[root@k8s-master ~]# cd demo
[root@k8s-master demo]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.6
ports:
- containerPort: 80
创建完 Deployment 的资源清单之后,使用 create 执行资源清单来创建容器。通过 get pods 可以查看到 Pod 容器资源已经自动创建完成。
[root@k8s-master demo]# kubectl create -f nginx-deployment.yaml
[root@k8s-master demo]# kubectl get pods
[root@k8s-master demo]# kubectl get pods -o wide
3)创建Service资源清单
在创建的 nginx-service 资源清单中,定义名称为 nginx-service 的 Service、标签选择器为 app: nginx、type 为 NodePort 指明外部流量可以访问内部容器。在 ports 中定义暴露的端口库号列表,对外暴露访问的端口是 80,容器内部的端口也是 80。
[root@k8s-master demo]# vim nginx-service.yaml
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@k8s-master1 demo]# kubectl create -f nginx-service.yaml
[root@k8s-master demo]# kubectl get svc
[root@k8s-master demo]# curl 10.101.253.90:80
通过浏览器访问nginx:http://192.168.100.131:31367
(三)部署Prometheus监控平台
在master节点/opt目录下新建pgmonitor目录
[root@k8s-master ~]# mkdir pgmonitor
[root@k8s-master ~]# cd pgmonitor/
将下载yaml包上传至/opt/pgmonitor目录并解压
[root@k8s-master ~]# unzip k8s-prometheus-grafana-master.zip
1)部署守护进程
[root@k8s-master pgmonitor]# cd k8s-prometheus-grafana-master/
[root@k8s-master k8s-prometheus-grafana-master]# kubectl create -f node-exporter.yaml
2)部署其他yaml文件
进入/pgmonitor/k8s-prometheus-grafana-master/prometheus目录
[root@k8s-master k8s-prometheus-grafana-master]# cd prometheus
3)部署rbac
[root@k8s-master prometheus]# kubectl create -f rbac-setup.yaml
4)部署configmap.yaml
[root@k8s-master prometheus]# kubectl create -f configmap.yaml
5)部署prometheus.deploy.yml
[root@k8s-master prometheus]# kubectl create -f prometheus.deploy.yml
6)部署prometheus.svc.yml
[root@k8s-master prometheus]# kubectl create -f prometheus.svc.yml
7)查看prometheus状态
[root@k8s-master prometheus]# kubectl get pods -n kube-system
稍等一会,再次查看!
[root@k8s-master prometheus]# kubectl get pods -n kube-system
(四)部署Grafana服务
进入/opt/pgmonitor/k8s-prometheus-grafana-master/grafana目录
[root@k8s-master prometheus]# cd ../grafana/
1)部署grafana-deploy.yaml
[root@k8s-master grafana]# kubectl create -f grafana-deploy.yaml
2)部署grafana-svc.yaml
[root@k8s-master grafana]# kubectl create -f grafana-svc.yaml
3)部署grafana-ing.yaml
[root@k8s-master grafana]# kubectl create -f grafana-ing.yaml
4)查看Grafana状态
[root@k8s-master grafana]# kubectl get pods -n kube-system
2、配置Grafana数据源
1)查看grafana的端口
[root@k8s-master grafana]# kubectl get svc -n kube-system
2)通过浏览器访问
grafana,http://[masterIP]:[grafana端口]
例如:http://192.168.100.131:30503,默认的用户名和密码:admin/admin
3)设置DataSource
设置显示数据的模版
输入315并移除光标,等一会儿即可进入下一个页面
选择自己定义的数据源名称
至此已经利用Prometheus+Granfana监控了Kubernetes平台。
备注:
kubectl get pods -n kube-system
当出现prometheus和grafana的镜像下载失败
kubectl create -f prometheus.deploy.yml
kubectl create -f grafana-deploy.yaml
创建镜像不成功
解决方法:
1、本地上传镜像测试
docker load < prometheus-v2.0.0.tar
docker load < grafana-4.2.0.tar
kubectl create -f prometheus.deploy.yml
kubectl create -f grafana-deploy.yaml
创建镜像不成功
2、docker pull下载测试
docker pull prom/prometheus:v2.0.0
docker pull grafana/grafana:4.2.0
kubectl create -f prometheus.deploy.yml
kubectl create -f grafana-deploy.yaml
创建镜像不成功
3、创建私有仓库harbor方式
1)所有主机配置禁用防火墙和selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable NetworkManager
[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
2)配置主机名
[root@localhost ~]# hostname harbor
[root@localhost ~]# bash
[root@harbor ~]#
3)部署docker环境
Harbor 仓库需要 Docker 容器支持,所以 Docker 环境是必不可少的。
[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。
[root@k8s-master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清除缓存
[root@k8s-master ~]# yum clean all && yum makecache fast
启动docker
[root@k8s-master ~]# yum -y install docker-ce
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable docker
镜像加速器(所有主机配置)
[root@k8s-master ~]# cat << END > /etc/docker/daemon.json
{ "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
重启docker
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker
部署docker-compose
[root@harbor ~]# mv docker-compose /usr/local/bin/
[root@harbor ~]# chmod +x /usr/local/bin/docker-compose
部署harbor
Harbor 私有仓库程序,采用 docker-compose 方式部署,不同的功能和应用处于不同的容器,这样带来了很好的兼容性,可在众多支持 Docker 的系统上运行 Harbor。
[root@harbor ~]# tar xf harbor-offline-installer-v2.0.0.tgz -C /usr/local/
Harbor 的配置文件是/usr/local/harbor/harbor.yml 文件,默认的 hostname 要修改为Harbor 虚拟机节点的 IP 地址。
[root@harbor ~]# vim /usr/local/harbor/harbor.yml
5 hostname: 192.168.100.134
13 #https: //https 相关配置都注释掉,包括 https、port、certificate 和 private_key
14 # https port for harbor, default is 443
15 #port: 443
16 # The path of cert and key files for nginx
17 #certificate: /your/certificate/path
18 #private_key: /your/private/key/path
启动harbor
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# sh install.sh
[root@harbor harbor]# docker-compose ps
Harbor 启动完成后,浏览器访问 http://192.168.100.134,打开 Harbor Web 页面
创建项目pgm,公开
修改所有主机docker启动脚本
[root@harbor ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.100.134
[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.131:/usr/lib/systemd/system/
[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.132:/usr/lib/systemd/system/
[root@harbor ~]# scp /usr/lib/systemd/system/docker.service 192.168.100.133:/usr/lib/systemd/system/
所有主机重启docker服务
[root@harbor ~]# systemctl daemon-reload
[root@harbor ~]# systemctl restart docker
2、重启harbor,导入EFK镜像,打标签,上传镜像
[root@harbor ~]# sh install.sh
[root@harbor ~]# docker login -u admin -p Harbor12345 http://192.168.100.134
[root@harbor ~]# mkdir /root/pgm && cd pgm
[root@harbor ~]# ls
docker load < grafana-4.2.0.tar
docker load < prometheus-v2.0.0.tar
docker images
docker tag 67141fa03496
192.168.100.134/pgm/prom/prometheus:v2.0.0
docker tag 8c4ef64b4ad1
192.168.100.134/pgm/grafana/grafana:4.2.0
docker push
192.168.100.134/pgm/prom/prometheus:v2.0.0
docker push
192.168.100.134/pgm/grafana/grafana:4.2.0
仓库查看
修改prometheus.deploy.yml文件
如下:
apiVersion: apps/V1
kind: Deployment
metadata:
labels :
name: prometheus-deploymentname: prometheus
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers :
- image: 192.168.100.134/pgm/prom/prometheus:v2.0.0name: prometheus
command:
修改grafana-deploy.yaml文件
如下:
apiVersion: apps/V1
kind: Deployment
metadata:
labels :
name: prometheus-deploymentname: prometheus
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers :
- image: 192.168.100.134/pgm/prom/prometheus:v2.0.0name: prometheus
command:
kubectl create -f prometheus.deploy.yml
kubectl create -f grafana-deploy.yaml
创建成功!
kubectl get pods,svc -n kube-system
访问测试
192.168.100.131:30003 prometheus访问成功
192.168.100.131:32513 grafana访问成功
账户:admin
密码:admin
3)设置DataSource
输入如下:
Name:k8s-pgm type:Prometheus
URL:http://10.109.234.127:9090
设置显示数据的模版
输入315并移除光标,等一会儿即可进入下一个页面
选择自己定义的数据源名称
至此已经利用Prometheus+Granfana监控了Kubernetes平台。
更多推荐
所有评论(0)