Kubernetes

Este documento describe la funcionalidad Kubernetes del discovery de PandoraFMS.

Introducción

Este plugin tiene como finalidad monitorizar nodos y pods de Kubernetes, mediante métricas claves referentes al CPU, memoria, status de estos y de los contenedores de un pod, que son esenciales para llevar un control y seguimiento de estos recursos.

El plugin se conecta al API REST de Kubernetes y monitoriza el entorno mediante las métricas anteriormente mencionadas, generando un agente para cada zona e instancia via XML que envía al servidor de pandora.

Prerrequisites

El plugin debe poder llegar a API de forma remota para poder extraer la información.

Para hacer las solicitudes a través de la api, la cuenta utilizada para autenticar en la ejecución requiere de unos determinados permisos.

Asignación de permisos

A continuación se describen los pasos a seguir para crear un usuario con los permisos suficientes para obtener los datos de la monitorización.

  1. Creación de un “​Cluster role​” de lectura. Se debe crear un fichero.yaml con el siguiente contenido :
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: deployment-reader
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: metrics-reader
rules:
- apiGroups: ["metrics.k8s.io"]
  resources: ["*"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: namespace-reader
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: component-status-reader
rules:
- apiGroups: [""]
  resources: ["componentstatuses"]
  verbs: ["get", "list"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: node-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: node-reader
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: pod-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: deployment-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: deployment-reader
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: metrics-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: metrics-reader
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: namespace-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: namespace-reader
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: component-status-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: component-status-reader
  apiGroup: rbac.authorization.k8s.io
  
---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "list"]
- nonResourceURLs: ["/healthz", "/healthz/ping", "/healthz/log", "/healthz/etcd", "/healthz/poststarthook/crd-informer-synced", "/healthz/poststarthook/generic-apiserver-start-informers", "/healthz/poststarthook/start-apiextensions-controllers", "/healthz/poststarthook/start-apiextensions-informers"]
  verbs: ["get"]
  
---
    
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: service-reader
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/api/v1/services"]
  verbs: ["get"]
  
---
  
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: service-reader-binding
subjects:
- kind: ServiceAccount
  name: default
  namespace: default  
roleRef:
  kind: ClusterRole
  name: service-reader
  apiGroup: rbac.authorization.k8s.io

2. Después se debe aplicar el cluster role :

kubectl apply -f fichero.yaml

Para instalar el addon de “​metrics-server​”, será necesario descargarlo en el entorno de Kubernetes. Se puede obtener de su proyecto de github:

https://github.com/kubernetes-incubator/metrics-server

Una vez descargado solo se tiene que desplegar mediante el comando “​kubectl​”:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Se puede verificar que el despliegue se haya realizado con éxito si al lanzar el siguiente comando el estado de su API figura como “​true​”:

kubectl get apiservices | grep metrics-server
v1beta1.metrics.k8s.io    kube-system/metrics-server True 1m

Si el despliegue tiene éxito, el API de “​metrics-server​” debería quedar accesible:

​kubectl get --raw "/apis/metrics.k8s.io/v1beta1/"
{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"metrics.k8s.io/v1beta1","res
ources":[{"name":"nodes","singularName":"","namespaced":false,"kind":"NodeMetrics
","verbs":["get","list"]},{"name":"pods","singularName":"","namespaced":true,"kind":"P
odMetrics","verbs":["get","list"]}]}

Además, pasados algunos segundos, se deberían poder obtener datos de uso de CPU y memoria de contenedores y nodos:

$ ​kubectl top node
NAMECPU(cores) CPU%MEMORY(bytes)MEMORY%
kube93m968Mi56%4%
$ ​kubectl top pod
NAMECPU(cores)MEMORY(bytes)
pod10m3Mi
pod20m3Mi
pod30m2Mi
pod40m3Mi
pod50m1Mi

Parámetros y configuración

Parámetros

--conf Ruta al archivo de configuración

Archivo de configuración (--conf)

ip               = < IP o host de Kubernetes >
port             = < Puerto del host de kubernetes >
token            = < Token Bearer de autenticación >
connection       = < Modo de conexión, normal o proxy >
proxy            = < Url de conexión >
interval         = < Intervalo en segundos para los agentes y para el analisis de métricas >
agent_group_name = < Nombre del grupo de destino para los agentes creados >
prefix           = < Prefijo para el nombre de los agentes>
transfer_mode    = < Modo de transferencia, tentacle o local >
data_dir         = < (Solo se activa si el transfer_mode es local) Ruta de destino para los XML de cada agente, por defecto "/var/spool/pandora/data_in/" >
tentacle_ip      = < IP de la máquina destino para los agentes creados >
tentacle_port    = < Puerto de tentacle, por defecto : 41121 >

deployments      = < Activar con 1 para habilitar la monitorización de deployments  >
nodes            = < Activar con 1 para habilitar la monitorización de nodes  >
pods             = < Activar con 1 para habilitar la monitorización de pods  >

Ejemplo

ip               = 192.168.49.2
port             = 8443
token            = eyJhbGciOiJSUzI1NiIsImtpZCI6IkVpeVhfTFFzSWpmcGtjZzM0blZrZDY3YUtMbzNqTWZmcmdLZ2NKblVHbTgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50IiwisInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.aC1lPbS5kYR9Fg9hXJaPiQ8cHzjdWlaAfXdPlmPok6LRX0_OZESEhw8to4PZrz2vzt_BUbawUR0NOpHadujHIx7as4Jm8UCRHgmGseyB7mae9vRMFiD1B4EeH5L8lvucydlV2Avx1IV9SyssbypwGCH_jg7tfKz4EMz5aBfgipliRwFaRGdQMX5sjz4AknGxcb2UVOe9LFb_xC-awDEjaGvm_F0tSLxtyGPoJmsvknNmEC9hJLG_AU8Z9Ke5I5oTvEzRmUCqrKz6319p-x9aaF6yUfOFtlnQlLhIz2xkOs8DkkJ1Rk59i2MolzXGwmlGgWkgc7qCgvqXQNjDeX3ySA
connection       = normal
proxy            = http://localhost:8080
interval         = 300
agent_group_name = kubernetes
prefix           = kube.
transfer_mode    = tentacle
data_dir         = /var/spool/pandora/data_in
tentacle_ip      = 172.42.42.101
tentacle_port    = 41121

deployments      = 1
nodes            = 1
pods             = 1

a

Ejecución manual

El formato de la ejecución del plugin es el siguiente:

./pandora_kubernetes --conf < ruta al fichero de configuración >

Por ejemplo:

./pandora_kubernetes --conf /usr/share/pandora_server/util/plugin/kubernetes.conf

La ejecución devolverá una salida en formato JSON con información sobre la ejecución, y generará un fichero XML para cada agente monitorizado que enviará al servidor de Pandora FMS por el método de transferencia indicado en la configuración.

Por ejemplo:

{"summary": {"Total agents": 18, "Nodes agents": 1, "Pods agents": 12, "Deployments agents": 4}}

 

Discovery

Este plugin puede integrarse con el Discovery de Pandora FMS.

Para ello se debe cargar el paquete ".disco" que puede descargar desde la librería de Pandora FMS:

https://pandorafms.com/library/

image.png

Una vez cargado, se podrán monitorizar entornos de Kubernetes creando tareas de Discovery desde la sección Management > Discovery > App

Para cada tarea se solicitarán los siguientes datos mínimos:

image.png

.También se podrá ajustar la configuración de la tarea para personalizar la monitorización deseada:

image.png

Las tareas completadas con éxito tendrán un resumen de ejecución con la siguiente información:

image.png

Agentes y módulos generados por el plugin

La ejecución del plugin, creara los siguientes agentes y módulos:

< prefix.Kubernetes >

Modules

Api status
< Endpoint healthz>
Services
Namespaces
< Component status healthz >
Deployments
< prefix. Nombre deployment >

Modules

Replicas
Updated replicas
Ready replicas
Avalaible replicas
Unavalaible replicas
Available
Progressing
< prefix. Nombre nodo >

Modules

Pods
Pods (%)
CPU (cores)
CPU (%)
Memory (bytes)
Memory (%)
Condition < condition > status

 

< prefix. Nombre pod >

Modules

Pod status
<Condition status>
Containers
Container <nombre contenedor> CPU (cores)
Container <nombre contenedor> CPU (%)
Container <nombre contenedor> Memory (bytes)
Container <nombre contenedor> Memory (%)