本文章主要介紹如何全面監控k8snode
prometheus-operator是一個整合prometheus和operator的項目,prometheus是一個集數據收集存儲,數據查詢,數據圖表顯示於一身的開源監控組件。operator是由coreos開源一套在k8s上管理應用的軟件,經過operator能夠方便的實現部署,擴容,刪除應用等功能。git
prometheus-operator利用k8s的CustomResourceDefinitions功能實現了只須要像寫原生kubectl支持的yaml文件同樣,輕鬆收集應用數據,配置報警規則等,包含以下CRDs :github
收集kube-controller-manager,kube-scheduler數據,須要配置組件監聽0.0.0.0地址web
二進制安裝啓動時添加以下參數 --address=0.0.0.0api
若是使用kubeadm啓動的集羣,初始化時加入以下參數app
controllerManagerExtraArgs:
address: 0.0.0.0
schedulerExtraArgs:
address: 0.0.0.0
複製代碼
若是是已經啓動以後的集羣,能夠使用以下命令修改ide
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
複製代碼
# 下載
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 's@gcr.io/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
複製代碼
# 建立 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
複製代碼
# 部署
kubectl apply -f kube-k8s-service.yaml
# 查看
kubectl get svc -n kube-system
複製代碼
# 部署
kubectl apply -f node_exporter.yaml
# 查看
kubectl get pods -n monitoring
kubectl get svc -n monitoring
複製代碼
# 部署
kubectl apply -f kube-state-metrics.yaml
# 查看
kubectl get pods -n monitoring
kubectl get svc -n monitoring
複製代碼
# 部署
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
複製代碼
# 查看 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主頁ui
生成圖表 container_network_receive_bytes_total{namespace="monitoring", name=~".prometheus."}google
查看收集數據的端點
查看數據收集服務發現
# 部署
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/"
複製代碼
# 部署
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狀態