隨著 kubernetes 的大規(guī)模使用,對 kubernetes 組件及其上運(yùn)行服務(wù)的監(jiān)控也是非常重要的一個環(huán)節(jié),目前開源的監(jiān)控組件有很多種,例如 cAdvisor、Heapster、metrics-server、kube-state-metrics、Prometheus 等,對監(jiān)控數(shù)據(jù)的可視化查看組件有 Dashboard、 Prometheus、Grafana 等,本文會介紹 kube-dashboard 和基于 prometheus 搭建數(shù)據(jù)可視化監(jiān)控。
kubernetes 版本:v1.12
一、kubernetes-dashboard 的部署
1、創(chuàng)建 kubernetes-dashboard
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl get svc -n kube-system | grep kubernetes-dashboard
kubernetes-dashboard ClusterIP 10.101.203.44 <none> 443/TCP 2h
$ kubectl get pod -n kube-system | grep kubernetes-dashboard
kubernetes-dashboard-65c76f6c97-8npsv 1/1 Running 0 2h
所需鏡像下載地址:k8s-system-images
2、使用 nodePort 方式訪問 kubernetes-dashboard
nodeport 的訪問方式雖然有性能損失但是比較簡單,kubernetes-dashboard 默認(rèn)使用 clusterIP 的方式暴露服務(wù),修改 kubernetes-dashboard svc 使用 nodePort 方式:
$ kubectl edit svc -n kube-system
...
spec:
clusterIP: 10.101.203.44
externalTrafficPolicy: Cluster
ports:
- nodePort: 8004 // 添加 nodeport 端口
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort // 將 ClusterIP 修改為 NodePort
...
nodePort 端口默認(rèn)為 30000-32767,若使用其他端口,需要修改 apiserver 的啟動參數(shù) --service-node-port-range 來指定 nodePort 范圍,如:--service-node-port-range 8000-9000。
3、創(chuàng)建 kubernetes-dashboard 管理員角色
kubernetes-dashboard-admin.yaml:
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
創(chuàng)建角色并獲取 token:
$ kubectl apply -f kubernetes-dashboard-admin.yaml
$ kubectl describe secrets `kubectl get secret -n kube-system | grep dashboard-admin | awk '{print $1}'` -n kube-system
Name: dashboard-admin-token-hrhfd
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: 76805bdb-6047-11e9-ba0d-525400c322d9
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4taHJoZmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNzY4MDViZGItNjA0Ny0xMWU5LWJhMGQtNTI1NDAwYzMyMmQ5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.hJJRyp_O4sGvIULj3BhqidCkkPnD4A2AtnpkXJoEPCALaaQHC8zhCA5-nDNlo2fiEggZ02UZPwiyGxKKFPC57UlKhjTf5zYcMIhELVXlj5FdBmjzCZcCHVFF4tj_rCoOFlZi6fQ3vNCcX8CtLxX_OsH1YXaFVuUmR1gYm97hbyuO382_k3tFIPXFP3QG8zUtc_7QMkeMNEakJZLCvkW8xdlaCuC-GVAMhZl5Kq1MSthuF-8HY7KaXhvqQzfD4DQZrdQ7vf_7NG3rdvhsj8nQ__TTe1W0RjqwkQuxg5YdE4gbAsxwJjkek-N0K9HfnZhkS9WosaUaUe9pZaGZ9akqyQ
token 是訪問 dashboard 需要用的。
若沒有安裝 kube-proxy,可以參考官方提供使用 kubectl proxy 的方式訪問:
$ kubectl proxy --address=IP --disable-filter=true
訪問 http://IP:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
已部署 kube-proxy 的可直接訪問 https://IP:nodePort

選擇令牌方式使用上面生成的 token 登錄。

Dashboard 可以使用 Ingress、Let's Encrypt 等多種方式配置 ssl,關(guān)于 ssl 的詳細(xì)配置此處不進(jìn)行詳解。
二、部署 prometheus
prometheus 作為 CNCF 生態(tài)圈中的重要一員,其活躍度僅次于 Kubernetes, 現(xiàn)已廣泛用于 Kubernetes 集群的監(jiān)控系統(tǒng)中。prometheus 的部署相對比較簡單,社區(qū)已經(jīng)有了 kube-prometheus,kube-prometheus 會部署包含 prometheus-operator、grafana、kube-state-metrics 等多個組件。
$ git clone https://github.com/coreos/kube-prometheus
$ kubectl apply -f manifests/
為了使用簡單,我也會將 prometheus 和 grafana 的端口修改為 nodePort 的方式進(jìn)行暴露:
$ kubectl edit svc prometheus-k8s -n monitoring
$ kubectl edit svc grafana -n monitoring
$ kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main NodePort 10.102.81.118 <none> 9093:8007/TCP 5d1h
alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 5d1h
grafana NodePort 10.96.19.82 <none> 3000:8006/TCP 5d1h
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 5d1h
node-exporter ClusterIP None <none> 9100/TCP 5d1h
prometheus-adapter ClusterIP 10.107.103.58 <none> 443/TCP 5d1h
prometheus-k8s NodePort 10.110.222.41 <none> 9090:8005/TCP 5d1h
prometheus-operated ClusterIP None <none> 9090/TCP 5d1h
prometheus-operator ClusterIP None <none> 8080/TCP 5d1h
$ kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 4d
alertmanager-main-1 2/2 Running 0 4d
alertmanager-main-2 2/2 Running 0 4d
grafana-9d97dfdc7-qfjts 1/1 Running 0 4d
kube-state-metrics-74d7dcd7dc-qfz5m 4/4 Running 0 3d11h
node-exporter-5cdl2 2/2 Running 0 4d
prometheus-adapter-b7d894c9c-dvzzq 1/1 Running 0 4d
prometheus-k8s-0 3/3 Running 1 2d2h
prometheus-k8s-1 3/3 Running 1 4d
prometheus-operator-77b8b97459-7qfxj 1/1 Running 0 4d
上面幾個組件成功運(yùn)行后就可以在頁面訪問 prometheus 和 ganfana :

進(jìn)入 grafana 的 web 端,默認(rèn)用戶名和密碼均為 admin:

grafana 支持導(dǎo)入其他的 Dashboard,在 grafana 官方網(wǎng)站可以搜到大量與 k8s 相關(guān)的 dashboard。
三、總結(jié)
本文介紹了對 kubernetes 和容器監(jiān)控比較成熟的兩個方案,雖然目前開源的方案比較多,但是要形成采集、存儲、展示、報警一個完成的體系還需要在使用過程中不斷探索與完善。