1.1 准備工作
首先要搭建K8S集群,請參考另一篇文檔: https://www.cnblogs.com/taoweizhong/p/10467795.html
在此基礎上,本文安裝K8s dashboard、prometheus、grafana進行監控(注意上篇文檔中一個虛擬機的IP地址和這里有不同,原因沒有配置靜態IP)。
本文中涉及容器的部署方式說明:
- K8s dashboard采用K8S集群管理的部署方式
- prometheus和grafana僅僅采用容器化部署,沒有采用K8S集群管理的部署。
本文需要下載對應的鏡像如下:
prom/prometheus latest
grafana/grafana latest
docker.io/siriuszg/kubernetes-dashboard-amd64 latest
docker.io/google/cadvisor v0.24.1(不知道為啥latest無法連接上prometheus)
quay.io/prometheus/node-exporter latest
本文組網如下圖:
1.2 K8S Dashboard
K8S Dashboard是官方的一個基於WEB的用戶界面(個人覺得比較簡陋),專門用來管理K8S集群,並可展示集群的狀態。K8S集群安裝好后默認沒有包含Dashboard,我們需要額外創建它,下面我們具體實現如何安裝它。
第一步:查找鏡像
[root@slave1 taoweizhong]# docker search dashboard
docker.io docker.io/siriuszg/kubernetes-dashboard-amd64
docker.io/siriuszg/kubernetes-dashboard-amd64 v1.5.1 be6763d992e0 2 years ago 104 MB
這里省略了其他類似鏡像。
第二步:拉取鏡像:
[root@slave1 taoweizhong]# docker pull docker.io/siriuszg/kubernetes-dashboard-amd64
第三步:編寫腳本(這里dashboard采用K8S集群管理)
dashboard-service.yaml
[root@master democonfig]# cat dashboard-service.yaml
kind: Service
apiVersion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 9090
selector:
app: kubernetes-dashboard
[root@master democonfig]# cat kubernetes-dashboard.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
containers:
- name: kubernetes-dashboard
image: docker.io/siriuszg/kubernetes-dashboard-amd64:v1.5.1
imagePullPolicy: Always
ports:
- containerPort: 9090
protocol: TCP
args:
- --apiserver-host=http://192.168.135.128:8080
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
第四步:執行並部署
[root@master democonfig]# kubectl create -f kubernetes-dashboard.yaml
[root@master democonfig]# kubectl create -f dashboard-service.yaml
這里對應的刪除腳本為:
[root@master democonfig]# kubectl delete -f kubernetes-dashboard.yaml
[root@master democonfig]# kubectl delete -f dashboard-service.yaml
第五步:訪問Dashboard
先查詢下容器是否啟動:
[root@master democonfig]# kubectl get pods --all-namespaces -o wide
(注意這里是namespace為 kube-system,查詢時需要增加命名空間)
打開瀏覽器並輸入:
http://192.168.135.128:8080/ui 或者
http://192.168.135.128:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/
遇到的問題說明:
1.關閉iptables防火牆 (如果是防火牆原因導致的master節點無法ping通node之上的Pod節點)
systemctl stop iptables
systemctl disable iptables
即使關閉了防火牆跨主機間容器、pod始終無法ping通
這是由於linux還有底層的iptables,所以在node上分別執行:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n
2.由於關閉或者重啟docker而導致的網絡未更新問題引起。
Master節點啟動 注意先啟動kubernetes,再啟動docker(如果是關閉docker或者重啟docker導致的網絡問題,重啟master和node節點,注意重啟順序)
主Master節點重啟順序
systemctl enable docker
systemctl enable etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart flanneld docker
Node從節點重啟順序
systemctl restart kubelet kube-proxy
systemctl restart flanneld docker
systemctl enable flanneld kubelet kube-proxy docker
1.3 Prometheus安裝
Prometheus 是由 SoundCloud 開發的開源監控報警系統和時序列數據庫(TSDB),自2012年起,許多公司及組織已經采用 Prometheus,該項目有着非常活躍的開發者和用戶社區,現在已成為一個獨立的開源項目核。
其工作流程是:Prometheus server 定期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,或者從其他的 Prometheus server 中拉 metrics。
Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報。Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警。在圖形界面中,可視化采集數據。
Prometheus 中存儲的數據為時間序列,是由 metric 的名字和一系列的標簽(鍵值對)唯一標識的,不同的標簽則代表不同的時間序列。
metric 名字:該名字應該具有語義,一般用於表示 metric 的功能,例如:http_requests_total, 表示 http 請求的總數。
標簽:使同一個時間序列有了不同維度的識別。例如 http_requests_total{method="Get"} 表示所有 http 請求中的 Get 請求。當 method="post" 時,則為新的一個 metric。
樣本:實際的時間序列,每個序列包括一個 float64 的值和一個毫秒級的時間戳。
格式:<metric name>{<label name>=<label value>, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。
下面介紹其安裝步驟(這里直接采用容器化安裝,非基於K8S集群管理安裝,因此在K8S的pods中看不到):
【步驟1到4在master節點安裝】
第一步:查找鏡像
[root@master prometheus]# docker search prometheus
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
prom/prometheus 692 [OK]
第二步:拉取鏡像
[root@master prometheus]# docker pull prom/prometheus
第三步編寫:prometheus.yml文件
root@master prometheus-1.7.1.linux-amd64]# cat prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.135.128:9090']
- job_name: 'kubernetes-nodes-cadvisor'
kubernetes_sd_configs:
- api_server: 'http://192.168.135.128:8080'
role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__meta_kubernetes_role]
action: replace
target_label: kubernetes_role
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:8080'
target_label: __address__
- job_name: 'kubernetes_node'
kubernetes_sd_configs:
- role: node
api_server: 'http://192.168.135.128:8080'
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
說明:一個典型的配置格式
global:
# 抓取間隔,默認為 1m
[ scrape_interval: <duration> | default = 1m ]
# 抓取超時時間,默認為 10s
[ scrape_timeout: <duration> | default = 10s ]
# 規則評估間隔,默認為 1m
[ evaluation_interval: <duration> | default = 1m ]
# 抓取配置
scrape_configs:
[ - <scrape_config> ... ]
# 規則配置
rule_files:
[ - <filepath_glob> ... ]
# 告警配置
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
第四步:啟動鏡像
[root@master prometheus]# docker run -d -p 9090:9090 --name=prometheus -v /home/taoweizhong/data/prometheus/prometheus-1.7.1.linux-amd64/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
由於是容器化安裝, 這里需要注意虛擬機上編寫的prometheus.yml 文件位置,否則會啟動錯誤。
【步驟5到7需要每個slave節點上都需要安裝】
在下面的步驟開始之前先了解下:
Prometheus提供的NodeExporter項目可以提取主機節點的關鍵度量指標,通過Kubernetes的DeamonSet模式可以在各主機節點上部署一個NodeExporter實例,實現對主機性能指標數據的監控。
Cadvisor Google用來監測單節點的資源信息的監控工具,提供了一目了然的單節點多容器的資源監控功能。Google的Kubernetes中也缺省地將其作為單節點的資源監控工具,各個節點缺省會被安裝上Cadvisor。總結起來主要兩點:展示 Host 和容器兩個層次的監控數據;展示歷史變化數據。
由於 cAdvisor 提供的操作界面簡陋,且需要在不同頁面之間跳轉,只能監控一個 host。但 cAdvisor 的一個亮點是它可以將監控到的數據導出給第三方工具,由這些工具進一步加工處理。我們可以把 cAdvisor 定位為一個監控數據收集器,收集和導出數據是它的強項,而非展示數據。
第五步:拉取cadvisor和node-exporter鏡像
[root@slave1 taoweizhong]# docker pull docker.io/google/cadvisor
[root@slave1 taoweizhong]# docker pull quay.io/prometheus/node-exporter:v0.24.1
注意這里拉取node-exporter的是:v0.24.1版本,latest不知為啥無法和Prometheus集成起來。
第六步:啟動cadvisor和node-exporter鏡像
[root@slave1 taoweizhong]#docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net=host quay.io/prometheus/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
[root@slave1 taoweizhong]#docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --privileged=true --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor --restart=always google/cadvisor:v0.24.1
這里參數不做具體說明了,這兩個容器的目的是在slave節點采集數據給Prometheus
第七步:檢查鏡像啟動狀態
第八步:先查看下cadvisor 和node-exporter在http端口提供的指標項
在瀏覽器中輸入:http://192.168.135.136:9100/metrics
(注意:IP地址為部署容器的宿主機,端口是容器映射到虛擬機上的端口) node-exporter返回的指標如下,有很多指標:
在瀏覽器中輸入:http://192.168.135.136:8080/metrics
(注意:IP地址為部署容器的宿主機,端口是容器映射到虛擬機上的端口)cadvisor返回的指標如下,有很多指標:
第九步:查看cadvisor 的簡陋圖形界面:
cAdvisor 會顯示當前 host 的資源使用情況,包括 CPU、內存、網絡、文件系統等。
第十步:訪問prometheus圖形界面:
在運行后,訪問 http://192.168.135.128:9090/graph (IP地址是prometheus容器所在宿主機,端口是啟動時候指定的映射到虛擬機端口)
第十一步:切換到target(從菜單status->Targets),這樣Prometheus的安裝就成功了,我們可以看到EndPoint已經連接正常UP,如果這里狀態為down,表示連接不正常,需要查看原因,可能是防火牆之類的。
由於Grafana提供了很漂亮的圖形界面,下面我們將Prometheus和Grafana集成起來。
1.4 Grafana安裝
Grafana是一個開源的度量分析與可視化套件。經常被用作基礎設施的時間序列數據和應用程序分析的可視化。Grafana支持許多不同的數據源。每個數據源都有一個特定的查詢編輯器,該編輯器定制的特性和功能是公開的特定數據來源。 官方支持以下數據源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。
基本概念說明:
Data Source:grafana確切的說是一個前端展示工具,將數據以非常美觀直接的圖形展示出來。那么這些數據必須有一個來源吧,grafana獲取數據的地方就稱為Data Source。
DashBoard:儀表盤,就像汽車儀表盤一樣可以展示很多信息,包括車速,水箱溫度等。Grafana的DashBoard就是以各種圖形的方式來展示從Datasource拿到的數據。
Row:DashBoard的基本組成單元,一個DashBoard可以包含很多個row。一個row可以展示一種信息或者多種信息的組合,比如系統內存使用率,CPU五分鍾及十分鍾平均負載等。所以在一個DashBoard上可以集中展示很多內容。
Panel:面板,實際上就是row展示信息的方式,支持表格(table),列表(alert list),熱圖(Heatmap)等多種方式,具體可以去官網上查閱。
Query Editor:用來指定獲取哪一部分數據。類似於sql查詢語句,比如你要在某個row里面展示test這張表的數據,那么Query Editor里面就可以寫成select *from test。
Organization:org是一個很大的概念,每個用戶可以擁有多個org,grafana有一個默認的main org。用戶登錄后可以在不同的org之間切換,前提是該用戶擁有多個org。不同的org之間完全不一樣,包括datasource,dashboard等都不一樣。
User:這個概念應該很簡單,不用多說。Grafana里面用戶有三種角色admin,editor,viewer。admin權限最高,可以執行任何操作,包括創建用戶,新增Datasource,創建DashBoard。editor角色不可以創建用戶,不可以新增Datasource,可以創建DashBoard。viewer角色僅可以查看DashBoard。在2.1版本及之后新增了一種角色read only editor(只讀編輯模式),這種模式允許用戶修改DashBoard,但是不允許保存。每個user可以擁有多個organization。
這里我采用容器化部署,但是grafana容器並沒有納入K8S管理范圍,因此安裝后使用kubectl get pod命令是查找不到的,具體操作如下:
第一步:查找鏡像
[root@master prometheus-1.7.1.linux-amd64]# docker search grafana
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
grafana/grafana The official Grafana docker container 1084
【這里省略了一部分鏡像列表】
第二步:下載鏡像
[root@master prometheus-1.7.1.linux-amd64]# docker pull grafana/Grafana
第三步:啟動鏡像
[root@master prometheus-1.7.1.linux-amd64]# docker run -d --name grafana -p 3000:3000 grafana/grafana Grafana
d68d28806b435bee1cce00745820be92dc3f39353e3aabf6c72eb5ab15a0b652
注意端口映射到3000,后續訪問需要
第四步:瀏覽界面
在瀏覽器打開 http://192.168.135.128:3000 (這里是虛擬機的IP地址),輸入默認用戶名密碼 (admin/admin) 可以進入 Grafana 。
第五步:數據源配置
Configuration - Data Resource - Add Data Resource
編輯數據源,輸入正確的URL:
第六步:選擇Prometheus2.0的dashboard(默認已經安裝),這樣我們就可以看到漂亮的監控界面了。
下面我們演示如何更換換一個dashboard:
grafana可以支持根據自己的需求手動新建一個 Dashboard, grafana 的官方網站上有很多公共的 Dashboard 可以供使用,我們這里可以使用(dashboard id 為315)這個 Dashboard 來展示 Kubernetes 集群的監控信息:
第一步:先下載下來,地址如下
https://grafana.com/dashboards/315/revisions
第二步:在左側側邊欄 Create 中點擊import導入,將上面第一個輸入框輸入315,下面文本框直接將下載的文件內容復制到里面,點擊load
第三步:選擇prometheus這個名字的數據源,執行import操作,就可以進入到 dashboard 頁面:
第四步:這樣就可以看到結果了(下面截圖供參考學習)
--結束---