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/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-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