From 3318a86a9be1ab027d2f4a8dd2933ba5305b33da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nat=C3=A1lia=20Granato?= Date: Wed, 22 May 2024 17:46:54 +0000 Subject: [PATCH 1/2] feat: day-10, service monitor --- docs/k8s/day-10/README.md | 76 +++++++++++++++++++++ docs/k8s/day-10/files/service-monitor-0.yml | 24 +++++++ docs/k8s/day-9/files/README.md | 9 +++ 3 files changed, 109 insertions(+) create mode 100644 docs/k8s/day-10/README.md create mode 100644 docs/k8s/day-10/files/service-monitor-0.yml create mode 100644 docs/k8s/day-9/files/README.md diff --git a/docs/k8s/day-10/README.md b/docs/k8s/day-10/README.md new file mode 100644 index 0000000..1f1eb67 --- /dev/null +++ b/docs/k8s/day-10/README.md @@ -0,0 +1,76 @@ +# O que é um Service Monitor? + +No contexto do Prometheus, um "Service Monitor" é um recurso personalizado do Kubernetes que permite ao Prometheus descobrir automaticamente os serviços a serem monitorados. + +1. **Exposição de métricas**: Um endpoint de métricas exposto por uma aplicação em execução em um pod é mapeado para um serviço. +2. **Monitoramento de Serviço**: O endpoint de métricas mapeado para um serviço é exposto pelo serviço a um monitor de serviço. +3. **Descoberta de Serviço**: O operador do Prometheus descobre os endpoints expostos pelo monitor de serviço. +4. **Configuração do Prometheus**: O operador do Prometheus atualiza a configuração do Prometheus para incluir os endpoints expostos pelo monitor de serviço. O Prometheus agora raspará as métricas desses endpoints. + +O Service Monitor deve ser configurado com a porta que seu serviço expõe suas métricas (e o caminho para essas métricas nessa porta) e definir o seletor para corresponder ao serviço. + +Para configurar um Service Monitor no Prometheus é necessário seguir alguns passos. Aqui está um exemplo de como você pode fazer isso: + +1. **Crie um serviço**: Primeiro, você precisa criar um serviço que expõe o endpoint de métricas da sua aplicação. Aqui está um exemplo de como o arquivo `service.yaml` pode parecer: + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: service + namespace: application + labels: + name: service +spec: + ports: + - name: https + port: 10443 + protocol: TCP + targetPort: 10443 + - name: metrics + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: myApplication +``` + +2. **Crie um Service Monitor**: Em seguida, você precisa criar um Service Monitor que irá descobrir o serviço que você acabou de criar. Aqui está um exemplo de como o arquivo service-monitor.yaml pode parecer: + +```yaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: service-monitor + namespace: monitoring +spec: + endpoints: + - interval: 30s + path: /prometheus + port: metrics + namespaceSelector: + matchNames: + - application + selector: + matchLabels: + app: myApplication +``` + +**Atenção** o selector é um campo usado para selecionar os serviços que devem ser monitorados. No exemplo, `matchLabels: app: myApplication` indica que o Service Monitor deve selecionar serviços que têm o label `app: myApplication`. + +A importância dessas informações estarem corretas é que elas determinam quais serviços serão monitorados pelo Prometheus. Se essas informações estiverem incorretas, o Prometheus pode não ser capaz de descobrir e raspar as métricas dos serviços corretos. + +### Informações adicionais + +- **apiVersion**: Versão da API do Kubernetes que estamos utilizando. +- **kind**: Tipo de objeto que estamos criando. +- **metadata**: Informações sobre o objeto que estamos criando. + - **metadata.annotations**: Anotações que podemos adicionar ao nosso objeto. + - **metadata.labels**: Labels que podemos adicionar ao nosso objeto. + - **metadata.name**: Nome do nosso objeto. + - **metadata.namespace**: Namespace onde o nosso objeto será criado. +- **spec**: Especificações do nosso objeto. + - **spec.endpoints**: Endpoints que o nosso ServiceMonitor irá monitorar. + - **spec.endpoints.interval**: Intervalo de tempo que o Prometheus irá fazer a coleta de métricas. + - **spec.endpoints.port**: Porta que o Prometheus irá utilizar para coletar as métricas. + - **spec.selector**: Selector que o ServiceMonitor irá utilizar para encontrar os serviços que ele irá monitorar. diff --git a/docs/k8s/day-10/files/service-monitor-0.yml b/docs/k8s/day-10/files/service-monitor-0.yml new file mode 100644 index 0000000..b2cad87 --- /dev/null +++ b/docs/k8s/day-10/files/service-monitor-0.yml @@ -0,0 +1,24 @@ +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + annotations: + labels: + app.kubernetes.io/component: prometheus + app.kubernetes.io/instance: k8s + app.kubernetes.io/name: prometheus + app.kubernetes.io/part-of: kube-prometheus + app.kubernetes.io/version: 2.41.0 + name: prometheus-k8s + namespace: monitoring +spec: + endpoints: + - interval: 30s + port: web + - interval: 30s + port: reloader-web + selector: + matchLabels: + app.kubernetes.io/component: prometheus + app.kubernetes.io/instance: k8s + app.kubernetes.io/name: prometheus + app.kubernetes.io/part-of: kube-prometheus \ No newline at end of file diff --git a/docs/k8s/day-9/files/README.md b/docs/k8s/day-9/files/README.md new file mode 100644 index 0000000..d444f9e --- /dev/null +++ b/docs/k8s/day-9/files/README.md @@ -0,0 +1,9 @@ +Prometheus Operator e o Kube-Prometheus + +Instalando o Kube-Prometheus + +Acessando o Grafana e os Dashboards + +Acessando o Prometheus e o Alertmanager + +O que é um Service Monitor \ No newline at end of file From 54c858cd9b1f994b3da80cc57d270c6a4b692ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nat=C3=A1lia=20Granato?= Date: Wed, 22 May 2024 17:46:56 +0000 Subject: [PATCH 2/2] feat: day-10, service monitor --- docs/k8s/day-10/files/nginx-config.yml | 17 ++++++++ docs/k8s/day-10/files/nginx-deployment.yml | 43 +++++++++++++++++++ .../day-10/files/nginx-service-monitor.yml | 0 docs/k8s/day-10/files/nginx-service.yml | 12 ++++++ docs/k8s/day-10/files/service-monitor-0.yml | 24 ----------- 5 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 docs/k8s/day-10/files/nginx-config.yml create mode 100644 docs/k8s/day-10/files/nginx-deployment.yml create mode 100644 docs/k8s/day-10/files/nginx-service-monitor.yml create mode 100644 docs/k8s/day-10/files/nginx-service.yml delete mode 100644 docs/k8s/day-10/files/service-monitor-0.yml diff --git a/docs/k8s/day-10/files/nginx-config.yml b/docs/k8s/day-10/files/nginx-config.yml new file mode 100644 index 0000000..c230569 --- /dev/null +++ b/docs/k8s/day-10/files/nginx-config.yml @@ -0,0 +1,17 @@ +apiVersion: v1 # versão da API +kind: ConfigMap # tipo de recurso, no caso, um ConfigMap +metadata: # metadados do recurso + name: nginx-config # nome do recurso +data: # dados do recurso + nginx.conf: | # inicio da definição do arquivo de configuração do Nginx + server { + listen 80; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + location /metrics { + stub_status on; + access_log off; + } + } \ No newline at end of file diff --git a/docs/k8s/day-10/files/nginx-deployment.yml b/docs/k8s/day-10/files/nginx-deployment.yml new file mode 100644 index 0000000..ca836b3 --- /dev/null +++ b/docs/k8s/day-10/files/nginx-deployment.yml @@ -0,0 +1,43 @@ +apiVersion: apps/v1 # versão da API +kind: Deployment # tipo de recurso, no caso, um Deployment +metadata: # metadados do recurso + name: nginx-server # nome do recurso +spec: # especificação do recurso + selector: # seletor para identificar os pods que serão gerenciados pelo deployment + matchLabels: # labels que identificam os pods que serão gerenciados pelo deployment + app: nginx # label que identifica o app que será gerenciado pelo deployment + replicas: 3 # quantidade de réplicas do deployment + template: # template do deployment + metadata: # metadados do template + labels: # labels do template + app: nginx # label que identifica o app + annotations: # annotations do template + prometheus.io/scrape: 'true' # habilita o scraping do Prometheus + prometheus.io/port: '9113' # porta do target + spec: # especificação do template + containers: # containers do template + - name: nginx # nome do container + image: nginx # imagem do container do Nginx + ports: # portas do container + - containerPort: 80 # porta do container + name: http # nome da porta + volumeMounts: # volumes que serão montados no container + - name: nginx-config # nome do volume + mountPath: /etc/nginx/conf.d/default.conf # caminho de montagem do volume + subPath: nginx.conf # subpath do volume + - name: nginx-exporter # nome do container que será o exporter + image: 'nginx/nginx-prometheus-exporter:0.11.0' # imagem do container do exporter + args: # argumentos do container + - '-nginx.scrape-uri=http://localhost/metrics' # argumento para definir a URI de scraping + resources: # recursos do container + limits: # limites de recursos + memory: 128Mi # limite de memória + cpu: 0.3 # limite de CPU + ports: # portas do container + - containerPort: 9113 # porta do container que será exposta + name: metrics # nome da porta + volumes: # volumes do template + - configMap: # configmap do volume, nós iremos criar esse volume através de um configmap + defaultMode: 420 # modo padrão do volume + name: nginx-config # nome do configmap + name: nginx-config # nome do volume \ No newline at end of file diff --git a/docs/k8s/day-10/files/nginx-service-monitor.yml b/docs/k8s/day-10/files/nginx-service-monitor.yml new file mode 100644 index 0000000..e69de29 diff --git a/docs/k8s/day-10/files/nginx-service.yml b/docs/k8s/day-10/files/nginx-service.yml new file mode 100644 index 0000000..261815c --- /dev/null +++ b/docs/k8s/day-10/files/nginx-service.yml @@ -0,0 +1,12 @@ +apiVersion: v1 # versão da API +kind: Service # tipo de recurso, no caso, um Service +metadata: # metadados do recurso + name: nginx-svc # nome do recurso + labels: # labels do recurso + app: nginx # label para identificar o svc +spec: # especificação do recurso + ports: # definição da porta do svc + - port: 9113 # porta do svc + name: metrics # nome da porta + selector: # seletor para identificar os pods/deployment que esse svc irá expor + app: nginx # label que identifica o pod/deployment que será exposto \ No newline at end of file diff --git a/docs/k8s/day-10/files/service-monitor-0.yml b/docs/k8s/day-10/files/service-monitor-0.yml deleted file mode 100644 index b2cad87..0000000 --- a/docs/k8s/day-10/files/service-monitor-0.yml +++ /dev/null @@ -1,24 +0,0 @@ -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - annotations: - labels: - app.kubernetes.io/component: prometheus - app.kubernetes.io/instance: k8s - app.kubernetes.io/name: prometheus - app.kubernetes.io/part-of: kube-prometheus - app.kubernetes.io/version: 2.41.0 - name: prometheus-k8s - namespace: monitoring -spec: - endpoints: - - interval: 30s - port: web - - interval: 30s - port: reloader-web - selector: - matchLabels: - app.kubernetes.io/component: prometheus - app.kubernetes.io/instance: k8s - app.kubernetes.io/name: prometheus - app.kubernetes.io/part-of: kube-prometheus \ No newline at end of file