1、prometheus概述
prometheus監控系統主要有pushgateway、prometheus server、alertmanager、prometheus web UI Grafana這些元件組成。
prometheus server主要有Retrieval,Storage,PromQL組成。
- Retrieval在活躍的target主機上抓取監控名額資料
- Storage把采集到的資料存儲到磁盤中
- PromQL提供查詢語言子產品
工作流程:
- prometheus server定期從活躍的目标主機上拉取監控名額資料目标主機監控資料可配置靜态job或服務發現方式被prometheus server采集到,預設方式是pull方式拉取名額,也可以通過pushgateway把采集的資料上報到prometheus server中,還可以通過一些元件自帶的exporter采集相應元件的資料;
- promethues server把采集到的監控名額資料儲存到本地磁盤或資料庫;
- prometheus采集的監控名額資料按時間序列存儲,通過配置報警規則,把觸發的報警發送到alertmanager;
- alertmanager通過配置報警接收方,發送報警到郵件,微信或釘釘等;
- grafana可接入prometheus資料源,把監控資料以圖形化形式展示出來。
2、kubernetes基礎環境
master01 | node01 |
192.168.2.73 | 192.168.2.74 |
centos76 | centos76 |
8c8g | 8c8g |
2.1、docker基礎環境(兩個節點)
配置host
# vim /etc/hosts
192.168.2.73 master01
192.168.2.74 node01
配置免密互相免密
# ssh-keygen
# ssh-copy-id 192.168.2.73
# ssh-copy-id 192.168.2.74
關閉防火牆和selinux
# systemctl stop firewalld ; systemctl disable firewalld
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
修改核心參數
#加載br_netfilter子產品
# modprobe br_netfilter
#驗證子產品是否加載成功:
# lsmod |grep br_netfilter
#修改核心參數
# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
#使剛才修改的核心參數生效
# sysctl -p /etc/sysctl.d/k8s.conf
配置yum源,配置至/etc/yum.repos.d/
安裝iptables
# yum install iptables-services -y
# service iptables stop && systemctl disable iptables
# iptables -F
# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
# yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet rsync lrzsz
安裝docker-ce和鏡像加速源
# yum install docker-ce docker-ce-cli containerd.io -y
# systemctl start docker && systemctl enable docker.service && systemctl status docker
# tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker
# systemctl status docker
時間同步
# yum install ntpdate -y
# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
關閉交換分區swap,提升性能
# swapoff -a
# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
# mount
2.2、kubernetes基礎環境
軟體包:busybox-1-28.tar.gz k8simage-1-20-6.tar.gz k8s.repo calico.yaml
安裝初始化k8s需要的軟體包
将k8s.repo的YUM檔案上傳至/etc/yum.repos.d/目錄下
# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
# systemctl enable kubelet && systemctl start kubelet
# systemctl status kubelet
解壓k8simage-1-20-6.tar.gz,同時兩個節點都需要上傳這個鏡像包
# docker load -i k8simage-1-20-6.tar.gz
在master01節點操作如下(注意寫自己主機IP)
# kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=172.16.90.73 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
在node01節點操作如下(特别注意自己主機IP,以下指令是上面master01執行成功後會列印到螢幕上,可以直接使用)
# kubeadm join 192.168.2.73:6443 --token bligdo.0nrcvlwrdamdbkjd \
--discovery-token-ca-cert-hash sha256:285e0f44846819e66a13074a7263d18456c20c92feca35253d8ba9473dcf7e0e
修改node标簽(在master01節點)
# kubectl label node node01 node-role.kubernetes.io/worker=worker
由于目前為止并無網絡,是以需要安裝網絡插件(在master01節點執行即可)
# kubectl apply -f calico.yaml
為了友善監控,開啟kube-proxy、scheduler、controller遠端端口(在master01節點)
# vim /etc/kubernetes/manifests/kube-scheduler.yaml
- ;--bind-address=192.168.2.73
host: 192.168.2.73
host: 192.168.2.73
原來這三個地方是127.0.0.1修改成本機IP位址
并且去掉 - ;--port=0
# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
- ;--bind-address=192.168.2.73
- ;--port=0 --去掉
host: 192.168.2.73
host: 192.168.2.73
原來這三個地方是127.0.0.1修改成本機IP位址
# systemctl restart kubelet
# kubectl edit cm kube-proxy -n kube-system
metricsBindAddress: "0.0.0.0:10249"
# kubectl get pods -n kube-system | grep kube-proxy |awk '{print $1}' | xargs kubectl delete pods -n kube-system
測試dns(在node01)解壓鏡像包
# docker load -i busybox-1-28.tar.gz
在master上登陸busyboxpod測試dns
# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.10.0.10
Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.10.0.1 kubernetes.default.svc.cluster.local
/ # ping www.baidu.com
PING www.baidu.com (14.215.177.39): 56 data bytes
64 bytes from 14.215.177.39: ;seq=0 ;ttl=127 ;time=8.753 ms
64 bytes from 14.215.177.39: ;seq=1 ;ttl=127 ;time=10.323 ms
3、prometheus+alertmanager+grafana
3.1、prometheus存儲卷
nfs存儲卷:monitor-nfs-claim.yaml monitor-nfs-deploment.yaml monitor-nfs-storageclass.yaml
monitor-serviceaccount.yaml nfs-subdir-external-provisioner.tar.gz
pvc存儲卷至nfs建立流程:
- 服務端和用戶端安裝nfs服務,在服務端建立共享目錄
- 如有需要單獨名稱空間,則建立名稱空間
- 建立sa賬号并且賬号授權
- 安裝nfs-provisioner服務
- 通過storageclass建立pv
- 通過persistentvolumeclaim建立pvc
- 通過pvc的名稱挂載使用
在master01和node01節點上安裝nfs服務
# yum -y install nfs-utils
# service nfs start
# systemctl enable nfs
在master01節點作為服務端
# vim /etc/exports
/data/monitor 192.168.2.0/24(rw,no_root_squash)
# mkdir -pv /data/monitor
# chmod -R 777 /data/monitor
# exportfs -arv
# showmount -e 192.168.2.73
在node01節點安裝nfs-subdir-external-provisioner.tar.gz
# docker load -i nfs-subdir-external-provisioner.tar.gz
在master01建立sa賬号
# kubectl apply -f monitor-serviceaccount.yaml
sa賬号授權
# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
設定共享目錄和安裝nfs-provisioner程式
monitor-nfs-deploment.yaml資源清單檔案如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
spec:
selector:
matchLabels:
app: nfs-provisioner
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-provisioner
spec:
nodeName: node01
serviceAccount: nfs-provisioner #上一步中的sa賬号
containers:
- name: nfs-provvisioner
image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 #特别注意是為上述中的鏡像版本
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: example.com/nfs #關聯至pv的provisioner字段
- name: NFS_SERVER
value: 192.168.2.73 # nfs伺服器位址,根據實際情況修改
- name: NFS_PATH
value: /data/monitor #nfs共享的目錄,根據實際情況修改
volumes:
- name: nfs-client-root
nfs:
server: 192.168.2.73
path: /data/monitor
# kubectl apply -f monitor-nfs-deploment.yaml
通過storageclass建立pv
monitor-nfs-storageclass.yaml資源清單檔案如下:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-monitor #關聯至pvc的storageclassname字段
provisioner: example.com/nfs #建立nfs-provisioner的env
# kubectl apply -f monitor-nfs-storageclass.yaml
建立一個單獨的名稱空間
# kubectl create ns monitor-sa
通過persistentvolumeclaim建立pvc
注意如果pvc和pod不在同一個名稱空間下,會出現如下圖報錯:
monitor-nfs-claim.yaml資源清單檔案如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus
namespace: monitor-sa
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 10Gi
storageClassName: nfs-monitor #與pv進行關聯
# kubectl apply -f monitor-nfs-claim.yaml
以上操作完成nfs存儲卷的建立。
3.2、alertmanager微信告警配置
建立微信位址:https://work.weixin.qq.com/nl/sem/registe?s=c&from=1011017349&bd_vid=8204533222119969491
企業微信告警配置檔案alertmanager-wx.yaml:
kind: ConfigMap
apiVersion: v1
metadata:
name: alertmanager
namespace: monitor-sa
data:
alertmanager.yml: |
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.163.com:25'
smtp_from: '****' #163郵箱
smtp_auth_username: '******'
smtp_auth_password: '********' #163郵箱授權碼
smtp_require_tls: false
templates:
- "/usr/local/prometheus/alertmanager/template/default.tmpl"
route:
group_by: [alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 10m
receiver: prometheus
receivers:
- name: 'prometheus'
wechat_configs:
- corp_id: 企業資訊("我的企業"--->"CorpID"[在底部])
to_user: '@all'
agent_id: 企業微信("企業應用"-->"自定應用"[Prometheus]--> "AgentId")
api_secret: 企業微信("企業應用"-->"自定應用"[Prometheus]--> "Secret")
# kubectl apply -f alertmanager-wx.yaml
設定微信告警模闆
alertmanager-wx-template-configmap.yaml資源清單檔案:
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: null
name: alertmanager-templates
namespace: monitor-sa
data:
default.tmpl: |
{{ define "wechat.default.message" }}
{{ range $i, $alert :=.Alerts }}
========監控報警==========
告警狀态:{{ .Status }}
告警級别:{{ $alert.Labels.severity }}
告警類型:{{ $alert.Labels.alertname }}
告警應用:{{ $alert.Annotations.summary }}
告警主機:{{ $alert.Labels.instance }}
告警詳情:{{ $alert.Annotations.description }}
觸發閥值:{{ $alert.Annotations.value }}
告警時間:{{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
========end==========
{{ end }}
{{ end }}
# kubectl apply -f alertmanager-wx-template-configmap.yaml
3.3、部署prometheus-alertmanager
#建立一個sa賬号monitor
# kubectl create serviceaccount monitor -n monitor-sa
#把sa賬号monitor通過clusterrolebing綁定到clusterrole 上
# kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin --serviceaccount=monitor-sa:monitor
# kubectl -n monitor-sa create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.key --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/ca.crt
建立prometheus和alertmanager配置檔案
特别注意自己建立的命名空間是否這個一緻
特别注意修改自己主機IP位址
# kubectl apply -f prometheus-alertmanager-cfg.yaml
prometheus+alertmanager服務資源清單檔案prometheus-alertmanager-deploy.yaml
挂載之前通過nfs建立pvc存儲卷
将prometheus和alertmanager鏡像上傳至node01節點
# docker load -i alertmanager.tar.gz
# docker load -i prometheus-2-2-1.tar.gz
# kubectl apply -f prometheus-alertmanager-deploy.yaml
prometheus+alertmanager添加service(alertmanager-svc.yaml、prometheus-svc.yaml)
# kubectl apply -f alertmanager-svc.yaml
# kubectl apply -f prometheus-svc.yaml
prometheus的targets界面
alertmanager告警界面
企業微信的告警資訊
4、監控采集方式
4.1、node-exporter
node-exporter 可以采集機器(實體機、虛拟機、雲主機等)的監控名額資料,能夠采集到的名額包
括 CPU, 記憶體,磁盤,網絡,檔案數等資訊。
在master01和node01節點上解壓鏡像
# docker load -i node-exporter.tar.gz
在master01執行資源清單檔案
# kubectl apply -f node-export.yaml
在prometheus檢視監控
4.2、pushgateway
在node01節點解壓鏡像并且啟動鏡像
# docker load -i pushgateway.tar.gz
# docker run -d --name=pushgateway -p 9091:9091 prom/pushgateway:latest
在master01節點增加一個關于job配置并且更新configmap(prometheus-alertmanager-cfg.yaml )
- job_name: 'pushgateway'
scrape_interval: 5s
static_configs:
- targets: ['192.168.2.74:9091']
# kubectl apply -f prometheus-alertmanager-cfg.yaml
# kubectl delete -f prometheus-alertmanager-deploy.yaml
# kubectl apply -f prometheus-alertmanager-deploy.yaml
prometheus web頁面檢視連接配接情況
在node01節點通過pushgateway web管理頁面看到,暫時為空,沒有資料
在master01上模拟服務資料推送至pushgateway,然後pushgateway将資料轉給prometheus
# vim push.sh
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.2.73"
cat <<EOF | curl --data-binary @- http://192.168.2.74:9091/metrics/job/$job_name/instance/$instance_name
#TYPE node_memory_usages gauge
node_memory_usages $node_memory_usages
EOF
# crontab -e
* * * * /bin/bash /root/push.sh
在pushgateway web管理頁面檢視資料
在prometheus檢視資料
5、grafana資料可視化
5.1、grafana基礎配置
在node01節點解壓grafana鏡像
# docker load -i heapster-grafana-amd64_v5_0_4.tar.gz
在master01節點更新grafana資源清單檔案
# kubectl apply -f grafana.yaml
添加資料源
特别注意:name:Prometheus首字母大寫
5.2、node模闆導入(用于監控節點伺服器資源)
導入模闆
導入主機監控模闆
grafana資料展示