Kubernetes
Este documento describe la funcionalidad Kubernetes del discovery de PandoraFMS.
- Introducción
- Prerrequisitos
- Parámetros y configuración
- Ejecución manual
- Discovery
- Agentes y módulos generados por el plugin
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.
Prerrequisitos
- Conectividad a la API de Kubernetes
El plugin debe poder llegar a API de forma remota para poder extraer la información.
- Permisos
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.
- 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
- Instalar metrics server
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 >
use_proxy = < Activar con 1 para habilitar la utilización de Proxy >
proxy = < Url de conexión >
filter_namespace = < Especificar namespaces a filtrar. Especificar dentro de corchetes los namespaces entre comillas y separados por comas >
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 >
use_prefix = < Activar con 1 para habilitar la utilización de prefijos para los agentes >
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
use_proxy = 0
proxy =
filter_namespace = ["Jenkins","Glotka"]
interval = 300
agent_group_name = kubernetes
use_prefix = 1
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/
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:
- Kubernetes host: Host de Kubernetes.
- Kubernetes port: Puerto utilizado por Kubernetes.
- Kubernetes token : Token de autenticación bearer, obligatorio si no se conecta mediante proxy.
- Use prefix: Marcar para habilitar de elegir un prefijo para los agentes.
- Prefix: Prefijo elegido para los agentes. Habilitar "Use prefix" para usar esta opción.
- Use proxy : Marcar para activar la conexión mediante proxy.
- Proxy url: Url del proxy, solo estará visible si se marca "Use proxy".
- Filter namespace: Marcar para habilitar la posibilidad de filtrar por namespaces.
- Namespace: Namespaces a filtrar, especificar entre los corchetes, entre comillas, separado por comas. Ejemplo ["default", "glotka"]
- Tentacle IP: IP del servidor de Tentacle al que enviar los datos de los agentes. Normalmente este parámetro no se modificará.
- Tentacle port: Puerto del servidor de Tentacle al que enviar los datos. Normalmente este parámetro no se modificará.
.También se podrá ajustar la configuración de la tarea para personalizar la monitorización deseada:
- Scan Deployments : Si se activa monitorizará los deployments y creará un agente por cada uno de estos.
- Scan Nodes: Si se activa monitorizarál los nodos y creará un agente por cada uno de estos.
- Scan Pods: Si se activa monitorizará los pods y creará un agente por cada uno de estos.
Las tareas completadas con éxito tendrán un resumen de ejecución con la siguiente información:
- Total agents : Número total de agentes generados por la tarea.
- Deployment agents : Número total de agentes de deployments creados por la tarea.
- Pods agents : Número total de agentes de pods creados por la tarea.
- Nodes Agents : Número total de agentes de nodos creados por la tarea.
Agentes y módulos generados por el plugin
La ejecución del plugin, creara los siguientes agentes y módulos:
- Agente global
< prefix.Kubernetes > |
Modules
Api status |
< Endpoint healthz> |
Services |
Namespaces |
< Component status healthz > |
Deployments |
- Un agente por cada deployment
< prefix. Nombre deployment > |
Modules
Replicas |
Updated replicas |
Ready replicas |
Avalaible replicas |
Unavalaible replicas |
Available |
Progressing |
- Un agente por cada Nodo
< prefix. Nombre nodo > |
Modules
Pods |
Pods (%) |
CPU (cores) |
CPU (%) |
Memory (bytes) |
Memory (%) |
Condition < condition > status |
- Un agente por cada pod
< 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 (%) |