簡介
整體概括
本文章主要介紹如何全面監控k8s
- 使用metric-server收集資料給k8s集 群内使用,如kubectl,hpa,scheduler等
- 使用prometheus-operator部署prometheus,存儲監控資料
- 使用kube-state-metrics收集k8s叢集内資源對象資料
- 使用node_exporter收集叢集中各節點的資料
- 使用prometheus收集apiserver,scheduler,controller-manager,kubelet元件資料
- 使用alertmanager實作監控報警
- 使用grafana實作資料可視化
prometheus-operator簡介
prometheus-operator是一個整合prometheus和operator的項目,prometheus是一個集資料收集存儲,資料查詢,資料圖表顯示于一身的開源監控元件。operator是由coreos開源一套在k8s上管理應用的軟體,通過operator可以友善的實作部署,擴容,删除應用等功能。
prometheus-operator利用k8s的CustomResourceDefinitions功能實作了隻需要像寫原生kubectl支援的yaml檔案一樣,輕松收集應用資料,配置報警規則等,包含如下CRDs :
- Prometheus 用于部署Prometheus 執行個體
- ServiceMonitor 用于配置資料收集,建立之後會根據DNS自動發現并收集資料
- PrometheusRule 用于配置Prometheus 規則,處理規整資料和配置報警規則
- Alertmanager 用于部署報警執行個體
安裝
環境說明
收集kube-controller-manager,kube-scheduler資料,需要配置元件監聽0.0.0.0位址
二進制安裝啟動時添加如下參數 --address=0.0.0.0
如果使用kubeadm啟動的叢集,初始化時加入如下參數
controllerManagerExtraArgs:
address: 0.0.0.0
schedulerExtraArgs:
address: 0.0.0.0
複制代碼
如果是已經啟動之後的叢集,可以使用如下指令修改
sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --address=127.0.0.1/- --address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml
複制代碼
收集kubelet相關資料時需要配置kubelet使用如下認證方式。使用kubeadm預設情況下已經開啟
--authentication-token-webhook=true
--authorization-mode=Webhook
複制代碼
部署metric-server
# 下載下傳
mkdir k8s-monitor && cd k8s-monitor
git clone https://github.com/kubernetes-incubator/metrics-server.git
cd metrics-server && git checkout v0.2.1 && cd ../
# 修改配置(目前版本有bug)
sed -ri '[email protected]/google_containers/metrics-server-amd64:(.*)@mirrorgooglecontainers/metrics-server-amd64:\1@g' metrics-server/deploy/1.8+/metrics-server-deployment.yaml
sed -ri 's@--source=kubernetes.summary_api:.*@--source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true\&kubeletPort=10250\&insecure=true@' metrics-server/deploy/1.8+/metrics-server-deployment.yaml
# 部署
kubectl create -f metrics-server/deploy/1.8+/
# 檢視狀态
kubectl get pods -n kube-system
# 測試擷取資料 # 由于采集資料間隔為1分鐘 # 等待數分鐘後檢視資料
NODE=$(kubectl get nodes | grep 'Ready' | head -1 | awk '{print $1}')
METRIC_SERVER_POD=$(kubectl get pods -n kube-system | grep 'metrics-server' | awk '{print $1}')
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/$NODE
kubectl top node $NODE
kubectl top pod $METRIC_SERVER_POD -n kube-system
複制代碼
下載下傳相關部署檔案
git clone https://github.com/mgxian/k8s-monitor.git
cd k8s-monitor
複制代碼
部署prometheus-operator
# 建立 namespace
kubectl apply -f monitoring-namespace.yaml
# 部署
kubectl apply -f prometheus-operator.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
kubectl get crd
複制代碼
部署k8s元件服務
# 部署
kubectl apply -f kube-k8s-service.yaml
# 檢視
kubectl get svc -n kube-system
複制代碼
部署node_exporter
# 部署
kubectl apply -f node_exporter.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
複制代碼
部署kube-state-metrics
# 部署
kubectl apply -f kube-state-metrics.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
複制代碼
部署prometheus
# 部署
kubectl apply -f prometheus.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
複制代碼
配置資料收集
# 部署
kubectl apply -f kube-servicemonitor.yaml
# 檢視
kubectl get servicemonitors -n monitoring
複制代碼
檢視prometheus中的資料
# 檢視 nodeport
kubectl get svc -n monitoring | grep prometheus-k8s
# 擷取通路連結 # 11.11.11.111 為其中一個node ip
NODE_IP='11.11.11.112'
PROMETHEUS_NODEPORT=$(kubectl get svc -n monitoring | grep prometheus-k8s | awk '{print $(NF-1)}' | cut -d ':' -f 2 | cut -d '/' -f 1)
echo "http://$NODE_IP:$PROMETHEUS_NODEPORT/" 複制代碼
prometheus首頁
生成圖表
container_network_receive_bytes_total{namespace="monitoring", name=~".prometheus."}
檢視收集資料的端點
檢視資料收集服務發現
部署grafana
# 部署
kubectl apply -f grafana.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
# 檢視 nodeport
kubectl get svc -n monitoring | grep grafana
# 擷取通路連結 # 11.11.11.111 為其中一個node ip
NODE_IP='11.11.11.112'
GRAFANA_NODEPORT=$(kubectl get svc -n monitoring | grep grafana | awk '{print $(NF-1)}' | cut -d ':' -f 2 | cut -d '/' -f 1)
echo "http://$NODE_IP:$GRAFANA_NODEPORT/" 複制代碼
部署alertmanager
# 部署
kubectl apply -f alertmanager.yaml
# 檢視
kubectl get pods -n monitoring
kubectl get svc -n monitoring
# 檢視 nodeport
kubectl get svc -n monitoring | grep alertmanager-main
# 擷取通路連結 # 11.11.11.111 為其中一個node ip
NODE_IP='11.11.11.112'
ALERTMANAGER_MAIN_NODEPORT=$(kubectl get svc -n monitoring | grep alertmanager-main | awk '{print $(NF-1)}' | cut -d ':' -f 2 | cut -d '/' -f 1)
echo "http://$NODE_IP:$ALERTMANAGER_MAIN_NODEPORT/" 複制代碼
檢視圖表
叢集狀态
叢集狀态以命名空間視角
POD狀态
參考文檔
本文轉自掘金-
k8s全棧監控