Kubernetes - Monitoraggio
Il monitoraggio è uno dei componenti chiave per la gestione di grandi cluster. Per questo, abbiamo una serie di strumenti.
Monitoraggio con Prometeo
È un sistema di monitoraggio e allerta. È stato costruito su SoundCloud ed è stato reso open source nel 2012. Gestisce molto bene i dati multidimensionali.
Prometheus ha più componenti per partecipare al monitoraggio:
Prometheus - È il componente principale che elimina e archivia i dati.
Prometheus node explore - Ottiene le matrici a livello di host e le espone a Prometheus.
Ranch-eye - è un haproxy ed espone cAdvisor statistiche a Prometeo.
Grafana - Visualizzazione dei dati.
InfuxDB - Database di serie temporali utilizzato specificamente per memorizzare i dati dal rancher.
Prom-ranch-exporter - È una semplice applicazione node.js, che aiuta a interrogare il server Rancher per lo stato dello stack di servizio.
Sematext Docker Agent
Si tratta di un moderno agente di raccolta log, eventi e metriche compatibili con Docker. Funziona come un piccolo contenitore su ogni host Docker e raccoglie log, metriche ed eventi per tutti i nodi e contenitori del cluster. Rileva tutti i contenitori (un pod potrebbe contenere più contenitori) inclusi i contenitori per i servizi principali di Kubernetes, se i servizi principali vengono distribuiti nei contenitori Docker. Dopo la sua distribuzione, tutti i log e le metriche sono immediatamente disponibili fuori dagli schemi.
Distribuzione di agenti sui nodi
Kubernetes fornisce DeamonSet che assicura che i pod vengano aggiunti al cluster.
Configurazione dell'agente Docker SemaText
È configurato tramite variabili di ambiente.
Ottieni un account gratuito su apps.sematext.com , se non ne hai già uno.
Creare un'app SPM di tipo "Docker" per ottenere il token dell'app SPM. L'app SPM manterrà le metriche e gli eventi sulle prestazioni di Kubernetes.
Crea un'app Logsene per ottenere il token dell'app Logsene. L'app Logsene manterrà i tuoi log di Kubernetes.
Modificare i valori di LOGSENE_TOKEN e SPM_TOKEN nella definizione DaemonSet come mostrato di seguito.
Prendi l'ultimo modello sematext-agent-daemonset.yml (raw plain-text) (mostrato anche sotto).
Conservalo da qualche parte sul disco.
Sostituisci i segnaposto SPM_TOKEN e LOGSENE_TOKEN con i token dell'app SPM e Logsene.
Crea oggetto 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
Esecuzione di Sematext Agent Docker con kubectl
$ kubectl create -f sematext-agent-daemonset.yml
daemonset "sematext-agent-daemonset" created
Registro di Kubernetes
I log dei contenitori Kubernetes non sono molto diversi dai log dei contenitori Docker. Tuttavia, gli utenti Kubernetes devono visualizzare i log per i pod distribuiti. Pertanto, è molto utile avere a disposizione informazioni specifiche di Kubernetes per la ricerca nei log, come:
- Spazio dei nomi Kubernetes
- Nome del pod Kubernetes
- Nome del contenitore Kubernetes
- Nome dell'immagine Docker
- UID Kubernetes
Utilizzo di ELK Stack e LogSpout
Lo stack ELK include Elasticsearch, Logstash e Kibana. Per raccogliere e inoltrare i log alla piattaforma di registrazione, utilizzeremo LogSpout (sebbene ci siano altre opzioni come FluentD).
Il codice seguente mostra come configurare il cluster ELK su Kubernetes e creare un servizio per 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
Creazione del controller di replica
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 Kibana
Per Kibana, forniamo l'URL Elasticsearch come variabile di ambiente.
- name: KIBANA_ES_URL
value: "http://elasticsearch.elk.svc.cluster.local:9200"
- name: KUBERNETES_TRUST_CERT
value: "true"
L'interfaccia utente di Kibana sarà raggiungibile alla porta del contenitore 5601 e alla corrispondente combinazione host / porta del nodo. Quando inizi, non ci saranno dati in Kibana (che è previsto poiché non hai inviato alcun dato).