Kubernetes: supervisión
El monitoreo es uno de los componentes clave para administrar grandes clústeres. Para ello contamos con una serie de herramientas.
Monitoreo con Prometheus
Es un sistema de vigilancia y alerta. Fue construido en SoundCloud y fue de código abierto en 2012. Maneja muy bien los datos multidimensionales.
Prometheus tiene múltiples componentes para participar en el monitoreo:
Prometheus - Es el componente principal que elimina y almacena datos.
Prometheus node explore - Obtiene las matrices de nivel de host y las expone a Prometheus.
Ranch-eye - es un haproxy y expone cAdvisor estadísticas a Prometheus.
Grafana - Visualización de datos.
InfuxDB - Base de datos de series de tiempo utilizada específicamente para almacenar datos del ganadero.
Prom-ranch-exporter - Es una aplicación simple de node.js, que ayuda a consultar el servidor de Rancher para conocer el estado de la pila de servicio.
Agente de Docker de Sematext
Es un agente moderno de recopilación de registros, eventos y métricas compatible con Docker. Se ejecuta como un contenedor pequeño en cada host de Docker y recopila registros, métricas y eventos para todos los contenedores y nodos del clúster. Descubre todos los contenedores (un pod puede contener varios contenedores), incluidos los contenedores para los servicios centrales de Kubernetes, si los servicios centrales se implementan en contenedores Docker. Después de su implementación, todos los registros y métricas están disponibles de inmediato.
Implementación de agentes en nodos
Kubernetes proporciona DeamonSets, lo que garantiza que se agreguen pods al clúster.
Configuración del agente de Docker de SemaText
Se configura mediante variables de entorno.
Obtenga una cuenta gratuita en apps.sematext.com , si aún no tiene una.
Cree una aplicación de SPM de tipo "Docker" para obtener el token de la aplicación de SPM. La aplicación SPM contendrá su evento y métricas de rendimiento de Kubernetes.
Cree una aplicación Logsene para obtener el token de la aplicación Logsene. La aplicación Logsene mantendrá sus registros de Kubernetes.
Edite los valores de LOGSENE_TOKEN y SPM_TOKEN en la definición de DaemonSet como se muestra a continuación.
Tome la última plantilla sematext-agent-daemonset.yml (texto plano sin formato) (que también se muestra a continuación).
Guárdelo en algún lugar del disco.
Reemplace los marcadores de posición SPM_TOKEN y LOGSENE_TOKEN con sus tokens de la aplicación SPM y Logsene.
Crear objeto DaemonSet
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: sematext-agent
spec:
template:
metadata:
labels:
app: sematext-agent
spec:
selector: {}
dnsPolicy: "ClusterFirst"
restartPolicy: "Always"
containers:
- name: sematext-agent
image: sematext/sematext-agent-docker:latest
imagePullPolicy: "Always"
env:
- name: SPM_TOKEN
value: "REPLACE THIS WITH YOUR SPM TOKEN"
- name: LOGSENE_TOKEN
value: "REPLACE THIS WITH YOUR LOGSENE TOKEN"
- name: KUBERNETES
value: "1"
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
- mountPath: /etc/localtime
name: localtime
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: localtime
hostPath:
path: /etc/localtime
Ejecución de Sematext Agent Docker con kubectl
$ kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created
Registro de Kubernetes
Los registros de contenedores de Kubernetes no son muy diferentes de los registros de contenedores de Docker. Sin embargo, los usuarios de Kubernetes deben ver los registros de los pods implementados. Por lo tanto, es muy útil tener información específica de Kubernetes disponible para la búsqueda de registros, como:
- Espacio de nombres de Kubernetes
- Nombre del pod de Kubernetes
- Nombre del contenedor de Kubernetes
- Nombre de la imagen de Docker
- UID de Kubernetes
Uso de ELK Stack y LogSpout
La pila ELK incluye Elasticsearch, Logstash y Kibana. Para recopilar y reenviar los registros a la plataforma de registro, usaremos LogSpout (aunque hay otras opciones como FluentD).
El siguiente código muestra cómo configurar el clúster ELK en Kubernetes y crear un servicio para ElasticSearch:
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: elk
labels:
component: elasticsearch
spec:
type: LoadBalancer
selector:
component: elasticsearch
ports:
- name: http
port: 9200
protocol: TCP
- name: transport
port: 9300
protocol: TCP
Creación de un controlador de replicación
apiVersion: v1
kind: ReplicationController
metadata:
name: es
namespace: elk
labels:
component: elasticsearch
spec:
replicas: 1
template:
metadata:
labels:
component: elasticsearch
spec:
serviceAccount: elasticsearch
containers:
- name: es
securityContext:
capabilities:
add:
- IPC_LOCK
image: quay.io/pires/docker-elasticsearch-kubernetes:1.7.1-4
env:
- name: KUBERNETES_CA_CERTIFICATE_FILE
value: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: "CLUSTER_NAME"
value: "myesdb"
- name: "DISCOVERY_SERVICE"
value: "elasticsearch"
- name: NODE_MASTER
value: "true"
- name: NODE_DATA
value: "true"
- name: HTTP_ENABLE
value: "true"
ports:
- containerPort: 9200
name: http
protocol: TCP
- containerPort: 9300
volumeMounts:
- mountPath: /data
name: storage
volumes:
- name: storage
emptyDir: {}
URL de Kibana
Para Kibana, proporcionamos la URL de Elasticsearch como una variable de entorno.
- name: KIBANA_ES_URL
value: "http://elasticsearch.elk.svc.cluster.local:9200"
- name: KUBERNETES_TRUST_CERT
value: "true"
Se podrá acceder a la interfaz de usuario de Kibana en el puerto del contenedor 5601 y la combinación correspondiente de host / puerto de nodo. Cuando comience, no habrá ningún dato en Kibana (lo que se espera ya que no ha enviado ningún dato).