Prometheus Operator 學習筆記

文檔說明

實驗環(huán)境:kubernetes Version v1.10.9
網(wǎng)絡CNI:fannel
存儲CSI: NFS Dynamic Class
DNS: CoreDNS

背景

在學習Prometheus Operator 的部署,Prometheus 在代碼上就已經(jīng)對 Kubernetes 有了原生的支持荠割,可以通過服務發(fā)現(xiàn)的形式來自動監(jiān)控集群反浓,因此我們可以使用另外一種更加高級的方式來部署 Prometheus:Operator 框架址愿。

Prometheus-Operator的架構圖:

Prometheus-Operator的架構圖

上圖是Prometheus-Operator官方提供的架構圖,其中Operator是最核心的部分落塑,作為一個控制器,他會去創(chuàng)建PrometheusServiceMonitor厌衙、AlertManager以及PrometheusRule4個CRD資源對象,然后會一直監(jiān)控并維持這4個資源對象的狀態(tài)绞绒。

其中創(chuàng)建的prometheus這種資源對象就是作為Prometheus Server存在婶希,而ServiceMonitor就是exporter的各種抽象,exporter前面我們已經(jīng)學習了蓬衡,是用來提供專門提供metrics數(shù)據(jù)接口的工具喻杈,Prometheus就是通過ServiceMonitor提供的metrics數(shù)據(jù)接口去 pull 數(shù)據(jù)的彤枢,當然alertmanager這種資源對象就是對應的AlertManager的抽象,而PrometheusRule是用來被Prometheus實例使用的報警規(guī)則文件筒饰。

這樣我們要在集群中監(jiān)控什么數(shù)據(jù)缴啡,就變成了直接去操作 Kubernetes 集群的資源對象了,是不是方便很多了龄砰。上圖中的 ServiceServiceMonitor 都是 Kubernetes 的資源盟猖,一個 ServiceMonitor 可以通過 labelSelector 的方式去匹配一類 Service,Prometheus 也可以通過 labelSelector 去匹配多個ServiceMonitor换棚。

安裝Operator

$ git clone https://github.com/coreos/prometheus-operator
$ cd contrib/kube-prometheus/manifests/
$ ls
00namespace-namespace.yaml                                         node-exporter-clusterRole.yaml
0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml    node-exporter-daemonset.yaml
......

prometheus-serviceMonitorKubelet.yaml 進行簡單的修改式镐,因為默認情況下,這個 ServiceMonitor 是關聯(lián)的 kubelet 的10250端口去采集的節(jié)點數(shù)據(jù)固蚤,而我們前面說過為了安全娘汞,這個 metrics 數(shù)據(jù)已經(jīng)遷移到10255這個只讀端口上,我們只需要將文件中的https-metrics更改成http-metrics即可

root@k8s-master-1:~/k8s_manifests/prometheus-operator# cat prometheus-serviceMonitorKubelet.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: kubelet
  name: kubelet
  namespace: monitoring
spec:
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    honorLabels: true
    interval: 30s
    port: http-metrics
    scheme: http
    tlsConfig:
      insecureSkipVerify: true
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    honorLabels: true
    interval: 30s
    path: /metrics/cadvisor
    port: http-metrics
    scheme: http
    tlsConfig:
      insecureSkipVerify: true
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: kubelet

修改完成后,直接在該文件夾下面執(zhí)行創(chuàng)建資源命令即可:

root@k8s-master-1:~/k8s_manifests/prometheus-operator# kubectl apply -f .
root@k8s-master-1:~/k8s_manifests/prometheus-operator# ls
00namespace-namespace.yaml                                         grafana-dashboardDefinitions.yaml           node-exporter-clusterRole.yaml                       prometheus-clusterRoleBinding.yaml
0prometheus-operator-0alertmanagerCustomResourceDefinition.yaml    grafana-dashboardSources.yaml               node-exporter-clusterRoleBinding.yaml                prometheus-k8s-ingress.yaml
0prometheus-operator-0prometheusCustomResourceDefinition.yaml      grafana-deployment.yaml                     node-exporter-daemonset-017.yaml                     prometheus-kubeSchedulerService.yaml
0prometheus-operator-0prometheusruleCustomResourceDefinition.yaml  grafana-ingress.yaml                        node-exporter-daemonset.yaml                         prometheus-prometheus.yaml
0prometheus-operator-0servicemonitorCustomResourceDefinition.yaml  grafana-service.yaml                        node-exporter-service.yaml                           prometheus-roleBindingConfig.yaml
0prometheus-operator-clusterRole.yaml                              grafana-serviceAccount.yaml                 node-exporter-serviceAccount.yaml                    prometheus-roleBindingSpecificNamespaces.yaml
0prometheus-operator-clusterRoleBinding.yaml                       kube-controller-manager-endpoints.yaml      node-exporter-serviceMonitor.yaml                    prometheus-roleConfig.yaml
0prometheus-operator-deployment.yaml                               kube-controller-manager-service.yaml        prometheus-adapter-apiService.yaml                   prometheus-roleSpecificNamespaces.yaml
0prometheus-operator-service.yaml                                  kube-scheduler-endpoints.yaml               prometheus-adapter-clusterRole.yaml                  prometheus-rules.yaml
0prometheus-operator-serviceAccount.yaml                           kube-scheduler-service.yaml                 prometheus-adapter-clusterRoleBinding.yaml           prometheus-service.yaml
0prometheus-operator-serviceMonitor.yaml                           kube-state-metrics-clusterRole.yaml         prometheus-adapter-clusterRoleBindingDelegator.yaml  prometheus-serviceAccount.yaml
alertmanager-alertmanager.yaml                                     kube-state-metrics-clusterRoleBinding.yaml  prometheus-adapter-clusterRoleServerResources.yaml   prometheus-serviceMonitor.yaml
alertmanager-secret.yaml                                           kube-state-metrics-deployment.yaml          prometheus-adapter-configMap.yaml                    prometheus-serviceMonitorApiserver.yaml
alertmanager-service.yaml                                          kube-state-metrics-role.yaml                prometheus-adapter-deployment.yaml                   prometheus-serviceMonitorCoreDNS.yaml
alertmanager-serviceAccount.yaml                                   kube-state-metrics-roleBinding.yaml         prometheus-adapter-roleBindingAuthReader.yaml        prometheus-serviceMonitorKubeControllerManager.yaml
alertmanager-serviceMonitor.yaml                                   kube-state-metrics-service.yaml             prometheus-adapter-service.yaml                      prometheus-serviceMonitorKubeScheduler.yaml
coredns-metrics-service.yaml                                       kube-state-metrics-serviceAccount.yaml      prometheus-adapter-serviceAccount.yaml               prometheus-serviceMonitorKubelet.yaml
grafana-dashboardDatasources.yaml                                  kube-state-metrics-serviceMonitor.yaml      prometheus-clusterRole.yaml

部署完成后夕玩,會創(chuàng)建一個名為monitoring的 namespace你弦,所以資源對象對將部署在改命名空間下面,此外 Operator 會自動創(chuàng)建4個 CRD 資源對象:

root@k8s-master-1:~/k8s_manifests/prometheus-operator# kubectl get crd |grep coreos
alertmanagers.monitoring.coreos.com     17d
prometheuses.monitoring.coreos.com      17d
prometheusrules.monitoring.coreos.com   17d
servicemonitors.monitoring.coreos.com   17d

可以在 monitoring 命名空間下面查看所有的 Pod燎孟,其中 alertmanager 和 prometheus 是用 StatefulSet 控制器管理的禽作,其中還有一個比較核心的 prometheus-operator 的 Pod,用來控制其他資源對象和監(jiān)聽對象變化的

root@k8s-master-1:~/k8s_manifests/prometheus-operator# kubectl get pods -n monitoring
NAME                                   READY     STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2       Running   4          17d
alertmanager-main-1                    2/2       Running   6          17d
alertmanager-main-2                    2/2       Running   4          17d
grafana-6d6c4d998d-v9djh               1/1       Running   0          8d
kube-state-metrics-5c5c6f7f8f-frwpk    4/4       Running   0          14d
loki-5c5d8d7d7d-gcvcx                  1/1       Running   0          8d
loki-grafana-996d8c8fc-shm29           1/1       Running   0          8d
loki-promtail-cpqq9                    1/1       Running   0          8d
loki-promtail-k786c                    1/1       Running   0          8d
loki-promtail-lmmn2                    1/1       Running   0          8d
loki-promtail-xlb8b                    1/1       Running   0          8d
node-exporter-8gdh4                    2/2       Running   2          14d
node-exporter-cdmbk                    2/2       Running   0          14d
node-exporter-pqzbf                    2/2       Running   0          14d
node-exporter-x4968                    2/2       Running   0          14d
prometheus-adapter-69466cc54b-vgqpg    1/1       Running   2          17d
prometheus-k8s-0                       3/3       Running   8          13d
prometheus-k8s-1                       3/3       Running   3          11d
prometheus-operator-56954c76b5-rjlbq   1/1       Running   0          14d
root@k8s-master-1:~/k8s_manifests/prometheus-operator# kubectl get svc -n monitoring
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
alertmanager-main       ClusterIP   10.68.209.89    <none>        9093/TCP            17d
alertmanager-operated   ClusterIP   None            <none>        9093/TCP,6783/TCP   17d
grafana                 ClusterIP   10.68.149.168   <none>        3000/TCP            17d
kube-state-metrics      ClusterIP   None            <none>        8443/TCP,9443/TCP   17d
loki                    ClusterIP   10.68.118.118   <none>        3100/TCP            8d
loki-grafana            ClusterIP   10.68.77.53     <none>        80/TCP              8d
node-exporter           ClusterIP   None            <none>        9100/TCP            17d
prometheus-adapter      ClusterIP   10.68.217.16    <none>        443/TCP             17d
prometheus-k8s          ClusterIP   10.68.193.174   <none>        9090/TCP            17d
prometheus-operated     ClusterIP   None            <none>        9090/TCP            17d
prometheus-operator     ClusterIP   None            <none>        8080/TCP            17d

部署Ingress 允許外部訪問

root@k8s-master-1:~/k8s_manifests/prometheus-operator# cat grafana-ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grafana-ui
  namespace: monitoring
spec:
  rules:
  - host: grafana.k8s.io
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: service
        path: /
status:
  loadBalancer: {}

監(jiān)控二進制組件

由于當前集群的部署方式揩页,Master的核心組件Kube-scheduler和kube-controller-manager是通過二進制文件啟動旷偿,而不是以Pod的形式,這是一個非常重要的概念
就和 ServiceMonitor 的定義有關系了爆侣,我們先來查看下 kube-scheduler 組件對應的 ServiceMonitor 資源的定義:(prometheus-serviceMonitorKubeScheduler.yaml)

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: kube-scheduler
  name: kube-scheduler
  namespace: monitoring
spec:
  endpoints:
  - interval: 30s
    port: http-metrics  
  jobLabel: k8s-app
  namespaceSelector: 
    matchNames:
    - kube-system
  selector: 
    matchLabels:
      k8s-app: kube-scheduler
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: kube-controller-manager
  name: kube-controller-manager
  namespace: monitoring
spec:
  endpoints:
  - interval: 30s
    metricRelabelings:
    - action: drop
      regex: etcd_(debugging|disk|request|server).*
      sourceLabels:
      - __name__
    port: http-metrics
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: kube-controller-manager

上面是一個典型的 ServiceMonitor 資源文件的聲明方式萍程,上面我們通過selector.matchLabels在 kube-system 這個命名空間下面匹配具有k8s-app=kube-scheduler這樣的 Service,但是我們系統(tǒng)中根本就沒有對應的 Service兔仰,所以我們需要手動創(chuàng)建一個 Service:
kube-controller-manager-service.yaml
kube-scheduler-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-scheduler
  name: kube-scheduler
  namespace: kube-system
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: http-metrics
    port: 10251
    protocol: TCP
    targetPort: 10251

apiVersion: v1
kind: Service
metadata:
  namespace: kube-system
  name: kube-controller-manager
  labels:
    k8s-app: kube-controller-manager
spec:
  type: ClusterIP
  clusterIP: None
  ports:
  - name: http-metrics
    port: 10252
    targetPort: 10252
    protocol: TCP

kube-controller-manager.service 監(jiān)聽的地址改成0.0.0.0
ExecStart=/opt/kube/bin/kube-controller-manager
--address=0.0.0.0
--master=http://0.0.0.0:8080
kube-scheduler.service 監(jiān)聽的地址改成0.0.0.0
ExecStart=/opt/kube/bin/kube-scheduler
--address=0.0.0.0
--master=http://0.0.0.0:8080 \

Prometheus 的Targets監(jiān)控

Prometheus 的Targets監(jiān)控

Grafana Dashboard

Grafana Dashboard
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫负,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乎赴,更是在濱河造成了極大的恐慌忍法,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕吼,死亡現(xiàn)場離奇詭異饿序,居然都是意外死亡,警方通過查閱死者的電腦和手機友题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戴质,“玉大人度宦,你說我怎么就攤上這事踢匣。” “怎么了戈抄?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵离唬,是天一觀的道長。 經(jīng)常有香客問我划鸽,道長输莺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任裸诽,我火速辦了婚禮嫂用,結果婚禮上,老公的妹妹穿的比我還像新娘丈冬。我一直安慰自己嘱函,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布埂蕊。 她就那樣靜靜地躺著往弓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蓄氧。 梳的紋絲不亂的頭發(fā)上函似,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音喉童,去河邊找鬼撇寞。 笑死,一個胖子當著我的面吹牛泄朴,可吹牛的內(nèi)容都是我干的重抖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祖灰,長吁一口氣:“原來是場噩夢啊……” “哼钟沛!你這毒婦竟也來了?” 一聲冷哼從身側響起局扶,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恨统,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后三妈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畜埋,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年畴蒲,在試婚紗的時候發(fā)現(xiàn)自己被綠了悠鞍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡模燥,死狀恐怖咖祭,靈堂內(nèi)的尸體忽然破棺而出掩宜,到底是詐尸還是另有隱情,我是刑警寧澤么翰,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布牺汤,位于F島的核電站,受9級特大地震影響浩嫌,放射性物質(zhì)發(fā)生泄漏檐迟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一码耐、第九天 我趴在偏房一處隱蔽的房頂上張望追迟。 院中可真熱鬧,春花似錦伐坏、人聲如沸怔匣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每瞒。三九已至,卻和暖如春纯露,著一層夾襖步出監(jiān)牢的瞬間剿骨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工埠褪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留浓利,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓钞速,卻偏偏與公主長得像贷掖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渴语,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容