Brant Burnett es un Experto en Couchbase, arquitecto de sistemas y desarrollador .NET con experiencia en desarrollo full-stack de escritorio y web. Durante los últimos 12 años ha estado trabajando con CenterEdge Software, una empresa de software de entretenimiento familiar con sede en Roxboro, Carolina del Norte. Brant tiene experiencia en el desarrollo de aplicaciones para todos los segmentos de su suite de software. En los últimos 4 años ha trabajado en la transición de la infraestructura en la nube de la empresa de una plataforma Microsoft SQL a una plataforma de datos Couchbase NoSQL pura. A través de su trabajo en CenterEdge Brant ha sido capaz de centrarse en la creación de soluciones de software serias para negocios divertidos.

Couchbase es un excelente almacén de datos para aplicaciones escalables en la nube, incluidas las aplicaciones creadas con un arquitectura de microservicios. Kubernetes es una plataforma increíblemente potente para ejecutar microservicios en contenedores, facilitar la gestión de DevOps y reducir la fricción de los desarrolladores. Pero, ¿cómo podemos utilizarlos juntos, reduciendo la fricción y la sobrecarga de gestión en todo el sistema?
Una opción es ejecutar Couchbase dentro de Kubernetes como un StatefulSet. Sin embargo, StatefulSets está todavía en beta. Además, un clúster Couchbase de producción crea una carga importante, por lo que se recomienda ejecutar en nodos dedicados. Esto podría lograrse en Kubernetes usando taints, pero en Software CenterEdge hemos decidido mantenerlo simple y ejecutar el clúster Couchbase en instancias EC2 independientes.
Este post pretende ser un tutorial sobre la configuración de Kubernetes en Amazon Web Services (AWS) para conectarse sin problemas a un clúster Couchbase que se ejecuta en EC2 en AWS. Además, el enfoque es lo suficientemente flexible como para permitir el intercambio de clústeres o la ejecución de clústeres más pequeños dentro de Kubernetes para entornos de desarrollo o control de calidad.
TL;DR
Este enfoque para configurar el acceso a Couchbase en Kubernetes tiene varias ventajas clave:
- Mayor facilidad para configurar sus microservicios con una única y sencilla URL
- Realice cambios en su infraestructura sin necesidad de reconfigurar cada microservicio.
- Posibilidad de intercambiar el clúster de forma transparente durante las actualizaciones de Couchbase.
- Apunte fácilmente la misma URL en un clúster Kubernetes de desarrollo o QA a un clúster Couchbase diferente.
Pasos:
- Asegúrese de que los clústeres de Couchbase y Kubernetes pueden comunicarse entre sí a través de la red.
- Crear un Equilibrador de carga de aplicaciones (ALB) para el bootstrapping utilizando una única URL
- Cree un servicio Kubernetes de tipo ExternalName para resolver el clúster desde sus microservicios
Requisitos previos
Este post asume que se han completado los siguientes prerrequisitos:
- Tiene un clúster Kubernetes ejecutándose en AWS. Hemos implementado nuestro clúster utilizando el soporte oficial kops utilidad. Existe una buena guía aquí.
- Tienes un clúster de Couchbase ejecutándose en AWS en instancias EC2. Utilizamos este script userdata para configurar las instancias al inicio, utilizando tipos de instancia i3 con almacenamiento de instancia SSD NVMe. Descargo de responsabilidad: Este script de datos de usuario no se ha revisado completamente para su uso en producción.
- Ambos clústeres se encuentran en la misma región de AWS.
- La VPC donde reside Couchbase debe tener subredes en al menos dos zonas de disponibilidad (incluso si Couchbase sólo utiliza una).
Configuración de VPC Peering
VPC Peering permitirá instancias en una VPC para hablar con instancias en la otra VPC en la misma región de AWS de forma transparente como si estuvieran en la misma LAN.
Nota: Este paso solo es necesario si la VPC de Couchbase está separada de tu VPC de Kubernetes. Si utilizas la misma VPC para ambas, puedes omitir este paso.
Nota: Las VPC deben utilizar subredes privadas diferentes para evitar conflictos de direcciones IP.
- Abrir Conexiones igualitarias dentro de la VPC en la consola de AWS
- Crear conexión paritaria
- Para el Solicitante, seleccione su VPC de Kubernetes
- Para el Aceptador, seleccione su VPC Couchbase
- Una vez que la conexión esté en estado "Pendiente de aceptación", haga clic con el botón derecho del ratón y seleccione Aceptar solicitud.
Ahora que la Conexión Peering está creada, necesitamos configurar las VPCs para enrutar el tráfico entre ellas. Esto debe hacerse mediante la actualización de la Tablas de rutas para ambas VPC para enrutar el tráfico a la otra para las subredes correctas.
Para este ejemplo, asumiremos que Kubernetes se ejecuta en 10.100.0.0/16, y Couchbase se ejecuta en 10.200.0.0/16.
- Para cada tabla de rutas en la VPC de Kubernetes:
- Vaya a la pestaña Rutas y haga clic en Editar
- Haga clic en Añadir otra ruta
- Introduzca la subred de Couchbase (10.200.0.0/16)
- Seleccione la conexión de peering como destino (empieza por pcx-)
- Haga clic en Guardar
- Ahora repita en la dirección opuesta para cada tabla de rutas en la VPC de Couchbase:
- Vaya a la pestaña Rutas y haga clic en Editar
- Haga clic en Añadir otra ruta
- Introduzca la subred de Kubernetes (10.100.0.0/16)
- Seleccione la conexión de peering como destino (empieza por pcx-)
- Haga clic en Guardar
- Además, asegúrese de que el grupo de seguridad de EC2 para sus instancias de Couchbase está permitiendo los puertos correctos desde la subred de Kubernetes. Los puertos requeridos son los puertos Node-to-client listados en este documento.
Creación de un Application Load Balancer para bootstrapping
Los SDKs de cliente de Couchbase son capaces de arrancar su conexión al servidor a través de múltiples protocolos diferentes. Con el fin de hacer que el clúster sea fácil de usar desde Kubernetes, vamos a centrarnos en el bootstrapping a través del protocolo HTTP en el puerto 8091. Si desea utilizar TLS para asegurar el proceso de bootstrapping, esto podría hacerse utilizando el puerto 18091 en su lugar.
Para soportar este tipo de arranque, crearemos un Application Load Balancer (ALB) en AWS. Esto proporcionará un único punto final que se puede reutilizar independientemente de cualquier cambio en el clúster de Couchbase. También puede ayudar a cambiar de un clúster a otro durante las actualizaciones del clúster.
- En EC2, vaya a Load Balancers y haga clic en Create Load Balancer.
- Seleccione Application Load Balancer y haga clic en Continuar.
- Para "Paso 1: Configurar el equilibrador de carga":
- Introduzca un nombre para su equilibrador de carga, por ejemplo, "couchbase-primary".
- El esquema debería ser "interno". Nota: La selección interna es muy importante para la seguridad.
- Cambie el puerto de 80 a 8091.
- Seleccione la VPC y las subredes donde se ejecuta Couchbase. Si Couchbase solo está en una zona de disponibilidad, seleccione una AZ adicional para cumplir el requisito de ALB.
- Haga clic en "Siguiente: Configurar parámetros de seguridad".
- No hay ajustes en el paso 2. Haga clic en "Siguiente: Configurar grupos de seguridad".
- Cree un nuevo grupo de seguridad para el ALB, con el puerto TCP 8091 abierto para el tráfico entrante, y haga clic en "Siguiente": Configurar enrutamiento".
- Puede que necesites editar tu grupo de seguridad EC2 de Couchbase para abrir el puerto 8091 al tráfico del nuevo grupo de seguridad EC2 creado para el ALB.
- Cree un nuevo Grupo Destino con estos valores:
- Nombre: "couchbase-primary"
- Protocolo "HTTP"
- Puerto: "8091"
- Protocolo de chequeo: "HTTP"
- Health Check Path: "/ui/index.html"
- Haga clic en "Siguiente: Registrar objetivos".
- Para el "Paso 5: Registrar objetivos":
- Seleccione todas las instancias de Couchbase en el clúster.
- Haga clic en "Añadir a registrados" para añadirlos a la lista de la parte superior.
- Haga clic en "Siguiente: Revisar".
- Haga clic en Crear.
- Una vez creado el ALB, podemos obtener su "Nombre DNS", que utilizaremos más adelante.
Pero, ¿qué ocurre con el coste y el rendimiento de los ALB?
El hecho es que el coste de esta configuración es insignificante tanto en términos de gasto como de rendimiento. El equilibrador de carga sólo se utiliza para comunicar la configuración del clúster al cliente. Esta configuración incluye información sobre todos los nodos del clúster y cómo conectarse a ellos.
Una vez finalizado el arranque, el cliente se conecta directamente a los nodos del clúster. Todas las operaciones clave/valor y de consulta pasarán directamente a los nodos, sin pasar por el equilibrador de carga. Esto significa que no hay coste financiero ni de rendimiento para estas operaciones.
Facilitar aún más el arranque desde Kubernetes
Llegados a este punto, ya podemos arrancar nuestros microservicios utilizando una única URL de servidor en la configuración. Esto es mucho más fácil que listar varios servidores en nuestra configuración, cada uno de los cuales puede cambiar con el tiempo a medida que el clúster muta.
Pero la URL que tenemos que utilizar sigue siendo engorrosa, algo así como internal-couchbase-123456789.us-east-1.elb.amazonaws.com. ¿Hay alguna forma de simplificarlo aún más? La respuesta es sí.
Kubernetes también puede ayudar con el descubrimiento de servicios utilizando DNS. En este caso, añadiremos un Servicio de tipo ExternalName. Esto crea un registro CNAME que reenvía el tráfico a un nombre DNS externo. Este registro sólo existe para Pods dentro del clúster Kubernetes, por lo que no afectará a nada fuera de nuestro clúster.
- Cree un archivo llamado "couchbase-primary.yaml" con este contenido:kind: Service
apiVersion: v1
metadatos:
# este será el nombre DNS para acceder al cluster
nombre: couchbase-primary
espec:
tipo: ExternalName
# sustituya el nombre DNS del ALB por el siguiente
externalName: internal-couchbase-123456789.us-east-1.elb.amazonaws.com - Crear el Servicio desde el archivo yaml:kubectl apply -f couchbase-primary.yaml
Ya está. Ahora, podemos arrancar cualquier microservicio que se ejecute en nuestro clúster con una única y sencilla URL:
https://couchbase-primary:8091/. Si necesitamos acceder a él desde un pod en un espacio de nombres diferente, basta con añadir el espacio de nombres, por ejemplo https://couchbase-primary.default:8091/. También puede registrar tantos clusters como necesite utilizando diferentes nombres de dominio.
