Configuración en Kubernetes

Kubernetes ofrece un entorno de administración centrado en contenedores, orquestando la infraestructura de cómputo, redes y almacenamiento para que las cargas de trabajo de los usuarios no tengan que hacerlo.

Kubernetes fue diseñada como una plataforma para poder construir un ecosistema de componentes y herramientas que hacen más fácil el desplegar, escalar y administrar aplicaciones. A menudo, se proporciona la información como un archivo «.yaml».

En el archivo .yaml del objeto de Kubernetes que se quiere crear, obligatoriamente se tiene que indicar los siguientes valores de los campos (como mínimo):

  • apiVersion: qué versión de la API de Kubernetes está usando para crear este objeto.
  • kind: qué clase de objeto se quiere crear.
  • metadata: datos que permiten identificar unívocamente al objeto, incluyendo una cadena de texto para el name, UID, y opcionalmente el namespace.

También se tiene que indicar el campo «spec» del objeto. El formato de este campo es diferente según el tipo de objeto de Kubernetes, y contiene campos anidados específicos de cada objeto.

Para poder ver cómo funcionan los logs distribuidos, tendremos que levantar una instancia de Elasticsearch, Fluentd y Grafana. Para comprobar su funcionamiento, se usa un microservicio incluyendo la opción para configurar los logs de salida hacia Fluentd.

A continuación, vamos a explicar la versión y la configuración que se utiliza cada una de estas tecnologías: 

Elasticsearch

En este caso, utilizaremos la instancia que nos proporciona la Onesait platform

Fluentd

Se ha creado una imagen con la versión v1.4.2-2.0, la cual se encuentra disponible en Azure. en: solucionesregistry.azurecr.io/architecture/fluentd:v1.4.2-2.0

Seguidamente, se detallarán los ficheros necesarios para su configuración en OpenShift: 

fluentd.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
annotations:
deployment.kubernetes.io/revision: ‘9’
namespace: <NAMESPACE>
labels:
app: fluentd
group: onesait-efg
spec:
replicas: 1
selector:
matchLabels:
app: fluentd
template:
metadata:
creationTimestamp: null
labels:
app: fluentd
spec:
volumes:
– name: config-file
configMap:
name: fluentd-config-map
defaultMode: 484
containers:
– resources:
limits:
cpu: 300m
memory: 1Gi
requests:
cpu: 100m
memory: 500Mi
terminationMessagePath: /dev/termination-log
name: fluentd
ports:
– name: 24224tcp24224
containerPort: 24224
protocol: TCP
imagePullPolicy: Always
volumeMounts:
– name: config-file
mountPath: /fluentd/etc/fluent.conf
subPath: fluent.conf
terminationMessagePolicy: File
envFrom:
– configMapRef:
name: caregiver-configmap
image: ‘solucionesregistry.azurecr.io/architecture/fluentd:dev’
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
imagePullSecrets:
– name: solutionsregistry
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

fluentd-service.yaml

kind: Service
apiVersion: v1
metadata:
name: fluentd
namespace: <NAMESPACE>
labels:
group: onesait-efg
k8s-app: fluentd
run: fluentd
spec:
ports:
– protocol: TCP
port: 24224
targetPort: 24224
selector:
app: fluentd
type: ClusterIP
sessionAffinity: None

fluentd-config-map.yaml

kind: ConfigMap
apiVersion: v1
metadata:
name: fluentd-config-map
namespace: <NAMESPACE>
data:
fluent.conf: |
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<filter myapp.**>
@type parser
key_name ESTE
reserve_data true
<parse>
@type none
</parse>
</filter>
<match myapp.**>
@type copy
<store>
@type elasticsearch
host elasticdb
port 9200
logstash_format true
logstash_prefix myapp
logstash_dateformat %Y%m%d
include_tag_key true
type_name app_log
tag_key @log_name
flush_interval 1s
user elastic
password changeme
</store>
<store>
@type stdout
</store>
</match>

Configuración del config map de Fluentd

En el fichero «fluentd-config-map.yaml» hay varios puntos en los que aparece el texto «myapp» (lineas 13, 21 y 28). Esto hace referencia al tag generado en el fichero «logback-spring.xml» de nuestro microservicio dentro del appender «FLUENT_TEXT». Esto nos permite configurar las salidas para diferentes microservicios que necesitemos, por lo que ese fichero es ampliable en caso de que se necesite. 

Grafana

Se ha utilizado la imagen de Grafana 7.2.2m disponible en DockerHub para descargar

A continuación, se detallarán los ficheros necesarios para su configuración en OpenShift: 

grafana.yaml

kind: Deployment
apiVersion: apps/v1
metadata:
namespace: onesait-caregiver
labels:
app: grafana
group: onesait-efg
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
creationTimestamp: null
labels:
app: grafana
spec:
volumes:
– name: config-file
configMap:
name: grafana-config-map
defaultMode: 484
containers:
– resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 500Mi
terminationMessagePath: /dev/termination-log
name: grafana
ports:
– name: 3000tcp3000
containerPort: 3000
protocol: TCP
imagePullPolicy: Always
volumeMounts:
– name: config-file
mountPath: /usr/share/grafana/conf/defaults.ini
subPath: defaults.ini
terminationMessagePolicy: File
envFrom:
– configMapRef:
name: caregiver-configmap
image: ‘grafana/grafana:latest’
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
imagePullSecrets:
– name: solutionsregistry
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600

grafana-service.yaml

kind: Service
apiVersion: v1
metadata:
name: grafana
namespace: <NAMESPACE>
labels:
group: onesait-efg
k8s-app: grafana
run: grafana
spec:
ports:
– protocol: TCP
port: 3000
targetPort: 3000
selector:
app: grafana
type: ClusterIP
sessionAffinity: None

grafana-config-map.yaml

Debido a la extensión del fichero de configuración se podrá descargar desde el siguiente link.

Con esto, ya lo tendríamos todo configurado y listo para trabajar con ello.

Imagen de cabecera: Victoire Joncheray en Unsplash.

Autor

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *