Instalación de Hashicorp Vault en Kubernetes: Rápida y Sencilla en 3 Pasos Fáciles

Instalación de Hashicorp Vault en Kubernetes: Rápida y Sencilla en 3 Pasos Fáciles

Introducción

En este artículo, vamos a cubrir la instalación de Hashicorp Vault en Kubernetes. Hashicorp Vault se ha convertido en uno de los estándares de la industria cuando hablamos de gestionar secretos y datos sensibles en entornos de producción, y esto cubre implementaciones en la nube y no nativas de la nube. Pero especialmente en Kubernetes, este es un componente crítico. Ya hemos comentado que los Secretos de Kubernetes no están muy seguros por defecto, por lo que HashiCorp Vault resuelve ese problema.

Métodos de Instalación

Hashicorp Vault proporciona muchos métodos de instalación diferentes que puedes leer en su página oficial aquí; la mayoría todavía se centra en un entorno tradicional. Pero en resumen, estos son los que tienes disponibles:

  • Instalar desde el gestor de paquetes
  • Instalar desde un binario preexistente
  • Instalar desde el código fuente
  • Helm para Kubernetes

Como puedes imaginar, el camino que seguiremos aquí es el de Helm. Supongo que ya estás familiarizado con Helm, pero si no, echa un vistazo aquí, y si también estás en el proceso de crear charts de helm, este otro también puede ayudarte.

Chart de Helm para Hashicorp Vault

Para el propósito de este artículo, vamos a lo que se llama una instalación de hashicorp vault independiente, por lo que no vamos a crear en este post una arquitectura con Alta Disponibilidad (HA) que esté lista para producción, sino algo que pueda ayudarte a comenzar a jugar con la herramienta y ver cómo esta herramienta puede integrarse con otras que pertenecen al mismo entorno nativo de la nube. Para obtener más información sobre cómo implementar Hashicorp Vault en una configuración lista para producción, consulta el siguiente enlace.

Primero necesitamos instalar el chart de helm en nuestro entorno local, pero debemos tener mucho cuidado con la versión de helm que tenemos. Al escribir este artículo, la instalación de Hashicorp Vault requiere una versión de Helm 3.7+, por lo que primero debes verificar la versión que tienes instalada.

En caso de que estés ejecutando una versión anterior, obtendrás el siguiente error:

 Error: parse error at (vault/templates/_helpers.tpl:38): unclosed action

Puedes obtener más detalles sobre este problema de GitHub.

Al momento de escribir este artículo, la última versión de Helm es 3.9, pero esta versión genera un problema con AWS EKS con este error:

 Error: Kubernetes cluster unreachable: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1."
Failed installing **** with helm

Puedes obtener más detalles sobre este problema de GitHub.

Entonces, en ese caso, la mejor manera de asegurarse de que no habrá un problema con la instalación de Hashicorp Vault es degradar a 3.8, y podrás implementar el chart de helm sin ningún problema.

Proceso de Instalación de Hashicorp Vault

Para proceder con la instalación de Hashicorp Vault, necesitamos ejecutar los siguientes comandos:

helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault

Esto instalará dos componentes diferentes: un único servidor de vault como parte de un StatefulSet y un vault-agent-injector para gestionar la inyección de la configuración de vault en los diversos componentes e implementaciones en los otros espacios de nombres.

Para que los pods se ejecuten, necesitamos inicializar y desellarlo antes de estar listos para usar. Para hacer eso, necesitamos entrar dentro del pod del servidor de vault y ejecutar los siguientes comandos:

 vault operator init

Esto generará varias cosas esenciales:

  • Generará las claves para poder desellar el vault y comenzar a usarlo. Mostrará un número diferente de claves, en nuestro ejemplo 5, y necesitarás al menos 3 de ellas para poder desellar el vault.
  • También generará un token raíz para poder iniciar sesión en la CLI e interactuar con el servidor para poder leer y escribir secretos.

Después de eso, necesitaremos ejecutar el siguiente comando al menos tres veces, proporcionando cada uno de ellos con una clave de desellado diferente:

 Vault operator unseal

Después de ese punto, todos los componentes están en ejecución y listos, y podemos concluir nuestra instalación de Hashicorp Vault y comenzar a interactuar con el vault para crear tus secretos.

Instalación de Hashicorp Vault: Todos los Componentes Listos

Bucles de Helm: Truco de Helm #1

Bucles de Helm: Truco de Helm #1

Introducción

Descubre cómo agregar bucles de Helm a tus helm charts para proporcionar un comportamiento más dinámico a tus Helm Charts.

Los Helm Charts se están convirtiendo en la solución predeterminada de facto cuando deseas empaquetar tu implementación de Kubernetes para poder distribuirla o instalarla rápidamente en tu sistema.

Definido varias veces como el apt para Kubernetes por su similitud con el antiguo gestor de paquetes de distribuciones GNU/Linux similares a Debian, parece seguir creciendo en popularidad cada mes en comparación con otras soluciones similares incluso más integradas en Kubernetes como Kustomize, como puedes ver en la imagen de Google Trends a continuación:

Helm Loops: Helm Charts vs Kustomize

Pero crear estos helm charts no es tan fácil como parece. Si ya has estado trabajando en ello, probablemente te hayas atascado en algún punto, o hayas pasado mucho tiempo tratando de hacer algunas cosas. Si es la primera vez que estás creando uno o intentando hacer algo avanzado, espero que todos estos trucos te ayuden en tu camino. Hoy vamos a cubrir uno de los trucos más importantes, y esos son los bucles de Helm.

Introducción a los Bucles de Helm

Si ves cualquier helm chart, seguro que tendrás muchos bloques condicionales. Prácticamente todo está cubierto bajo una estructura if/else basada en los archivos values.yml que estás creando. Pero esto se vuelve un poco complicado cuando hablamos de bucles. Pero lo bueno es que tendrás la opción de ejecutar un bucle de helm dentro de tus helm charts usando la primitiva range.

¿Cómo crear un Bucle de Helm?

El uso de la primitiva range es bastante simple, ya que solo necesitas especificar el elemento que deseas iterar, como se muestra en el fragmento a continuación:

{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}    

Este es un ejemplo bastante simple donde el yaml iterará sobre los valores que has asignado a la estructura pizzaToppings en tu values.yml.

Hay algunos conceptos a tener en cuenta en esta situación:

  • Puedes acceder fácilmente a todo dentro de esta estructura que estás recorriendo. Entonces, si el ingrediente de la pizza tiene campos adicionales, puedes acceder a ellos con algo similar a esto:
{{- range.Values.pizzaToppings }}
- {{ .ingredient.name | title | quote }}
{{- end }}    

Y esto accederá a una estructura similar a esta en tu values.yml:

 pizzaToppings:
	- ingredient:
		name: Piña
		weight: 3

Lo bueno es que puedes acceder a su atributo subyacente sin replicar toda la jerarquía principal hasta llegar a la estructura de bucle porque dentro de la sección de rango, el alcance ha cambiado. Nos referiremos a la raíz de cada elemento que estamos iterando.

¿Cómo acceder a elementos principales dentro de un Bucle de Helm?

En la sección anterior, cubrimos cómo podemos acceder fácilmente al atributo interno dentro de la estructura de bucle debido al cambio de alcance, lo que también tiene un problema. En caso de que quiera acceder a algún elemento en el padre de mi archivo values.yml o en algún lugar fuera de la estructura, ¿cómo puedo acceder a ellos?

Lo bueno es que también tenemos una gran respuesta para eso, pero puedes llegar allí. Necesitamos entender un poco sobre los alcances en Helm.

Como se comentó, . se refiere al elemento raíz en el alcance actual. Si nunca has definido una sección de rango u otra primitiva que cambie el contexto, . siempre se referirá a la raíz de tu values.yml. Es por eso que cuando ves un helm chart, ves todas las estructuras con la siguiente forma de trabajar: .Values.x.y.z, pero ya hemos visto que cuando tenemos una sección range, esto está cambiando, por lo que esta no es una buena manera.

Para resolver eso, tenemos el contexto $ que se refiere constantemente a la raíz del values.yml sin importar cuál sea el alcance actual. Así que eso significa que si tengo el siguiente values.yml:

base:
	- type: slim 
pizzaToppings:
	- ingredient:
		name: Piña
		weight: 3
	- ingredient:
		name: Manzana
		weight: 3

Y quiero referirme al tipo base dentro de la sección de rango similar a antes, puedo hacerlo usando el siguiente fragmento:

{{- range .Values.pizzaToppings }}
- {{ .ingredient.name | title | quote }} {{ $.Values.base.type }}
{{- end }}    

Eso generará la siguiente salida:

 - Piña slim
 - Manzana slim

¡Así que espero que este truco de helm chart te ayude con la creación, modificación o mejora de tus helm charts mejorados en el futuro utilizando bucles de helm sin ninguna preocupación adicional!

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos

En el artículo anterior, describimos qué capacidad proporciona BanzaiCloud Logging Operator y sus características principales. Así que hoy vamos a ver cómo podemos implementarlo.

Lo primero que necesitamos hacer es instalar el operador en sí, y para hacerlo, tenemos un chart de helm a nuestra disposición, así que lo único que necesitaremos hacer son los siguientes comandos:

 helm repo add banzaicloud-stable https://kubernetes-charts.banzaicloud.com
helm upgrade --install --wait --create-namespace --namespace logging logging-operator banzaicloud-stable/logging-operator

Eso creará un namespace de logging (en caso de que aún no lo tengas), y desplegará los componentes del operador en sí, como puedes ver en la imagen a continuación:

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos
BanzaiCloud Logging Operator instalado usando HelmChart

Así que, ahora podemos empezar a crear los recursos que necesitamos usando el CRD que comentamos en el artículo anterior, pero para hacer un resumen. Estos son los que tenemos a nuestra disposición:

  • logging – El recurso de logging define la infraestructura de logging para tu clúster que recoge y transporta tus mensajes de log. También contiene configuraciones para Fluentd y Fluent-bit.
  • output / clusteroutput – Define una Salida para un flujo de logging, donde se envían los mensajes de log. output será basado en namespace, y clusteroutput será basado en clúster.
  • flow / clusterflow – Define un flujo de logging usando filtros y salidas. El flujo dirige los mensajes de log seleccionados a las salidas especificadas. flow será basado en namespace, y clusterflows serán basados en clúster.

Así que, primero que nada, vamos a definir nuestro escenario. No quiero hacer algo complejo; deseo que todos los logs que mis cargas de trabajo generen, sin importar en qué namespace estén, sean enviados a una instancia de Grafana Loki que también he instalado en ese clúster de Kubernetes en un endpoint específico usando la configuración Simple Scalable para Grafana Loki.

Así que, comencemos con los componentes que necesitamos. Primero, necesitamos un objeto de Logging para definir mi infraestructura de Logging, y lo crearé con el siguiente comando.

kubectl -n logging apply -f - <<"EOF"
apiVersion: logging.banzaicloud.io/v1beta1
kind: Logging
metadata:
  name: default-logging-simple
spec:
  fluentd: {}
  fluentbit: {}
  controlNamespace: logging
EOF

Mantendremos la configuración predeterminada para fluentd y fluent-bit solo por el bien del ejemplo, y más adelante en próximos artículos, podemos hablar sobre un diseño específico, pero eso es todo.

Una vez que el CRD se procese, los componentes aparecerán en tu namespace de logging. En mi caso, que estoy usando un clúster de 3 nodos, veré 3 instancias de fluent-bit desplegadas como un DaemonSet y un solo ejemplo de fluentd, como puedes ver en la imagen a continuación:

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos
Configuración de BanzaiCloud Logging Operator después de aplicar el CRD de Logging

Así que, ahora necesitamos definir la comunicación con Loki, y como me gustaría usar esto para cualquier namespace que pueda tener en mi clúster, usaré la opción ClusterOutput en lugar de la normal Output que está basada en namespace. Y para hacer eso, usaremos el siguiente comando (por favor asegúrate de que el endpoint sea el correcto; en nuestro caso, este es loki-gateway.default ya que está ejecutándose dentro del clúster de Kubernetes:

kubectl -n logging apply -f - <<"EOF"
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterOutput
metadata:
 name: loki-output
spec:
 loki:
   url: http://loki-gateway.default
   configure_kubernetes_labels: true
   buffer:
     timekey: 1m
     timekey_wait: 30s
     timekey_use_utc: true
EOF

Y prácticamente tenemos todo; solo necesitamos un flujo para comunicar nuestra configuración de Logging al ClusterOutput que acabamos de crear. Y nuevamente, iremos con el ClusterFlow porque nos gustaría definir esto a nivel de Clúster y no de manera basada en namespace. Así que usaremos el siguiente comando:

 kubectl -n logging  apply -f - <<"EOF"
apiVersion: logging.banzaicloud.io/v1beta1
kind: ClusterFlow
metadata:
  name: loki-flow
spec:
  filters:
    - tag_normaliser: {}
  match:
    - select: {}
  globalOutputRefs:
    - loki-output
EOF

Y después de un tiempo para recargar la configuración (1-2 minutos más o menos), comenzarás a ver en los rastros de Loki algo como esto:

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos
Grafana mostrando los logs enviados por el BanzaiCloud Logging Operator

Y eso indica que ya estamos recibiendo el envío de logs de los diferentes componentes, principalmente el elemento fluentd que configuramos en este caso. Pero creo que es mejor verlo gráficamente con Grafana:

Operador de Registro de BanzaiCloud en Kubernetes Simplificado en 5 minutos
Grafana mostrando los logs enviados por el BanzaiCloud Logging Operator

¡Y eso es todo! Y cambiar nuestra configuración de logging es tan simple como cambiar el componente CRD que definimos, aplicando coincidencias y filtros, o enviándolo a un nuevo lugar. De manera sencilla, tenemos esto completamente gestionado.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Potencia la agregación de registros en Kubernetes con BanzaiCloud Logging Operator

Potencia la agregación de registros en Kubernetes con BanzaiCloud Logging Operator
Potenciar la Agregación de Logs en Kubernetes con BanzaiCloud Logging Operator
Potenciar la Agregación de Logs en Kubernetes con BanzaiCloud Logging Operator (Foto por Markus Spiske en Unsplash)

Ya hemos hablado sobre la importancia de la Agregación de Logs en Kubernetes y por qué el cambio en el comportamiento de los componentes lo convierte en un requisito obligatorio para cualquier nueva arquitectura que implementemos hoy.

Para resolver esa parte, tenemos muchas pilas diferentes de las que probablemente hayas oído hablar. Por ejemplo, si seguimos el camino tradicional de Elasticsearch, tendremos la pila ELK pura de Elasticsearch, Logstash y Kibana. Ahora esta pila se ha ampliado con los diferentes «Beats» (FileBeat, NetworkBeat, …) que proporcionan un reenviador de logs ligero para ser añadido a la tarea.

Además, puedes cambiar Logstash por un componente de CNCF como Fluentd del que probablemente hayas oído hablar, y en ese caso, estamos hablando de una pila EFK siguiendo el mismo principio. Y también, tener la vista de Grafana Labs usando promtail, Grafana Loki, y Grafana para paneles de control siguiendo una perspectiva diferente.

Luego puedes cambiar y modificar cualquier componente por el de tu preferencia, pero al final, tendrás tres tipos diferentes de componentes:

  • Reenviador: Componente que escuchará todas las entradas de logs, principalmente la salida stdout/stderr de tus contenedores, y lo enviará a un componente central.
  • Agregador: Componente que recibirá todos los rastros del reenviador, y tendrá algunas reglas para filtrar algunos de los eventos, formatear y enriquecer los recibidos antes de enviarlos al almacenamiento central.
  • Almacenamiento: Componente que recibirá los rastros finales para ser almacenados y recuperados por los diferentes clientes.

Para simplificar la gestión de eso en Kubernetes, tenemos un gran Operador de Kubernetes llamado BanzaiCloud Logging Operator que intenta seguir ese enfoque de manera declarativa / política. Así que veamos cómo funciona, y para explicarlo mejor, usaré su diagrama central de su sitio web:

Potencia la agregación de registros en Kubernetes con BanzaiCloud Logging Operator
Arquitectura de BanzaiCloud Logging Operator

Este operador utiliza las mismas tecnologías de las que estábamos hablando. Cubre principalmente los dos primeros pasos: Reenvío y Agregación y la configuración para ser enviada a un Almacenamiento Central de tu elección. Para hacer eso, trabaja con las siguientes tecnologías, todas ellas parte del Paisaje CNCF:

  • Fluent-bit actuará como un reenviador desplegado en modo DaemonSet para recopilar todos los logs que hayas configurado.
  • Fluentd actuará como un agregador definiendo los flujos y reglas de tu elección para adaptar el flujo de rastros que estás recibiendo y enviando a la salida de tu elección.

Y como este es un Operador de Kubernetes, esto funciona de manera declarativa. Definiremos un conjunto de objetos que definirán nuestras políticas de registro. Tenemos los siguientes componentes:

  • logging – El recurso de logging define la infraestructura de registro para tu clúster que recopila y transporta tus mensajes de log. También contiene configuraciones para Fluentd y Fluent-bit.
  • output / clusteroutput – Define una Salida para un flujo de registro, donde se envían los mensajes de log. output será basado en el espacio de nombres, y clusteroutput será basado en el clúster.
  • flow / clusterflow – Define un flujo de registro usando filtros y salidas. El flujo dirige los mensajes de log seleccionados a las salidas especificadas. flow será basado en el espacio de nombres, y clusterflows será basado en el clúster.

En la imagen a continuación, verás cómo estos objetos están «interactuando» para definir tu arquitectura de registro deseada:

Potencia la agregación de registros en Kubernetes con BanzaiCloud Logging Operator
Relación CRD de BanzaiCloud Logging Operator

Y aparte del modo de política, también incluye muchas características geniales como:

  • Aislamiento de espacio de nombres
  • Selectores de etiquetas nativos de Kubernetes
  • Comunicación segura (TLS)
  • Validación de configuración
  • Soporte para múltiples flujos (multiplicar logs para diferentes transformaciones)
  • Soporte para múltiples salidas (almacenar los mismos logs en múltiples almacenamientos: S3, GCS, ES, Loki, y más…)
  • Soporte para múltiples sistemas de registro (múltiples despliegues de Fluentd, Fluent Bit en el mismo clúster)

En próximos artículos hablaremos sobre cómo podemos implementar esto para que puedas ver todos los beneficios que este enfoque basado en CRD y políticas puede proporcionar a tu arquitectura.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Grafana Loki y MinIO: ¡Una combinación perfecta!

Grafana Loki y MinIO: ¡Una combinación perfecta!

Grafana Loki se está convirtiendo en uno de los estándares de facto para la agregación de logs en cargas de trabajo de Kubernetes hoy en día, y hoy vamos a mostrar cómo podemos usar juntos Grafana Loki y MinIO. Ya hemos cubierto en varias ocasiones las capacidades de Grafana Loki que han surgido como la principal alternativa al liderazgo de Elasticsearch en los últimos 5-10 años para la agregación de logs.

Con un enfoque diferente, más ligero, más nativo de la nube, más enfocado en las cosas buenas que Prometheus ha proporcionado pero para logs y con el patrocinio de una gran empresa como Grafana Labs con las herramientas de paneles como líder de un stack de herramientas cada día más enorme en el mundo de la observabilidad.

Y también, ya hemos cubierto MinIO como un almacén de objetos que se puede implementar en cualquier lugar. Es como tener tu servicio S3 en cualquier nube que te guste o en las instalaciones. Así que hoy, vamos a ver cómo ambos pueden trabajar juntos.

Grafana Loki principalmente admite tres modelos de despliegue: monolítico, simple-escalable y distribuido. Prácticamente todo excepto el monolítico tiene el requisito de tener una solución de Almacenamiento de Objetos para poder trabajar en un modo escalable distribuido. Entonces, si tienes tu implementación en AWS, ya estás cubierto con S3. Además, Grafana Loki admite la mayoría de las soluciones de Almacenamiento de Objetos para el ecosistema en la nube de los principales proveedores. Aún así, el problema surge cuando deseas confiar en Grafana Loki para una instalación en la nube privada o en las instalaciones.

En ese caso, es donde podemos confiar en MinIO. Para ser honesto, puedes usar MinIO también en el mundo de la nube para tener una solución más flexible y transparente y evitar cualquier dependencia con un proveedor de nube. Aún así, para las instalaciones, su uso se ha vuelto obligatorio. Una de las grandes características de MinIO es que implementa la API de S3, por lo que prácticamente cualquier cosa que admita S3 funcionará con MinIO.

En este caso, solo necesito adaptar algunos valores en el gráfico de helm de Loki en el modo simple-distribuido como se muestra a continuación:

 loki:
  storage:
    s3:
      s3: null
      endpoint: http://minio.minio:9000
      region: null
      secretAccessKey: XXXXXXXXXXX
      accessKeyId: XXXXXXXXXX
      s3ForcePathStyle: true
      insecure: true

Simplemente estamos apuntando al endpoint de nuestro inquilino de MinIO, en nuestro caso, también implementado en Kubernetes en el puerto 9000. También estamos proporcionando las credenciales para conectar y finalmente mostrando que necesita s3ForcePathSyle: true es necesario para que el endpoint se transforme a minio.minio:9000/bucket en lugar de bucket.minio.minio:9000, por lo que funcionará mejor en un ecosistema de Kubernetes.

Y eso es prácticamente todo; tan pronto como lo inicies, comenzarás a ver que los buckets comienzan a poblarse como lo harían en caso de que estuvieras usando S3, como puedes ver en la imagen a continuación:

MinIO mostrando buckets y objetos de la configuración de Loki
MinIO mostrando buckets y objetos de la configuración de Loki

Ya cubrimos los modelos de implementación de MinIO. Como se muestra aquí, puedes usar su gráfico de helm o el operador de MinIO. Pero, la integración con Loki es aún mejor porque los gráficos de helm de Loki ya incluyen MinIO como un sub-gráfico para que puedas implementar MinIO como parte de tu implementación de Loki basado en la configuración que encontrarás en el values.yml como se muestra a continuación:

 # -------------------------------------
# Configuración para el gráfico hijo `minio`
# -------------------------------------
minio:
  enabled: false
  accessKey: enterprise-logs
  secretKey: supersecret
  buckets:
    - name: chunks
      policy: none
      purge: false
    - name: ruler
      policy: none
      purge: false
    - name: admin
      policy: none
      purge: false
  persistence:
    size: 5Gi
  resources:
    requests:
      cpu: 100m
      memory: 128Mi

¡Así que con un solo comando, puedes tener ambas plataformas implementadas y configuradas automáticamente! Espero que esto sea tan útil para ti como lo fue para mí cuando descubrí e hice este proceso.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente

Cuando todos estamos en este nuevo entorno nativo de la nube donde Kubernetes es el rey indiscutible, necesitas aprender a manejar los manifiestos YAML de Kubernetes todo el tiempo. Te convertirás en un experto en secciones de sangría para asegurarte de que esto pueda ser procesado, etc. Pero debemos admitir que es tedioso. Todos los beneficios del despliegue de Kubernetes hacen que el esfuerzo valga la pena, pero incluso con eso, es bastante complejo poder manejarlo.

Es cierto que, para simplificar esta situación, se han lanzado muchos proyectos, como Helm para gestionar plantillas de manifiestos YAML de Kubernetes relacionados o Kustomize diferentes enfoques para llegar al mismo lugar o incluso soluciones específicas para una distribución de Kubernetes como las Plantillas de Openshift. Pero al final, nada de esto puede resolver el problema a nivel primario. Así que necesitas escribir esos archivos manualmente tú mismo.

¿Y cuál es el proceso ahora? Probablemente estés siguiendo uno diferente, pero te contaré mi enfoque. Dependiendo de lo que estoy tratando de crear, trato de encontrar una plantilla disponible para el Manifiesto YAML de Kubernetes que quiero hacer. Esta plantilla puede ser algún recurso previo que ya he creado. Por lo tanto, uso eso como base, podría ser algo generado para alguna carga de trabajo que ya está desplegada (¡qué bueno que Lens ha existido para simplificar la gestión de cargas de trabajo de Kubernetes en ejecución! Si no conoces Lens, por favor echa un vistazo a este artículo) o si no tienes nada a mano, buscas en Google algo similar probablemente en la documentación de Kubernetes, stack overflow o el primer recurso razonable que Google te proporcione.

Y después de eso, el enfoque es el mismo. Vas a tu Editor de Texto, VS Code en mi caso. Tengo muchos plugins diferentes para hacer este proceso menos doloroso. Muchos linters diferentes validan la estructura del Manifiesto YAML de Kubernetes para asegurarse de que todo esté correctamente sangrado, que no haya etiquetas repetidas o que no falten etiquetas obligatorias en la última versión del recurso, etc.

Las cosas se complican un poco si estás creando un Helm Chart porque en ese caso los linters para YAML no funcionan tan bien y detectan algunos falsos positivos porque no entienden realmente la sintaxis de Helm. También completas tu configuración con algunos linters más para Helm, y eso es todo. Luchas error tras error y cambio tras cambio para tener tu deseado Manifiesto YAML de Kubernetes.

Pero, ¿debería haber una mejor manera de hacer eso? Sí, debería, y esto es lo que herramientas como Monokle intentan proporcionar una mejor experiencia de ese proceso. Veamos cómo funciona. Comenzando con las palabras de su contribuyente:

Monokle es tu amigable interfaz de usuario de escritorio para gestionar manifiestos de Kubernetes. Monokle te ayuda a obtener rápidamente una vista de alto nivel de tus manifiestos y sus recursos contenidos, editar recursos fácilmente sin tener que aprender la sintaxis yaml, comparar recursos con tu clúster, previsualizar y depurar recursos generados con kustomize o Helm, y más.

Monokle te ayuda de las siguientes maneras. En primer lugar, presenta al inicio de tu trabajo un conjunto de plantillas para crear tus Manifiestos YAML de Kubernetes, como puedes ver en la imagen a continuación:

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente
Diálogo de Selección de Plantillas de Monokle

Cuando seleccionas una plantilla, puedes completar los valores requeridos gráficamente sin necesidad de escribir código YAML tú mismo, como puedes ver en la imagen a continuación:

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente
Proceso de Población de Valores de Plantilla de Monokle

También admite el reconocimiento de recursos de Helm Chart y Kustomize, por lo que verás rápidamente tus gráficos, y puedes editarlos de una manera más moderna incluso gráficamente para algunos de los recursos también:

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente
Modificación de Helm Chart usando Monokle

Permite una buena integración de varias maneras, en primer lugar con OPA para que pueda validar todas las reglas y mejores prácticas que has definido y también puedes conectarte a un clúster en ejecución para ver los recursos desde allí y también ver la diferencia entre ellos si existe para simplificar el proceso y proporcionar más agilidad en el proceso de creación de Manifiestos YAML de Kubernetes

Además de todo eso, Monokle es un componente certificado por la fundación CNCF, por lo que estarás utilizando un proyecto respaldado por la misma fundación que se encarga de Kubernetes en sí, entre otras tareas:

Aprende a Escribir Manifiestos YAML de Kubernetes de Manera Más Eficiente
Monokle es parte del Paisaje de la Fundación CNCF

Si deseas descargar Monokle, pruébalo y puedes hacerlo desde su página web: https://monokle.kubeshop.io/ y estoy seguro de que tu rendimiento escribiendo Manifiestos YAML de Kubernetes te lo agradecerá pronto!

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Grafana y LDAP: Aumenta la seguridad en menos de 5 minutos

Grafana y LDAP: Aumenta la seguridad en menos de 5 minutos

Este artículo cubrirá cómo integrar rápidamente Grafana y el servidor LDAP para aumentar la seguridad de su aplicación

Grafana es una de las herramientas de panel más utilizadas, principalmente para las plataformas de observabilidad en entornos de carga de trabajo en la nube. Pero ninguna de estas herramientas está completa hasta que pueda configurarlas para cumplir con sus estándares de seguridad. La seguridad se está volviendo cada vez más importante y esto es especialmente cierto cuando hablamos de cualquier componente relacionado con la nube. Por lo tanto, este tema siempre debe ser algo que cualquier arquitecto de la nube tenga en mente cuando esté definiendo o implementando cualquier pieza de software hoy en día.

Y en ese punto, la integración LDAP es una de las principales cosas que siempre necesitarás hacer. No conozco ninguna empresa, grande o pequeña, que permita el uso de cualquier herramienta con una interfaz gráfica de usuario si no está conectada al directorio corporativo.

Así que, veamos cómo podemos implementar esto con una herramienta popular como Grafana. En mi caso, voy a usar una versión en contenedor de Grafana, pero los pasos y cosas a hacer siguen siendo los mismos sin importar el modelo de implementación.

La tarea que vamos a realizar se basa en tres pasos:

  • Habilitar la configuración de LDAP
  • Configuración básica de LDAP
  • Configuración de mapeo de grupos

Lo primero que necesitamos modificar es el grafana.ini añadiendo el siguiente fragmento:

    [auth.ldap]
    enabled = true
    config_file = /etc/grafana/ldap.toml

Eso significa que estamos habilitando la autenticación basada en LDAP y estableciendo la ubicación del archivo de configuración de LDAP. Este ldap.toml tiene toda la configuración necesaria para el LDAP:

    [[servers]]
    host = "localhost"
    port = 389
    use_ssl = false
    start_tls = false
    ssl_skip_verify = false
  
    bind_dn = "XXXXXX-XXXXXXXXX"
    bind_password = "XXXXXX"
    
	search_filter = "(&(sAMAccountName=%s)(memberOf=ADMIN_GROUP))"
    search_base_dns = [DC=example,DC=org"]

  
    [servers.attributes]
    member_of = "member"
    email =  "mail"
    name = "givenName"
    surname = "sn"
    username = "sAMAccountName"

    [[servers.group_mappings]]
    group_dn = "*"
    org_role = "Admin"

La primera parte se refiere a la conexión principal. Estableceremos la ubicación del host y el puerto, el usuario administrador y la contraseña. Después de eso, necesitaremos una segunda sección que defina search_filter y search_base_dns para definir los usuarios que pueden acceder al sistema.

Finalmente, tenemos otra sección para definir el mapeo entre los atributos de LDAP y los atributos de Grafana para poder recopilar los datos del LDAP.

    [servers.attributes]
    member_of = "member"
    email =  "mail"
    name = "givenName"
    surname = "sn"
    username = "sAMAccountName"

Además, podemos definir los privilegios que los diferentes grupos permiten tener a los varios org_roles en Grafana, como puedes ver en el fragmento a continuación:

    [[servers.group_mappings]]
    group_dn = "*"
    org_role = "Admin"

Con todos esos cambios en su lugar, necesitas reiniciar el servidor de Grafana para ver toda esta configuración aplicada. Después de ese punto, puedes iniciar sesión usando las credenciales de LDAP como puedes ver en la imagen a continuación y ver todos los datos recuperados del servidor LDAP:

Grafana y LDAP: Aumenta la seguridad en menos de 5 minutos

Usando el servidor admin por defecto, también puedes usar una nueva función para probar la configuración de LDAP usando la opción LDAP que puedes ver en la imagen a continuación:

Grafana y LDAP: Aumenta la seguridad en menos de 5 minutos

Y luego puedes buscar un Usuario y verás cómo este usuario se desempeñará en el servidor de Grafana:

  • Verificar los atributos que se mapearán del servidor LDAP al servidor Grafana
  • También verificar el estado de actividad y el rol permitido a este usuario

Puedes ver un ejemplo en la imagen a continuación:

Espero que este artículo te ayude a mejorar la configuración de seguridad en tus instalaciones de Grafana para integrarse con el servidor LDAP. Si deseas ver más información sobre este y temas similares, te animo a que eches un vistazo a los enlaces que encontrarás debajo de estas oraciones.

Operadores de Kubernetes: 5 cosas que realmente necesitas saber

Operadores de Kubernetes: 5 cosas que realmente necesitas saber
Operadores de Kubernetes: 5 Cosas Que Realmente Necesitas Saber
Operadores de Kubernetes: 5 Cosas Que Realmente Necesitas Saber (Foto por Dan Lohmar en Unsplash)

Lectura relacionada: Controlador vs operador en Kubernetes: la diferencia real.

El Operador de Kubernetes ha sido la nueva norma para desplegar grandes cargas de trabajo en Kubernetes, pero como algunos de estos principios no se alinean inmediatamente con los conceptos principales de Kubernetes, generalmente genera un poco de confusión y dudas cuando necesitas usarlos o incluso crearlos.

¿Qué Son los Operadores de Kubernetes?

Los operadores son la forma de extender las capacidades de Kubernetes para gestionar grandes cargas de trabajo donde se relacionan diferentes opciones. En componentes con una arquitectura distribuida, como un sistema de monitoreo, un sistema de agregación de registros, o incluso un service mesh, puedes encontrar eso. Basado en las palabras de la documentación oficial de Kubernetes, los operadores se definen de la siguiente manera:

Los operadores son extensiones de software para Kubernetes que utilizan recursos personalizados para gestionar aplicaciones y sus componentes. Los operadores siguen los principios de Kubernetes, notablemente el bucle de control.

Su uso principal es para servicios estándar y no tanto para aplicaciones simples o cargas de trabajo de usuario, pero podría usarse en casos incluso para ese escenario.

¿Cómo Funciona el Operador de Kubernetes?

El concepto central detrás del Operador de Kubernetes es el concepto de extensión. Se basa en la definición y gestión de objetos personalizados de Kubernetes llamados Definición de Recursos Personalizados (CRDs) que permiten una descripción al estilo Kubernetes de nuevos conceptos que podrías necesitar para tus cargas de trabajo.

Algunos ejemplos de estos CRDs son el ServiceMonitor o PodMonitor que explicamos en publicaciones anteriores, por ejemplo, pero hay muchos más para agregar. Entonces, eso significa que ahora tienes un nuevo archivo YAML para definir tus objetos, y puedes usar las primitivas principales de Kubernetes para crearlos, editarlos o eliminarlos según sea necesario.

Entonces, para que estos componentes realicen cualquier trabajo, necesitas codificar algunos controladores específicos que traduzcan los cambios realizados en esos archivos YAML para alcanzar primitivas al estado del clúster.

Patrón de Operador de Kubernetes (https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md#foundation)
Patrón de Operador de Kubernetes (https://github.com/cncf/tag-app-delivery/blob/eece8f7307f2970f46f100f51932db106db46968/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md#foundation)

¿Cómo Gestionar los Operadores de Kubernetes?

El operador de Kubernetes se puede instalar como cualquier otra carga de trabajo de Kubernetes, por lo que dependiendo del caso puede distribuirse como un archivo YAML o un Helm Chart. Incluso puedes encontrar un repositorio compartido de operadores en OperatorsHub.

OperatorHub: Repositorio Central para Operadores de Kubernetes
OperatorHub: Repositorio Central para Operadores de Kubernetes

Operador de Kubernetes vs. Helm Charts

Como ya se discutió, no son el mismo tipo de objeto que los Helm Charts porque los Helm Charts solo funcionan a nivel de despliegue haciendo el empaquetado y gestionando esos lanzamientos, pero los operadores van un paso más allá porque gestionan y controlan el ciclo de vida a nivel de tiempo de ejecución. Y como se comentó, Helm y los Operadores son compatibles; este es, por ejemplo, cómo funciona el Operador de Prometheus que tiene un Helm Chart para desplegarse, como puedes encontrar aquí.

Cómo Construir un Operador de Kubernetes

Si tu objetivo después de leer esto es crear un Operador de Kubernetes, necesitas saber que ya existen algunos marcos que harán tu vida más fácil en esa tarea.

Herramientas como Kopf, kubebuilder, metacontroller, o incluso el CNCF Operator Framework te proporcionarán las herramientas y las tareas cotidianas para comenzar a enfocarte en lo que tu operador necesita hacer, y ellos manejarán las principales tareas diarias por ti.

 Más Recursos Para Aprender sobre el Operador de Kubernetes

Si deseas aprender más sobre los Operadores de Kubernetes o el patrón de Operador, en ese caso, te recomiendo encarecidamente que mires el Libro Blanco del Operador de CNCF que puedes encontrar aquí.

Esto cubrirá todos los temas discutidos anteriormente con más detalle técnico e introducirá otros temas vitales, como la gestión del ciclo de vida de la seguridad o incluso las mejores prácticas.

Otros recursos interesantes son el recurso bibliográfico del propio Libro Blanco que voy a agregar aquí por si deseas ir directamente a la fuente:

  • Dobies, J., & Wood, J. (2020). Kubernetes Operators. O’Reilly.
  • Ibryam, B. (2019). Kubernetes Patterns. O’Reilly.
  • Operator Framework. (n.d.). Operator Capabilities. Operator Framework. Retrieved 11 2020, 24, from https://operatorframework.io/operator-capabilities/
  • Philips, B. (2016, 03 16). Introducing Operators: Putting Operational Knowledge into Software. CoreOS Blog. Retrieved 11 24, 2020, from https://coreos.com/blog/introducing-operators.html
  • Hausenblas, M & Schimanski, S. (2019). Programming Kubernetes. O’Reilly.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

Principales 6 comandos de Kubectl y consejos de Kubectl

Principales 6 comandos de Kubectl y consejos de Kubectl
Los 6 mejores comandos de Kubectl y consejos de Kubectl
Los 6 mejores comandos de Kubectl y consejos de Kubectl

El comando kubectl puede ser el comando más utilizado que puedes escribir al trabajar con el ecosistema de Kubernetes. Como sabes, kubectl es la puerta de entrada a todo el mundo de Kubernetes, ya que prácticamente todas nuestras interacciones pasan por esa parte, a menos que estés utilizando un enfoque de CLI.

Entonces, basándonos en los principios de productividad, si puedes mejorar solo un 1% en la tarea que realizas más, la mejora global será masiva. Así que, veamos cómo podemos hacer eso aquí.

kubectl es un comando con muchas opciones diferentes que podrían ayudar a aumentar tu productividad mucho. Pero al mismo tiempo, como tiene tantas opciones, es bastante complejo conocerlas todas o estar al tanto de que hay una forma más rápida de hacer el trabajo, y por eso me gustaría agregar algunas opciones aquí para intentar ayudarte con este conjunto de consejos de kubectl.

Consejos de Comandos de Kubectl

Comencemos con los primeros comandos de kubectl que ayudan mucho a mejorar tu productividad:

kubectl explain <resource-object>

Este comando mostrará la referencia de la API para cualquier Objeto de Kubernetes, por lo que te ayudará a conocer la ortografía exacta de la opción que siempre escribes mal.

kubectl get <resource-object> —watch-output

La opción —watch-output añadida a cualquier comando de kubectl funcionará de la misma manera que el comando watch en sí, por lo que actualizará el mismo comando cada 2.0 segundos para ver la versión en tiempo real de ese comando y evitar que necesites escribirlo de nuevo o depender de un comando externo como watch

kubectl get events --sort-by=".lastTimestamp"

Este comando te ayudará cuando quieras ver los eventos en tu contexto actual, pero la principal diferencia es que ordenará la salida por la marca de tiempo de más reciente a más antiguo, por lo que evitarás tener que desplazarte para encontrar los últimos eventos.

kubectl logs --previous

Siempre hablamos de una de las necesidades de una Arquitectura de Agregación de Logs porque los logs son desechables, pero ¿qué pasa si quieres obtener los logs en un contenedor eliminado? Puedes usar la bandera --previous para acceder a los logs de un contenedor que se ha terminado recientemente. Esto no eliminará la necesidad de una técnica de agregación de logs, pero ayudará a solucionar problemas cuando Kubernetes comience a eliminar cosas y necesites saber qué sucedió.

kubectl create <object> <options> -o=yaml --dry-run=client

kubectl create nos permite crear un objeto de nuestra preferencia proporcionando los argumentos requeridos de manera imperativa, pero si añadimos la opción -o=yaml --dry-run=client, no obtendremos nuestro objeto creado. En su lugar, tendremos un archivo YAML que define ese objeto. Así que podemos modificarlo fácilmente a nuestras necesidades sin tener que hacerlo desde cero buscando en Google un ejemplo para comenzar.

kubectl top pods --all-namespaces --sort-by='memory'

Este comando alterará el orden estándar de top pods para mostrar los pods y los recursos que están consumiendo, y al mismo tiempo, ordenará esa salida por el uso de memoria. Así que, en entornos con muchos pods, proporcionará justo en la parte superior aquellos en los que deberías centrarte primero para optimizar los recursos de todo tu clúster.

Alias de Kubectl

Un paso más allá es simplificar esos comandos añadiendo un alias a esto. Como puedes ver, la mayoría de estos comandos son bastante largos ya que tienen muchas opciones, por lo que escribir cada una de estas opciones tomará un tiempo.

Entonces, si quieres ir un paso más allá en esta optimización, siempre puedes añadir un alias a ese comando para simplificarlo mucho. Y si quieres aprender más sobre esos alias, recomiendo encarecidamente el repositorio de GitHub de Ahmet Alp Balkan:

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.

MinIO: Almacenamiento de Objetos Multinube

MinIO: Almacenamiento de Objetos Multinube

Todo el poder del almacenamiento de objetos en tu entorno de Kubernetes

MinIO: Almacenamiento de Objetos Multi Nube
MinIO: Almacenamiento de Objetos Multi Nube (Foto por Timelab Pro en Unsplash)

En este post, me gustaría presentarles MinIO, una verdadera solución de almacenamiento de objetos en la nube con todas las características que puedas imaginar e incluso algunas más. Probablemente estés al tanto del almacenamiento de objetos del servicio AWS S3 que surgió hace algunos años y de la mayoría de las alternativas en los principales proveedores de nube pública como Google o Azure.

¿Pero qué pasa con las nubes privadas? ¿Existe algo disponible que pueda proporcionar todos los beneficios del almacenamiento de objetos, pero sin necesidad de depender de un solo proveedor de nube? Y aún más importante que eso, en el presente y futuro, donde todas las empresas van a ser multi nube, ¿tenemos a nuestra disposición una herramienta que proporcione todas estas características pero que no nos obligue a tener un bloqueo de proveedor? Incluso algunos software, como Loki, te animan a usar una solución de almacenamiento de objetos.

¡La respuesta es sí! Y de eso se trata MinIO, y solo quiero usar sus propias palabras:

“MinIO ofrece almacenamiento de objetos de alto rendimiento, compatible con S3. Nativo de Kubernetes, MinIO es la única suite de almacenamiento de objetos disponible en cada nube pública, distribución de Kubernetes, la nube privada y el edge. MinIO es definido por software y es 100% de código abierto bajo GNU AGPL v3.”

Así que, como dije, todo lo que puedas imaginar e incluso más. Centrémonos en algunos puntos:

  • Nativo de Kubernetes: Puedes desplegarlo en cualquier distribución de Kubernetes de tu elección, ya sea pública o privada (o incluso en el edge).
  • 100% de código abierto bajo GNU AGPL v3, por lo que no hay bloqueo de proveedor.
  • Almacenamiento de objetos compatible con S3, lo que incluso simplifica la transición para clientes con un fuerte vínculo con el servicio AWS.
  • El alto rendimiento es la característica esencial.

Suena genial. ¡Probémoslo en nuestro entorno! Así que voy a instalar MinIO en mi entorno de rancher-desktop, y para hacerlo, voy a usar el operador que tienen disponible aquí:

Para poder instalar, la opción recomendada es usar krew, el gestor de plugins del que ya hablamos en otro artículo. Lo primero que necesitamos hacer es ejecutar el siguiente comando.

 kubectl minio init

Este comando desplegará el operador en el clúster como puedes ver en la imagen a continuación:

MinIO: Almacenamiento de Objetos Multinube

Una vez hecho y todos los componentes estén en funcionamiento, podemos lanzar las interfaces gráficas que nos ayudarán a crear el inquilino de almacenamiento. Para hacerlo, necesitamos ejecutar el siguiente comando:

 kubectl minio proxy -n minio-operator

Esto expondrá la interfaz interna que nos ayudará durante ese proceso. Se nos proporcionará un token JWT para poder iniciar sesión en la plataforma como puedes ver en la imagen a continuación:

MinIO: Almacenamiento de Objetos Multinube

Ahora necesitamos hacer clic en el botón que dice “Crear Inquilino” que nos proporcionará un menú de asistente para crear nuestro inquilino de almacenamiento de objetos MinIO:

MinIO: Almacenamiento de Objetos Multinube

En ese asistente podemos seleccionar varias propiedades dependiendo de nuestras necesidades, como esto es para mi escritorio rancher, intentaré mantener la configuración al mínimo como puedes ver aquí:

MinIO: Almacenamiento de Objetos Multinube

Sería útil si tuvieras el espacio de nombres creado de antemano para ser recuperado aquí. Además, debes tener en cuenta que solo puede haber un inquilino por espacio de nombres, por lo que necesitarás espacios de nombres adicionales para crear otros inquilinos.

Tan pronto como presiones crear, se te proporcionará una clave API y un secreto que necesitas almacenar (o descargar) para poder usar más tarde, y después de eso, el inquilino comenzará su despliegue. Después de unos minutos, tendrás todos tus componentes en funcionamiento, como puedes ver en la imagen a continuación:

MinIO: Almacenamiento de Objetos Multinube

Si vamos a nuestro console-svc, encontrarás la siguiente interfaz gráfica disponible:

MinIO: Almacenamiento de Objetos Multinube

Después de que las credenciales se descarguen en el paso anterior, ingresaremos a la consola de nuestro almacenamiento de objetos en la nube y podremos comenzar a crear nuestros buckets como puedes ver en la imagen a continuación:

MinIO: Almacenamiento de Objetos Multinube

En la pantalla de creación de un bucket, puedes ver varias opciones, como Versionado, Cuota y Bloqueo de Objetos, que dan una visión de las características y capacidades que tiene esta solución.

MinIO: Almacenamiento de Objetos Multinube

Y podemos comenzar a subir y descargar objetos a este nuevo bucket creado:

MinIO: Almacenamiento de Objetos Multinube

Espero que puedas ver esto como una opción para tus despliegues, especialmente cuando necesitas una opción de solución de almacenamiento de objetos para despliegues privados o simplemente como una alternativa a AWS S3.

📚 Want to dive deeper into Kubernetes? This article is part of our comprehensive Kubernetes Architecture Patterns guide, where you’ll find all fundamental and advanced concepts explained step by step.