From 8f3d8b3d1072ca33cf3503e95f8fd3bc629ace18 Mon Sep 17 00:00:00 2001 From: Aditya Srivastava Date: Mon, 24 Aug 2020 02:06:54 +0530 Subject: [PATCH] Docs: Add monitoring cluster related documentation This patch adds documentation related to deployment, configuration and usage of K8s monitoring cluster. Also adds the devguide explaining mapping of each yaml file with its associated task. Signed-off-by: Aditya Srivastava Change-Id: Ib6252f7c853a643eb5cb9f562a55ee366f9c71ea --- docs/lma/metrics/devguide.rst | 474 +++++++++++++++++++++++++++++++++++ docs/lma/metrics/images/dataflow.png | Bin 0 -> 42443 bytes docs/lma/metrics/images/setup.png | Bin 0 -> 15019 bytes docs/lma/metrics/userguide.rst | 230 +++++++++++++++++ 4 files changed, 704 insertions(+) create mode 100644 docs/lma/metrics/devguide.rst create mode 100644 docs/lma/metrics/images/dataflow.png create mode 100644 docs/lma/metrics/images/setup.png create mode 100644 docs/lma/metrics/userguide.rst diff --git a/docs/lma/metrics/devguide.rst b/docs/lma/metrics/devguide.rst new file mode 100644 index 00000000..93d33016 --- /dev/null +++ b/docs/lma/metrics/devguide.rst @@ -0,0 +1,474 @@ +==================== +Metrics Dev Guide +==================== +Table of Contents +================= +.. contents:: +.. section-numbering:: + + +Anible File Organization +============================ + +Ansible-Server +---------------- + +Please follow the following file structure: + +.. code-block:: bash + + ansible-server + | ansible.cfg + | hosts + | + +---group_vars + | all.yml + | + +---playbooks + | clean.yaml + | setup.yaml + | + \---roles + +---clean-monitoring + | \---tasks + | main.yml + | + +---monitoring + +---files + | | monitoring-namespace.yaml + | | + | +---alertmanager + | | alertmanager-config.yaml + | | alertmanager-deployment.yaml + | | alertmanager-service.yaml + | | alertmanager1-deployment.yaml + | | alertmanager1-service.yaml + | | + | +---cadvisor + | | cadvisor-daemonset.yaml + | | cadvisor-service.yaml + | | + | +---collectd-exporter + | | collectd-exporter-deployment.yaml + | | collectd-exporter-service.yaml + | | + | +---grafana + | | grafana-datasource-config.yaml + | | grafana-deployment.yaml + | | grafana-pv.yaml + | | grafana-pvc.yaml + | | grafana-service.yaml + | | + | +---kube-state-metrics + | | kube-state-metrics-deployment.yaml + | | kube-state-metrics-service.yaml + | | + | +---node-exporter + | | nodeexporter-daemonset.yaml + | | nodeexporter-service.yaml + | | + | \---prometheus + | main-prometheus-service.yaml + | prometheus-config.yaml + | prometheus-deployment.yaml + | prometheus-pv.yaml + | prometheus-pvc.yaml + | prometheus-service.yaml + | prometheus1-deployment.yaml + | prometheus1-service.yaml + | + \---tasks + main.yml + + +Ansible - Client +------------------ + +Please follow the following file structure: + +.. code-block:: bash + + ansible-server + | ansible.cfg + | hosts + | + +---group_vars + | all.yml + | + +---playbooks + | clean.yaml + | setup.yaml + | + \---roles + +---clean-collectd + | \---tasks + | main.yml + | + +---collectd + +---files + | collectd.conf.j2 + | + \---tasks + main.yml + + +Summary of Roles +================== + +A brief description of the Ansible playbook roles, +which are used to deploy the monitoring cluster + +Ansible Server Roles +---------------------- + +Ansible Server, this part consists of the roles used to deploy +Prometheus Alertmanager Grafana stack on the server-side + +Role: Monitoring +~~~~~~~~~~~~~~~~~~ + +Deployment and configuration of PAG stack along with collectd-exporter, +cadvisor and node-exporter. + +Role: Clean-Monitoring +~~~~~~~~~~~~~~~~~~~~~~~~ + +Removes all the components deployed by the Monitoring role. + + +File-Task Mapping and Configurable Parameters +================================================ + +Ansible Server +---------------- + +Role: Monitoring +~~~~~~~~~~~~~~~~~~~ + +Alert Manager +^^^^^^^^^^^^^^^ + +File: alertmanager-config.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/alertmanager/alertmanager-config.yaml + +Task: Configures Receivers for alertmanager + +Summary: A configmap, currently configures webhook for alertmanager, +can be used to configure any kind of receiver + +Configurable Parameters: + receiver.url: change to the webhook receiver's URL + route: Can be used to add receivers + + +File: alertmanager-deployment.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/alertmanager/alertmanager-deployment.yaml + +Task: Deploys alertmanager instance + +Summary: A Deployment, deploys 1 replica of alertmanager + + +File: alertmanager-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/alertmanager/alertmanager-service.yaml + +Task: Creates a K8s service for alertmanager + +Summary: A Nodeport type of service, so that user can create "silences", +view the status of alerts from the native alertmanager dashboard / UI. + +Configurable Parameters: + spec.type: Options : NodePort, ClusterIP, LoadBalancer + spec.ports: Edit / add ports to be handled by the service + +**Note: alertmanager1-deployment, alertmanager1-service are the same as +alertmanager-deployment and alertmanager-service respectively.** + +CAdvisor +^^^^^^^^^^^ + +File: cadvisor-daemonset.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/cadvisor/cadvisor-daemonset.yaml + +Task: To create a cadvisor daemonset + +Summary: A daemonset, used to scrape data of the kubernetes cluster itself, +its a daemonset so an instance is run on every node. + +Configurable Parameters: + spec.template.spec.ports: Port of the container + + +File: cadvisor-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/cadvisor/cadvisor-service.yaml + +Task: To create a cadvisor service + +Summary: A ClusterIP service for cadvisor to communicate with prometheus + +Configurable Parameters: + spec.ports: Add / Edit ports + + +Collectd Exporter +^^^^^^^^^^^^^^^^^^^^ + +File: collectd-exporter-deployment.yaml +'''''''''''''''''''''''''''''''''''''''''' +Path : monitoring/files/collectd-exporter/collectd-exporter-deployment.yaml + +Task: To create a collectd replica + +Summary: A deployment, acts as receiver for collectd data sent by client machines, +prometheus pulls data from this exporter + +Configurable Parameters: + spec.template.spec.ports: Port of the container + + +File: collectd-exporter.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/collectd-exporter/collectd-exporter.yaml + +Task: To create a collectd service + +Summary: A NodePort service for collectd-exporter to hold data for prometheus +to scrape + +Configurable Parameters: + spec.ports: Add / Edit ports + + +Grafana +^^^^^^^^^ + +File: grafana-datasource-config.yaml +'''''''''''''''''''''''''''''''''''''''''' +Path : monitoring/files/grafana/grafana-datasource-config.yaml + +Task: To create config file for grafana + +Summary: A configmap, adds prometheus datasource in grafana + + +File: grafana-deployment.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/grafana/grafana-deployment.yaml + +Task: To create a grafana deployment + +Summary: The grafana deployment creates a single replica of grafana, +with preconfigured prometheus datasource. + +Configurable Parameters: + spec.template.spec.ports: Edit ports + spec.template.spec.env: Add / Edit environment variables + + +File: grafana-pv.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/grafana/grafana-pv.yaml + +Task: To create a persistent volume for grafana + +Summary: A persistent volume for grafana. + +Configurable Parameters: + spec.capacity.storage: Increase / decrease size + spec.accessModes: To change the way PV is accessed. + spec.nfs.server: To change the ip address of NFS server + spec.nfs.path: To change the path of the server + + +File: grafana-pvc.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/grafana/grafana-pvc.yaml + +Task: To create a persistent volume claim for grafana + +Summary: A persistent volume claim for grafana. + +Configurable Parameters: + spec.resources.requests.storage: Increase / decrease size + + +File: grafana-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/grafana/grafana-service.yaml + +Task: To create a service for grafana + +Summary: A Nodeport type of service, so that users actually connect to, +view the dashboard / UI. + +Configurable Parameters: + spec.type: Options : NodePort, ClusterIP, LoadBalancer + spec.ports: Edit / add ports to be handled by the service + + +Kube State Metrics +^^^^^^^^^^^^^^^^^^^^ + +File: kube-state-metrics-deployment.yaml +'''''''''''''''''''''''''''''''''''''''''' +Path : monitoring/files/kube-state-metrics/kube-state-metrics-deployment.yaml + +Task: To create a kube-state-metrics instance + +Summary: A deployment, used to collect metrics of the kubernetes cluster iteself + +Configurable Parameters: + spec.template.spec.containers.ports: Port of the container + + +File: kube-state-metrics-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/kube-state-metrics/kube-state-metrics-service.yaml + +Task: To create a collectd service + +Summary: A NodePort service for collectd-exporter to hold data for prometheus +to scrape + +Configurable Parameters: + spec.ports: Add / Edit ports + + +Node Exporter +^^^^^^^^^^^^^^^ + +File: node-exporter-daemonset.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/node-exporter/node-exporter-daemonset.yaml + +Task: To create a node exporter daemonset + +Summary: A daemonset, used to scrape data of the host machines / node, +its a daemonset so an instance is run on every node. + +Configurable Parameters: + spec.template.spec.ports: Port of the container + + +File: node-exporter-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/node-exporter/node-exporter-service.yaml + +Task: To create a node exporter service + +Summary: A ClusterIP service for node exporter to communicate with Prometheus + +Configurable Parameters: + spec.ports: Add / Edit ports + + +Prometheus +^^^^^^^^^^^^^ + +File: prometheus-config.yaml +'''''''''''''''''''''''''''''''''''''''''' +Path : monitoring/files/prometheus/prometheus-config.yaml + +Task: To create a config file for Prometheus + +Summary: A configmap, adds alert rules. + +Configurable Parameters: + data.alert.rules: Add / Edit alert rules + + +File: prometheus-deployment.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/prometheus/prometheus-deployment.yaml + +Task: To create a Prometheus deployment + +Summary: The Prometheus deployment creates a single replica of Prometheus, +with preconfigured Prometheus datasource. + +Configurable Parameters: + spec.template.spec.affinity: To change the node affinity, + make sure only 1 instance of prometheus is + running on 1 node. + + spec.template.spec.ports: Add / Edit container port + + +File: prometheus-pv.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/prometheus/prometheus-pv.yaml + +Task: To create a persistent volume for Prometheus + +Summary: A persistent volume for Prometheus. + +Configurable Parameters: + spec.capacity.storage: Increase / decrease size + spec.accessModes: To change the way PV is accessed. + spec.hostpath.path: To change the path of the volume + + +File: prometheus-pvc.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/prometheus/prometheus-pvc.yaml + +Task: To create a persistent volume claim for Prometheus + +Summary: A persistent volume claim for Prometheus. + +Configurable Parameters: + spec.resources.requests.storage: Increase / decrease size + + +File: prometheus-service.yaml +''''''''''''''''''''''''''''''''' +Path : monitoring/files/prometheus/prometheus-service.yaml + +Task: To create a service for prometheus + +Summary: A Nodeport type of service, prometheus native dashboard +available here. + +Configurable Parameters: + spec.type: Options : NodePort, ClusterIP, LoadBalancer + spec.ports: Edit / add ports to be handled by the service + + +File: main-prometheus-server.yaml +''''''''''''''''''''''''''''''''''' +Path: monitoring/files/prometheus/main-prometheus-service.yaml + +Task: A service that connects both prometheus instances. + +Summary: A Nodeport service for other services to connect to the Prometheus cluster. +As HA Prometheus needs to independent instances of Prometheus scraping the same inputs +having the same configuration + +**Note: prometheus-deployment, prometheus1-service are the same as +prometheus-deployment and prometheus-service respectively.** + + +Ansible Client Roles +---------------------- + +Role: Collectd +~~~~~~~~~~~~~~~~~~ + +File: main.yml +^^^^^^^^^^^^^^^^ +Path: collectd/tasks/main.yaml + +Task: Install collectd along with prerequisites + +Associated template file: + +- collectd.conf.j2 +Path: collectd/files/collectd.conf.j2 + +Summary: Edit this file to change the default configuration to +be installed on the client's machine diff --git a/docs/lma/metrics/images/dataflow.png b/docs/lma/metrics/images/dataflow.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1ec908fb35392cd03396c4b67d4e5d482535ef GIT binary patch literal 42443 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 EIXc)sgMeH~ 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

SSYe~#sLJs#CC1{>ie0%Z9Dfrt9iIE zwvHS4euDS>E%Q=OYrz?$;NALw>8`w=`G?;EMd8fh;ZOEhKpGH&po2!>TAt@nIT<2T zO->I^pBT%Tx5c6<`~N69A{k*@QPUPgAMp)p@bl}!8Pvtl)3NB^qa)^_OAc;6)?T=4 zQJaJ+f$s{tUbymE^*^cvW1Kf&;5X?VXdT%oKn!6*EPT}oSuLdhD&5bC@zz{;V)w%0 zQy`MuFbE%-iKR#=M@D4RnospY^8I`TU2Om61NmQBGBaBdjy`qrfphC^GF8H|q{#|+ zpcjMbo>Lv!PT<|0K+>F`WO_W$mhNgavkXvauF3(QNK*snzdpH4Z(P%-zXNhHa^)Oo z(^DW|-HK~eD4fxw|L17y@b1(=05#nEZGr^ZlZvXchZEP&!hF zE<#M~cm$W>p$pP$=%t80ctw+$_f{8i;TN%&3;OCH10liIkrP%zuMk>}t*;J!nlP#w z<0KfZ3@dIr!>q3;0k)#7NnhgyaY-c1aOLR4LhBQ`zw*-arCNo`n?-Bd#5%&g#g|)l zlA!tXO-x>aWoatFwY|+;!6;mkERunMsk6kx(hpuCMm22P1ja3A1F9?H85o#NbTrgX z1Ctb4sioj-`&~^f+-0ck&QH?C6cq+7PdKC{wi4Ej*zp zS;rkgocn&9e(- zp&94f4oIGB&RflHAa0c69A2iI@PzjX;KZDPlFGTjzTZN=w_3uw+{}&4b@XD{WngG2 zkXi;9LBi0!OGfSG=iP$cA%hvwXP_|TfB*x;THcndPR|0)NWt#|u}cwh28nhp^t8F*P# zYrpto^yp1gk=*xI=|j6KYmkCylhb*&#gB|1rXm!j{&Q{EGOj_Ibw-Uof!!{2jXhfB09 zJuR!}zS1`4#OKxFSOPVIB$>OV4XjRY7y(3jYp%XX|AC{%#R-9ES$FdF}ycI5xGjkyv(PxSeKL=BQW3Q6twLz0H~GgBJFMGKn5(oR;`*!SPn(Xep~Bbg4$ul4lEW zj69vf>_KqjqOcYTo`{px?wosbP3a55%9s|(w#&&%oQ<0xfjK$fwSLJ{moOq0OC6Nx zTtE1d^><8&`2HY}3+%z#kX^@cX*OoOSRButOte&rW>a)tVSaQa_ZxHfbiVB^GNwHm zxJ3It73&JgiB}Il3RJogj@=n~(uo!`FS^zBI-cD5VnOEmy-x{n*^@`o1S0nT%#}|yp7+|oxqhPn{jV?i-*pE1mcrTPxPk-*_@|?3sPS0c HF8u!h3u6E| literal 0 HcmV?d00001 diff --git a/docs/lma/metrics/images/setup.png b/docs/lma/metrics/images/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6a12746e55e724f138909605ddff9e96c4d4b0 GIT binary patch literal 15019 zcmeHucU;o#->;e7woKboo7ylH1jUh>TSUdJXl9C_pn!^kXiBzhX~QgMTDN8H%F>+J zv<$PH87U3J#96LDgma=CoivXWMJBboNz!Pu*bA7ZS+7Jy0LIVnQ)rP3TOyN-Q2coYD zhv<0C_4fV*p=@03?NqhR!E*>97zci=aoAvrbclISIE4hhSn0tuA)0U~ z1f~gvN(Z_4;r+r1f15^n8eD{5;M_@c$fO{ut+Nfmk3ymOnOQj4kWq6dpy9%)1PXbs z8x*Dq)6}19h+u@`=Dr3}D1jkhQEgS2B_QT6s)6|lzv!fap*sdbpcXFHIEG^Y!Jg)& zZ8`0-|NU9Fn3t{K# zk9T)4HTCy1^)R=w@gjqEeV5=Mb9fLE7T|@{CA$!bga8}oAh;_UjR|sO*!scjXnvm7 zR<5B|n9v~q@DOd99Zrvk^U$@R!JO>i7>JE28Lbl)g~Xcq*&$6mv0je)W~KoYbC?Gv zD%>X0%nW6X^|Erq6Rpg==oBKv9%&k-P4l!sgjnDZ2sd+cXS$g~lnpXURojfF=ip z$YaTHfx?}Ew3u1pBm9B1T7gGbXB^BQNec5og`i!j7D3KlFq(y{In;@u9Si|nG-Fsn z{pb)6j8y;v>Y}IbLJNY~1F}2WgarCoMnt*mp!CelA<6=dpXPoOwP>D%f1 zhhhkx`p(gw#4r*D4pxI|JA_4=Sq4P8Vf?XFj2_Vo0_Tj=_Q>0;fZ%-t=`%}LQ-SbuGoNHY=~W*(wX(L?F# z;{%*RtwRE|86>dlpm3s{n{Kdqgr22qI9@M^A>|T-0;K{@nVGt|Vj1RSEZh;Os2L!M zX9N+bgP8*Y4xtHw%s*U#Y z^hCPYSQ2q$7kU7cL4xYgL!yF%%~4jK6e7Vj(t}70rZe0a5KjvyH*06pFe<~!*^3h4 z?hKYOcd&)S7;X+29b_QU%7FrLbH;d~2xhi!fi$QEB`g^9ArfdLOE+^*BzUG{T_BV| zsA)i;i-VjRqi1i9#M@ajOf3jzIt~^{mKcwPwet5uL9OvHSCpNOJ7_gU zAVck3oE%B^P&zKq-_y}i$IBf}2o8tQX;c~mZ)$GlXc>X>pa9+VvLK)!UJNUWl^)6^ z3}uHz_ydqNb9c3*xm)2){oHAmR$(v*iNL@)JA|QKKwF4qxE>x)3nF9u0JlA8(K?p? zL<=&*D#|_>jiGvC^n(4Vcvl@pP>7=`=&y&x>0!WcI1w6cgTw2i(WW86&ggKfz$iDg z6wiXq&`$RH+9;eW!ZXT~ikCvJ6^`x~?hlIyagHYAEZiB+UiJ*M7tj)a(B_XNlPvtP zXjcZ9)*pd}1(L~bUUvE+j?NLm7HFpcDA~7#N)zjX-+Z zk@cncZWe`$M0rKon_EXk+3Lc*0(3%x9c&5FR8t+iEraNYcW`#nkt#C7hGdPxVJ)PJ z23{Q_aE=kgNSv!}RA98ZtrU;!U8Mv-VZE>rhY&OseDU*g^hXEi*-JIf!bZ;)57(jU z03EOjkA?#{fs%t=^dq9dyN$m-jvQhe=mkbu0iiIX;lUUy-C%1!XQ&M>Lf4+C8=@Cv z6YdgBr80=_x=>F$Y$WIrhzG_A{QhO1W{nki|7HAPmc*360vVYtGDr(k*QkR-Sxbt1 zEGH83WKWzua_H=SV$`bpIsPa1D-p0ygX~Xjb-rnnfBtfym%2huylwWXBC~>V1`dXUKwBhMT<U6@=^_O&9)B^3!)g6slC%cK|r`N#tH@P08e+p~+ zCWIWL)bIx3-h(HssNHd-jxi-G>gixuS_@qOp$D6edsjJY9vSboOv+&9{vwsYQE> zMA(apsfgJL_unseI8n!Vb-qq8@T$>-l86xmmQafN{g&N*k?`_t9oSyu<3^J;f+Gy9 z^3%IN{;=TiUB6{ih`wd8>Wcogz%LTrpnYZ0hP+^ScB(NM@gekBnqHXy_rPfi>Z+#B zRo}SE%HB&Tb}llRy=Z49WXtn0UK4D)b<*Hjqns@lxvK`YB&ExOuK$33cRt|Qlcw}M5FfBSs)Syki!dwpQ0lPESa(DbC9 z_?xGESW(UVtq#5~^9d~;#)duDk-ka33|0Y*8T_&JmObq38jU^fGg$|-%4ZZ!M5F#5 zA6rmb8V>W`t)97MpK-2R*^?C)8@AZ5DP4#6?a%X?wB=Uk);XQSebu5A{7_Dpo}uz} z`glrn5KBim(mhSA1D`l<)rA61SjUT3?QyYrIYJ7Jz5V>Yqk>n{glc-w^k`0L zz|r6q4_%m*w`}@&aon{pOUN^YEh71QKPvPJOqA|3H7lknLb{wY)pjwr9}!gRG$&aR zq~mD0-zFs`NZ&5@y5hGY{Wx4~;cHQK7N@H!vM>#bJ(*_0jBB8Z*Pz-z7N+t|l%9%k z_HCs5YSf(4-gL0!|3m}BXJi(CZ*yyP=2*oa6xPyrk}D=k0pM&o;-2gMPma}H3NE$x z6)feN9R5)GOkeneYv9x8JM(~9`IW+izvDJ?%oRCwaauiOYh-w)@aYye%UiX)No&25jS4$N-FYuw%ra+}%1IgF$xoZqmk6J4 z+pMO=+kBGRw)gI`&z_7wACsNJ$D6!E#+!V7hlc>Lyw&Xb^knd@T`Pwo7M7Da zCJEk?w(qs2z*2g==}^O!&b7Yu?nukq)YtlXBY3A{iCMyFP7Z~?0gmw<7GCjS`b507 zGHJ?Gjsa=XF=MT6D0s zYIUJRm%p*B!mRJL5BCQ{hQfH|EmY|}DM%Q;S1)+~qp9TS2B|h8LJdh*Ur%0%O+jRy z!Jt|zIkzdTb}nbKtLttGn$utn>~x*Ns2w%6{odZ9>yaEWNr+DnB+Tr3Kwn#EtgIa} zIocJDNEo$fZA`7MYu`DqC#*p^){y3LkbzUDorFs6CskM#oQ_liL|*t*S+1DtvCm53 zI<*|heG}sH;%arB+ZZ=?s=H~tzqLt<8wGBK5Xq_ycTR73f3NsSBkS}q1Iy-{->5P| z?Xy$$E9)gM^CR54szHw}BUY#H2euO{NYL5@bJu)>skq4u&@ z$%l!d0I_!kS;JjKo92oUeIDvfCV{4gO&YWIgfpI~<2#;cX>50JT;Ykn`x^FtupRk) z@1E8tXUal9nU%%OL<7WJSB7ue06Y9M6z2C>4m-l9HSW$^W%6TB!^HUbeXnL=uS@&d ziz20Z(M+hFfo;(-J@=m6XD@C)bOi=(297BZ3e%LGAd)rX`)AwM*rY#Q^%k*c{RVZ} z*p22H7Khj-i`J)WY@6L*8T|CY75lk0G4o=_Ix8a46R*5m5U(|Vzjt@>-52ugjkEHw z<-L2J8Mo%EH889=pd$Y(gM2xKsqGB+u$kQp&t^rXtxW9Lu)I{=+{KJwcB2V37Hh9a zJ@xM-`rj^7B!YD!I>sRhp1n_cExC|PEY9!i=CgIxIx`qR=SWobXDYk5uIwV3p#3`B;}W&yQcN?w$&;zNO}i z^2n%?MwU`4)4vZ>5n zExqyk56ET<*nwp<@`}n{H~wb)*lWY)b1FvfGh>D;e>XngB`zvJU-j{{C0TEF~wrPcf!CX~hw1>*-g zit&$*F8JNzg(X#uAw4x+2N+*dFpug*WtWm)9^VFu_~tkU$eH0o>r!>K{jpz0cKO1? zUp8_f=S{>9F%Luijt@57d@9PoqI%CQIwW3y_Ep;!$E~3g?H(B>5M|oZ+OZ-3}o?>mTP-^aiGMo1= z>Rbl&#xMeZMai=&BEJ#{Zqxa=@jr_W9TH<+z6>y1UN17gsHQ0QdBxA~=b0gK;<4-u z+^Z|kG@epvY%a|4@q=SBJnpirG*!7PTE1j*?Swn^OCkclVE$OMt%KUiGcvr*XW)!2 zN>}Tf5ZsVK3Aw8O*6(hPu!iF zs$l(W?mr>u%T=Q;vI6pcGTlPyluEIG4rrg!|Yi0YhNDF^&md2{=13oTSbr@HAGj4@uCTcNvU@e_JDn~QMz z{NN~{&*HSS9dc);h0Q=8M0^icRGM2cfd(9_>F*sHXBW)F425gFXACs zzhm(9aCP(HPfL6uQ#~=14`%xU8$?F)RSy^fZ5(=&hA}(TT@}fz8G8+z;xd`P(bavU z_4B28ho2En{9RoRjr2=E_>h)Gd!Mho5(rAr?s)FZFdg5Li^K!$zyJ}MQ=NYk*3kwN z@msr8$Rp7wMdt5tXW#f6bG+#1citoU&FtR@tI141n)hY1gj25Z8yp^_#Pk5M z%K&k-{_lpr4=zmuaQUo8$S?dScI|`&yijW8a5l1(&aXZsR`FX=U<7R4WKfgc)(c<0 zCka|RmDb6`Z!%f>$C3Do{W+`UPA*gS620e=C4E1DmN{Kw$f*J?duFc03#S+9iV-c%Mk{V7oa7&IMcnA5^k;MP3ZH__(utW->8_=zibz1(+nMZM_QXSMZm zH&(n0F0DNmdw&EFZ2f~}*)O5YZ20N+4YHHh#FH(Xr_~P~R64T1M{dwQ4#r1CboK9H3$fOpR$+@={r+MN)&0pWwIi>gOw-`yCA~ZnsYN75})(yI{WT;U4jgA{HGyqhP>4B15oDqA*1f4dGeJ+(HHCwY55uI)qgKryB}|0UK$sqvx= zZ)D*aKcyE(>Tf&!$sVfUl6wTN>3B#+XWkowu?l+7`x*u{tlH|J(z;#q*vy>XsLgWY z%cDB0dvN5+uWP7Jms@{RuR}dcW$HR>U%UVqe&PPh1;DvU+V{g|EIC{Bw5HE!1X!|v z&`;_(?e(c@tC^}DY5L>ewjYC*^z`&x*!^+=Fa+B|$KP6KsG_c<{+VR3$9aLc)n6=5 zTXA;*SZB>C_NuL;CbA7GF-4V=?}MA54V#h`R{nzxKv|}n5G;W`^+Q+#Flbm{(6-x| zJxBn6tx}w}Th4eiUNKebB}iStu6h7-7cZSYz5~EquDvF(=@8nWC-vECk5nl3`KlB9 z#@H}Ch!_*S+qM9Q?U>vP4hISRq`YBvm9m_8vVyhRTa=d_S5-N9?-jejcoGT=e7$LG zu&g;9MCT2Meg_J2 zJL)pk?G-_9w~ci*$8}uhNuF#LzX6_U(}%-jP0x)HN7u@2xu6)2KKywlube|3$hc6e zQ8RHFa4(j>Gp$zOeFDS>o5vc}OH%oP@rO3(Jv;ibT94&?C!Pvc(*|XHrY`J94zLU(_L9dfK$5jEVBHuXecY~ zwTVPzJg+#sdbp~va`f?%vzw`-M~^ItFO8ch#CH^7cwevj4sSFDjvXv!GKBj5+1l#k zhnC81$vIa~$jib5zvbZI299$5fszTz2?6KeM%|E9fz*U`(rBD3ZmfHMLgK@R3M9|g z`VJO8jXPZ=){kGYd!DS)s7<}`f=LkOYtm#oioN@w;U64}p%Okn+l~3*R%>Q$l`ycq z6oVut95I|1gUPOaq*yT(8F;1bMfgN>fyr)6+iI5*F=nDLIqB$DnRv&_B! zoi%y{^GDh+6y2d93T>We8wk85 ztWX?N%%c`+Bhw+PAsd1nPGp@lfb$FQ;uUHy*e2FZq&$5ha_K+H=3jvO?Q!Y!r0yAn zw_SJgP1FhgcEXi7UR=6Eg_mu+Ho!e0cack4)$?>0zr5?q5{1MfjJZ~>^PiMh)$b6A zYt@!AgB|v%jcs6$iwzYbgW5c>O&g-Orfi5EP(Pg@$ZJ`U*1nbS*!5P)U7qVZ!flXh z-4NXIW=VeAH*a6$KDJ4U=8K|b$d$LWBNKJ<9y^#TOAl0b@}SL4E9rUt#Q71X_(+>{ zNJ@Tik^XAh2L2oAL3PH>_UH&_4~o9IM7z+u<#@iG54I`)POD>rlw?KM*E;9Ft*E;c zmCD@Xa{;4#NzD$&|L;x;iA?pOo*Kq8L#^8JmZ5Eznat0pccugDmkI)TGGaE^{`~ax zvzRLy-uROW8#|`rrh9-lGC4CXgF<~K0V3Wwggy5>y>RgGMDK9*2>BK|n+!}+)i#lS zUnX{q=7FH-=xFDQ#Qk%!U_YKalX-u}h{|Jc6Dc4*)b|A>{JFnHD^+sD*yuFHashr z%qcJaxlL-nCpMSQ>cE4$u@k*d6iq_hi@n_T<`!g^?aT~4I`w5&!2UTwn(tcWGT(h; zx9&j8O;pptm?4~lu^_-jH(y5pBF*LxAXWVA>e28N9sj4NZme(@&tLWQ31^3VQbI(J z`A_~!KH0U>{6X{taiWkZ)q~3S@9ZZ6G^=yxv`PN^@&jCav2O0nwnI%4P?OO`8%?-! z5gqGc_*7)F+Un=N-OKObdRyMmG%u-bIxcsRTX2_WAj37nOx~QK%&fZV@pIl$f>eL( zr*^1IhUL%Z`a&e8hreC^gVLN(2dpBV-?VU^?B>qOr;MQ(S^PBgo2Zg zo=GOM|Km5bu^kVyFGTnk*busC5hf2zPy)^F+u;PJbfOOZXnSORMTn z&6C0wuj*-C^t}y;tIE6QczH|&*;8@-dE&;3Zh2h0XlU*Hm@Z$&%Qg@c#tRfL#jK=U z-K1yVJGGj6$B2MNx0eQdck^cJ%?irSM0rl~(1%?R29^ zjO(&aVX%~cSsNI4j4-U%CJAx(GY`+=V9fLjRmYSg086*#{nrJ;SIqw-`bXXp7*_g(`m54q|Ur@V3j)OzvYKy4}11Z zU(Zm(nSh8PIswtvA92%$QQexN?qSd^D2h8Ucsu(5zs#fJ-7Cy1kBNuhO6wfZ#Igx# z;pidsN^{1Nx5=ekv&?JoSVejMNb22&_xA~{>>HM6+41r!w{PrJHM({}K-a$0l2drT zt+;39`<~Q5Yqa{ncy2AfNfkuyEuEXPjB^_gqX80d6RKjFf`~oSrkL7;?GNhsYqK2C zJ_DC4gwFz{WwPOGa#?kH3LO_z?e*RrsOuRi<5j)xhUfR>vwIY8um%QRX`OVN;R{E; z3HuxxESWRC&e>TRvG^0U88>Tp6h@!BtXQ%qd$DJ6Y2)oU)}&h9Wno*VNAu9Gq~`Sg zmz~*<-}|DkL|<-br!c2Ebi_p(`HQiqrUiozTt*Syw(3XaA$)F(qDLTMF| zKN6PrRsMmG6F2HhV(gTtbo1bZ*2;Fb$^nhNg6chXyXxa6OvFdprC+-Wg{$-rP9^Jw#6!k_5sI{8U%k5&#cyJnd?}z%+$lA!t*vF($tn;M?N1{JbbA#=pA>R zuW(uUvX|4b?RIFfWQ{l}`rf`?k+`sd|M}Jne*6G?ZgO*`$*-$rK#zHN{+mRPjb~Kg{PtcVP{N1t7sY~ zA?};*34aj4toZ2c8+#5F`!)ZR(1&xFQYLKiXmL5FJWz;_4zJpcHX6FU^ObVmrzZ)l zPxr}u!1uKi>JlNbF8a>RnjcyfM@uVt=}C(7!!d%XsWu(9ulTOIeyH$lPtySxUqR(}pGC75S}e``coiTePJ7 zfbus#p3rcT9o|-!~!*7V^jWJT1WkR-y~#zPKFcGeFh%*{Z{gJMeX6>&B8kkAcE&<(c=aR$DJ& zu*4zniEv=&Rp03;x< z*7uLNRC6Nv-SGYhO8W;0Kw7^q(6u+lHd(D-{w2tRBNU zk3~b@Y+Mew)hmld!&WJ^=ICXEyINY3i{X-ZWMg&uwk?Fmw}=;>1D`n}iKJ30b>S;2 z8*-^rz=c1ktIpgV@f?BL-*UXk{j&=2kB7^!xl;GoF0XRs=&YANQnGUU0uXfUTFCk4 zn5ctTyrb;ntewP@TE9iinJ>g1Qp_Qlu1c?EV4^TRCD_L=Ekq!I3>H`pGj+kAB&TdI&UbEZ|{Lm#Y5Wdp4Hm;k? zQydADT~S6uYJhOES_$_n*-;OhcN$Zjd*xr-oJ;-uUsH46N>6ZYP5;X|Sov9l=<%Rm z_vCJW9;pCzTWNF$ZkG9Jf^ZSxdgs^uygJrqP`SAqmH-08yYHn1GvL@w&T!Iof~A-9 z4)MbZD4Gp}x335fH%@hVPIBE#50ZX`hG#~<{^aX5pIRgz-z${>oc3R`QV)xFI2mLg z)!%Y6Rt+QWx^>NjDW=^bb0wgD5?igcB+LH_&if1ZKEcIzPk3{H2f{APbKz6= zhBH3;?#`%*vusfM6uOHCI!m>FOjekGTCekI%Z0sC0kt#xOO&J3-jLL5KBzE1omk60 zw;pz8wFJc2>`SUBcBVe{42c?Cpy`^{foXK}%ZK#yhApks4VLw>~e4&#}OwRCdU-G_pSQWWxz9w7&0#DVj#B9cQlRpfuVu+qpZ7yepE%X0FAY4vn5= z>y^K;Rm|p=^yb-T;MZt)wb6&`gfTMSwiEJ^I6^m@RYmfxT~XgL`eOU}5c-Ckx*wZ^ zG$w(obcV0bjCp^9GqQN!cC}4%mv&0I_tNIyxhI5493&n6Ysa(VhA3K_2k#I0B0gwe z>sH;xwDBC)1D6I_ll0=7t)(-s-c79Q4v(?2(_6R$Eu~)a#lKMxCLwda--Obu4wUZe z)T({W+L!2<m~>OGZMyY+eI$Rj~JwH%^5OYHd+5E1u-vLn-Z(@`gI_>0K!b% z<^-Fob!>41g^hwn$6pnZoUP#1{LrE$bDoJ!iVQEiK)VeTo}?Z~&?!(4RPuZbsxDGx zbq1yAyn>~XrgN_wwjB{5`_ + +Where to send metrics? +------------------------ + +Metrics are sent to collectd exporter. +UDP packets are sent to port 38026 +(can be configured and checked at +``tools/lma/ansible-server/roles/monitoring/files/collectd-exporter/collectd-exporter-deployment.yaml``) + +Data Management +================================ + +DataFlow: +-------------- +.. image:: images/dataFlow.png + +Where is the data stored now? +---------------------------------- + - Grafana data (including dashboards) ==> On master, at ``/usr/share/monitoring_data/grafana`` (its accessed by Presistent volume via NFS) + - Prometheus Data ==> On VM2 and VM3, at /usr/share/monitoring_data/prometheus + + **Note: Promethei data also are independent of each other, a shared data solution gave errors** + +Do we have backup of data? +------------------------------- + Promethei even though independent scrape same targets, + have same alert rules, therefore generate very similar data. + + Grafana's NFS part of the data has no backup + Dashboards' json are available in the ``/tools/lma/metrics/dashboards`` directory + +When containers are restarted, the data is still accessible? +----------------------------------------------------------------- + Yes, unless the data directories are deleted ``(/usr/share/monitoring_data/*)`` from each node + +Alert Management +================== + +Configure Alert receiver +-------------------------- +- Go to file ``/tools/lma/ansible-server/roles/monitoring/files/alertmanager/alertmanager-config.yaml`` +- Under the config.yml section under receivers, add, update, delete receivers +- Currently ip of unified alert receiver is used. +- Alertmanager supports multiple types of receivers, you can get a `list here `_ + +Add new alerts +-------------------------------------- +- Go to file ``/tools/lma/ansible-server/roles/monitoring/files/prometheus/prometheus-config.yaml`` +- Under the data section alert.rules file is mounted on the config-map. +- In this file alerts are divided in 4 groups, namely: + - targets + - host and hardware + - container + - kubernetes +- Add alerts under exisiting group or add new group. Please follow the structure of the file for adding new group +- To add new alert: + - Use the following structure: + + alert: alertname + + expr: alert rule (generally promql conditional query) + + for: time-range (eg. 5m, 10s, etc, the amount of time the condition needs to be true for the alert to be triggered) + + labels: + + severity: critical (other severity options and other labels can be added here) + + type: hardware + + annotations: + + summary:

+ + description: + +- For an exhaustive alerts list you can have a look `here `_ + +Troubleshooting +=============== +No metrics received in grafana plot +--------------------------------------------- +- Check if all configurations are correctly done. +- Go to main-prometheus's port and any one VMs' ip, and check if prometheus is getting the metrics +- If prometheus is getting them, read grafana's logs (``kubectl -n monitoring logs ``) +- Else, have a look at collectd exporter's metrics endpoint (eg. 10.10.120.211:30103/metrics) +- If collectd is getting them, check prometheus's config file if collectd's ip is correct over there. +- Else ssh to master, check which node collectd-exporter is scheduled (lets say vm2) +- Now ssh to vm2 +- Use ``tcpdump -i ens3 #the interface used to connect to the internet > testdump`` +- Grep your client node's ip and check if packets are reaching our monitoring cluster (``cat testdump | grep ``) +- Ideally you should see packets reaching the node, if so please see if the collectd-exporter is running correctly, check its logs. +- If no packets are received, error is on the client side, check collectd's config file and make sure correct collectd-exporter ip is used in the ```` section. + +If no notification received +--------------------------- +- Go to main-prometheus's port and any one VMs' ip,(eg. 10.10.120.211:30902) and check if prometheus is getting the metrics +- If no, read "No metrics received in grafana plot" section, else read ahead. +- Check IP of alert-receiver, you can see this by going to alertmanager-ip:port and check if alertmanager is configured correctly. +- If yes, paste the alert rule in the prometheus' query-box and see if any metric staisfy the condition. +- You may need to change alert rules in the alert.rules section of prometheus-config.yaml if there was a bug in the alert's rule. (please read the "Add new alerts" section for detailed instructions) + +Reference +========= +- `Prometheus K8S deployment `_ +- `HA Prometheus `_ +- `Data Flow Diagram `_ +- `Collectd Configuration `_ +- `Alertmanager Rule Config `_ -- 2.16.6