天天看點

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

1、prometheus概述

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

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&#39;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不在同一個名稱空間下,會出現如下圖報錯:

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
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存儲卷的建立。

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

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: &#39;smtp.163.com:25'
      smtp_from: &#39;****'  #163郵箱
      smtp_auth_username: &#39;******'
      smtp_auth_password: &#39;********' #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: &#39;prometheus'
      wechat_configs:
      - corp_id: 企業資訊("我的企業"--->"CorpID"[在底部]) 
        to_user: &#39;@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配置檔案

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

特别注意自己建立的命名空間是否這個一緻

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

特别注意修改自己主機IP位址

# kubectl apply  -f  prometheus-alertmanager-cfg.yaml      

prometheus+alertmanager服務資源清單檔案prometheus-alertmanager-deploy.yaml

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

挂載之前通過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界面

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

alertmanager告警界面

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

企業微信的告警資訊

【kubernetes】基于kubernetes監控系統--prometheus+grafana+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檢視監控

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

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: &#39;pushgateway'
      scrape_interval: 5s
      static_configs:
      - targets: [&#39;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頁面檢視連接配接情況

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

在node01節點通過pushgateway web管理頁面看到,暫時為空,沒有資料

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

在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管理頁面檢視資料

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

在prometheus檢視資料

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

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      

添加資料源

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

特别注意:name:Prometheus首字母大寫

5.2、node模闆導入(用于監控節點伺服器資源)

導入模闆

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

導入主機監控模闆

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

grafana資料展示

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager

5.3、docker模闆導入(用于監控pod資源)

【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager
【kubernetes】基于kubernetes監控系統--prometheus+grafana+alertmanager