Recientemente anunciamos el último avance del Operador autónomo de Couchbase (CAO) 2.0 beta. Esta versión es una actualización significativa de Couchbase Autonomous Operator. Couchbase Autonomous Operator 2.0 introduce varias características nuevas de nivel empresarial con capacidades totalmente autónomas: seguridad, monitorización, alta disponibilidad y capacidad de gestión. En este blog, examinaremos en profundidad cómo funciona una de ellas.
Colección de métricas Prometheus
El último operador proporciona integración nativa con Couchbase Prometheus Exporter para recopilar y exponer métricas de Couchbase Server. Prometheus puede extraer estas métricas exportadas y visualizarlas en herramientas como Grafana.
Describiremos los pasos para desplegar el clúster con Couchbase Prometheus Exporter y veremos algunas de las métricas a través de Grafana. Este será un simple despliegue de prueba de un solo clúster y no detallará todos los demás pasos necesarios para un despliegue a nivel de producción.
Seguiremos de cerca la Tutorial de Couchbase Autonomous Operator 2.0 Beta sobre la instalación en Amazon EKS.
Requisitos previos
Supongo que ya tiene un Nube privada virtual de Amazon (VPC) a utilizar. Siga la documentación de Primeros pasos con Amazon EKS e instala lo siguiente:
- kubectl
- aws-iam-authenticator
- eksctl
- Pares de claves de Amazon EC2
- Couchbase Autonomous Operator 2.0 Beta
Arquitectura de implantación
Una rápida visión general de la arquitectura de nuestro despliegue.

Consulte el diagrama anterior:
1: Cree el clúster de Kubernetes en Amazon EKS. El clúster administra los recursos y servicios de Kubernetes.
2: Añade recursos de Couchbase instalando las definiciones de recursos personalizadas de Couchbase.
3: Instala el Operador Autónomo Couchbase. Esto crea 2 Pods, el Operador y el Controlador de Admisión en el espacio de nombres Default.
4: Despliega un Cluster Couchbase de 3 nodos en el espacio de nombres Default. Esto crea 3 pods, cada pod tiene un contenedor Couchbase 6.5.0 y un contenedor Couchbase Metrics Exporter.
5: Cree un ServiceMonitor que indique a Prometheus que supervise un recurso de servicio que defina los puntos finales que Prometheus rastrea.
6: Crear un Servicio definirá el puerto que describimos anteriormente en nuestro ServiceMonitor en el espacio de nombres Default.
7: Añada recursos de Prometheus instalando las definiciones de recursos personalizadas de Prometheus.
8: Cree los pods Prometheus/Grafana en el espacio de nombres Monitoring.
Crear el clúster y configurar kubectl
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
$ eksctl crear grupo \ --nombre prasadCAO2 \ --región us-este-1 \ --zonas us-este-1a,us-este-1b,us-este-1c \ --nodegroup-nombre estándar-trabajadores \ --nodo-tipo t3.medio \ --nodos 3 \ --nodos-min 1 \ --nodos-max 4 \ --ssh-acceda a \ --ssh-público-clave ~/couchbase-prasad.pub \ --gestionado [ℹ] eksctl versión 0.16.0 [ℹ] utilizando región us-este-1 [ℹ] subredes para us-este-1a - público:192.168.0.0/19 privado:192.168.96.0/19 [ℹ] subredes para us-este-1b - público:192.168.32.0/19 privado:192.168.128.0/19 [ℹ] subredes para us-este-1c - público:192.168.64.0/19 privado:192.168.160.0/19 [ℹ] utilizando SSH público clave "/Usuarios/krishna.doddi/couchbase-prasad.pub" como "eksctl-prasadCAO2-nodegroup-standard-workers-42:57:cd:cb:28:33:4a:d9:59:4e:73:3b:c0:e8:a3:fe" [ℹ] utilizando Kubernetes versión 1.14 [ℹ] crear EKS grupo "prasadCAO2" en "us-east-1" región con gestionado nodos [ℹ] se crear 2 separar CloudFormation apila para grupo sí mismo y el inicial gestionado nodegroup [ℹ] si usted encuentro cualquier cuestiones, consulte CloudFormation consola o pruebe 'eksctl utils describe-stacks --region=us-east-1 --cluster=prasadCAO2' [ℹ] CloudWatch registro se no sea habilitado para grupo "prasadCAO2" en "us-east-1" [ℹ] usted puede active it con eksctl utils update-cluster-logging --region=us-east-1 --cluster=prasadCAO2 [ℹ] Kubernetes API punto final acceda a se utilice por defecto de {publicAccess=verdadero, privateAccess=falso} para grupo "prasadCAO2" en "us-east-1" [ℹ] 2 secuencial tareas: { crear grupo control avión "prasadCAO2", crear gestionado nodegroup "trabajadores estándar" } [ℹ] edificio grupo pila "eksctl-prasadCAO2-cluster" [ℹ] despliegue de pila "eksctl-prasadCAO2-cluster" [ℹ] edificio gestionado nodegroup pila "eksctl-prasadCAO2-nodegroup-standard-trabajadores" [ℹ] despliegue de pila "eksctl-prasadCAO2-nodegroup-standard-trabajadores" [✔] todos EKS grupo recursos para "prasadCAO2" tienen ha sido creado [✔] guardado kubeconfig como "/Usuarios/krishna.doddi/.kube/config" [ℹ] nodegroup "trabajadores estándar" tiene 3 nodo(s) [ℹ] nodo "ip-192-168-13-207.ec2.internal" es listo [ℹ] nodo "ip-192-168-62-181.ec2.internal" es listo [ℹ] nodo "ip-192-168-93-184.ec2.internal" es listo [ℹ] a la espera para en menos 1 nodo(s) a become listo en "trabajadores estándar" [ℹ] nodegroup "trabajadores estándar" tiene 3 nodo(s) [ℹ] nodo "ip-192-168-13-207.ec2.internal" es listo [ℹ] nodo "ip-192-168-62-181.ec2.internal" es listo [ℹ] nodo "ip-192-168-93-184.ec2.internal" es listo [ℹ] kubectl comando debe trabajo con "/Usuarios/krishna.doddi/.kube/config", pruebe 'kubectl get nodes' [✔] EKS grupo "prasadCAO2" en "us-east-1" región es listo |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
$ kubectl consiga svc NOMBRE TIPO CLÚSTER-IP EXTERNO-IP PUERTO(S) EDAD kubernetes ClusterIP 10.100.0.1 <ninguno> 443/TCP 15m $ kubectl consiga nodos NOMBRE ESTADO ROLES EDAD VERSIÓN ip-192-168-13-207.ec2.interno Listo <ninguno> 4d4h v1.14.9-eks-1f0ca9 ip-192-168-62-181.ec2.interno Listo <ninguno> 4d4h v1.14.9-eks-1f0ca9 ip-192-168-93-184.ec2.internal Listo <ninguno> 4d4h v1.14.9-eks-1f0ca9 |
Configurar kubectl
Este comando es vital, ya que establece las variables pertinentes del nombre de recurso de Amazon (ARN) en ~/.kube/config. Opcionalmente, puede añadir --region regionName para especificar un clúster en una región diferente a la predeterminada. (Su región predeterminada debería haberse especificado cuando configuró por primera vez la CLI de AWS a través de aws configuremando).
|
1 2 3 |
$ aws eks actualización-kubeconfig --nombre prasadCAO2 Añadido nuevo contexto arn:aws:eks:us-este-1:429712224361:grupo/prasadCAO2 a /Usuarios/krishna.doddi/.kube/config |
Instalar las definiciones personalizadas de recursos (CRD)
Nota: He descargado el Operator para MacOS, he renombrado el paquete de couchbase-autonomous-operator-kubernetes_2.0.0-macos-x86_64 a cao-2 y cd'd en este directorio.
El primer paso para instalar el Operador es instalar las definiciones de recursos personalizadas (CRD) que describen los tipos de recursos de Couchbase.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
cao-2 $ kubectl crear -f crd.yaml definición personalizada de recursos.apiextensions.k8s.io/couchbasebuckets.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbaseephemeralbuckets.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbasememcachedbuckets.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbasereplications.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbaseusers.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbasegroups.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbaserolebindings.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbaseclusters.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbasebackups.couchbase.com creado definición personalizada de recursos.apiextensions.k8s.io/couchbasebackupresores.couchbase.com creado |
Instalar el Operador Autónomo 2.0
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cao-2 $ papelera/cbopcfg | kubectl crear -f - cuenta de servicio/couchbase-operador-admisión creado clusterrole.rbac.autorización.k8s.io/couchbase-operador-admisión creado clusterrolebinding.rbac.autorización.k8s.io/couchbase-operador-admisión creado secreto/couchbase-operador-admisión creado despliegue.aplicaciones/couchbase-operador-admisión creado servicio/couchbase-operador-admisión creado mutatingwebhookconfiguration.admisiónregistro.k8s.io/couchbase-operador-admisión creado validatingwebhookconfiguration.admisiónregistro.k8s.io/couchbase-operador-admisión creado cuenta de servicio/couchbase-operador creado papel.rbac.autorización.k8s.io/couchbase-operador creado vinculación de funciones.rbac.autorización.k8s.io/couchbase-operador creado despliegue.aplicaciones/couchbase-operador creado servicio/couchbase-operador creado |
Comprobar el estado del Operador
|
1 2 3 4 5 |
cao-2 $ kubectl consiga despliegues NOMBRE LISTO UP-A-FECHA DISPONIBLE EDAD couchbase-operador 1/1 1 1 96s couchbase-operador-admisión 1/1 1 1 97s |
El Operador está listo para desplegar recursos CouchbaseCluster cuando tanto el Controlador Dinámico de Admisión (couchbase-operator-admission) como el Operador (couchbase-operator) están completamente listos y disponibles.
Preparar la configuración del clúster Couchbase
Voy a desplegar un cluster de 3 nodos de Couchbase Server 6.5.0 con Prometheus Couchbase Exporter. Para ello, he creado mi-cluster.yaml en el directorio actual. Este es sólo mi ejemplo. Aquí está el archivo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
apiVersion: v1 amable: Secreto metadatos: nombre: cb-ejemplo-auth tipo: Opaco datos: nombre de usuario: QWRtaW5pc3RyYXRvcg== Administrador # contraseña: cGFzc3dvcmQ= Contraseña # --- apiVersion: couchbase.com/v2 amable: CouchbaseCluster metadatos: nombre: cb-ejemplo spec: imagen: couchbase/servidor:6.5.0 seguridad: adminSecret: cb-ejemplo-auth en pausa: falso antiAffinity: verdadero softwareUpdateNotifications: verdadero grupos de servidores: - us-este-1a - us-este-1b - us-este-1c securityContext: runAsUser: 1000 runAsNonRoot: verdadero fsGroup: 1000 plataforma: aws grupo: clusterName: cb-ejemplo dataServiceMemoryQuota: 512Mi indexServiceMemoryQuota: 256Mi searchServiceMemoryQuota: 256Mi indexStorageSetting: memoria_optimizado autoFailoverTimeout: 120s autoFailoverMaxCount: 3 autoFailoverOnDataDiskIssues: verdadero autoFailoverOnDataDiskIssuesTimePeriod: 120s autoFailoverServerGroup: falso autoCompaction: databaseFragmentationThreshold: por ciento: 30 talla: 1Gi viewFragmentationThreshold: por ciento: 30 talla: 1Gi compactación paralela: falso ventana de tiempo: iniciar: 02:00 fin: 06:00 abortCompactionOutsideWindow: verdadero tombstonePurgeInterval: 72h servidores: - talla: 3 nombre: todos_servicios servicios: - datos - índice - consulta - busque en cubos: gestionado: falso selector: matchLabels: grupo: cb-ejemplo control: prometheus: habilitado: verdadero imagen: couchbase/exportador:1.0.1 recursos: solicita: cpu: 100m memoria: 100Mi |
Notas:
- Sólo he utilizado un conjunto mínimo de parámetros de configuración. Consulte la Documentación de recursos del clúster Couchbase para obtener una lista completa.
- Incluí la sección de secretos en el mismo archivo para simplificar las cosas.
- Sólo se utilizan los servicios de Datos, Consulta, Índice y Búsqueda.
- Gestionar mis propios cubos en lugar de dejárselo al Operador.
- Anote la etiqueta de la agrupación cb-ejemplo ya que Prometheus lo utilizará más tarde para descubrir el servicio.
Consejo: Asegúrese de que buckets.managed está establecido en false. De lo contrario, si crea un bucket manualmente una vez que el clúster esté en funcionamiento, Kubernetes lo eliminará automáticamente.
Despliegue del clúster Couchbase
|
1 2 3 4 |
cao-2 $ kubectl crear -f mi-grupo.yaml secreto/cb-ejemplo-auth creado couchbasecluster.couchbase.com/cb-ejemplo creado |
Tanto el secreto como el cluster están creados. Esto no significa que estén funcionando todavía, para ello tendrás que verificarlo como se describe en el siguiente paso.
Verificar la implantación
|
1 2 3 4 5 6 7 8 |
cao-2 $ kubectl consiga vainas NOMBRE LISTO ESTADO RESTARTS EDAD cb-ejemplo-0000 2/2 Ejecutar 0 9m5s cb-ejemplo-0001 2/2 Ejecutar 0 8m53s cb-ejemplo-0002 2/2 Ejecutar 0 8m42s couchbase-operador-5c4bd54bbf-fcj9m 1/1 Ejecutar 0 10m couchbase-operador-admisión-6789cd5847-w9rfd 1/1 Ejecutar 0 10m |
Asegúrese de que todas las vainas están Listo y Ejecutar. En caso de que haya algún problema, puede obtener los registros del Operador.
Opcional: Obtener los registros
Si encuentra algún problema en el paso anterior, puede comprobar los registros como se muestra a continuación.
|
1 2 3 4 5 6 7 8 |
cao-2 $ kubectl Registros couchbase-operador-5c4bd54bbf-fcj9m {"nivel":"info","ts":1586879846.061044,"logger":"principal","msg":"couchbase-operator","version":"2.0.0","revisión":"liberación"} ...... {"nivel":"info","ts":1586879986.2216492,"logger":"cluster","msg":"Pod añadido al cluster","cluster":"por defecto/cb-ejemplo","nombre":"cb-example-0002"} {"nivel":"info","ts":1586879987.0798743,"logger":"couchbaseutil","msg":"Reequilibrio","cluster":"por defecto/cb-ejemplo","progreso":0} {"nivel":"info","ts":1586879993.087347,"logger":"cluster","msg":"Reequilibrio completado con éxito","cluster":"por defecto/cb-ejemplo"} {"nivel":"info","ts":1586879993.124682,"logger":"cluster","msg":"Conciliación completada","cluster":"por defecto/cb-ejemplo"} |
Aquí, el clúster Couchbase desplegado sin ningún error.
Opcional: Examine un pod de Couchbase.
Vamos a describir un pod de Couchbase para comprobar qué está ejecutando.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
cao-2 $ kubectl describa vaina cb-ejemplo-0000 Nombre: cb-ejemplo-0000 Espacio de nombres: por defecto ... Etiquetas: aplicación=couchbase couchbase_cluster=cb-ejemplo ... {"contenedores":[{"nombre":"servidor couchbase","imagen":"couchbase/servidor:6.5.0","puertos":[{"nombre":"admin","containerPort":8091,"protocolo":"TCP"} ... servidor.couchbase.com/versión: 6.5.0 Estado: Ejecutar ... Controlado Por: CouchbaseCluster/cb-ejemplo Contenedores: couchbase-servidor: Contenedor ID: docker://7b0e5df433582ad432114248fdce922fd92f63435b110265b823c013fea8c2ac Imagen: couchbase/servidor:6.5.0 ... Estado: Ejecutar ... métricas: Contenedor ID: docker://b4406ec41d2119978971c8fa41fb8077ace782611298ba23d254a0d4383ab5ca Imagen: couchbase/exportador:1.0.0 Imagen ID: ... Puerto: 9091/TC ... Estado: Ejecutar |
De la salida anterior, vemos que cada pod Couchbase está ejecutando 2 contenedores. El primero está ejecutando Couchbase Server 6.5.0 y el otro está ejecutando Couchbase Prometheus Exporter que está utilizando el puerto 9091.
Acceder a la interfaz de administración de Couchbase
En un entorno de producción real, normalmente desplegarías usando DNS y un LoadBalancer actuando como proxy y accederías a Couchbase UI de forma segura, con SSL usando registros DNS SRV. Como estamos en un entorno de pruebas, accederemos a Couchbase UI directamente desde el puerto 8091. Necesitamos un paso más para conseguirlo y es el Port Forwarding.
Reenvío de puertos
|
1 2 3 4 |
cao-2 $ kubectl puerto-adelante cb-ejemplo-0000 8091 & [1] 11375 cao-2 $ Reenvío de 127.0.0.1:8091 -> 8091 Reenvío de [::1]:8091 -> 8091 |
Ahora hemos desplegado tres pods, sin embargo, es suficiente con hacer un port forward desde un pod para acceder a la Couchbase Admin UI.
Acceder a la interfaz de usuario

http://localhost:8091
Crear los cubos

Añadir cubo de muestras y crear cubo de almohadas
Ejecutar una carga de trabajo para generar algunas métricas
Utilizaremos cbc-pillowfight para generar la carga de trabajo. Afortunadamente, esto se incluye junto con el Operador y vamos a desplegarlo. Vamos a hacer una pequeña modificación en el archivo YAML primero, de modo que no se detiene con la carga de los datos, pero realiza operaciones en el cubo. Usaremos el cubo almohada que acabamos de crear.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: lote/v1 amable: Empleo metadatos: nombre: pillowfight spec: plantilla: metadatos: nombre: pillowfight spec: contenedores: - nombre: pillowfight imagen: sequoiatools/pillowfight:v5.0.1 comando: ["cbc-pillowfight", "-U", "couchbase://cb-example-0000.cb-example.default.svc/pillow?select_bucket=true", "-I", "10000", "-B", "1000", "-c", "10000", "-t", "1", "-u", "Administrador", "-P", "contraseña"] restartPolicy: Nunca |
Cambia el cubo de predeterminado a almohada y cambia la opción -c (número de bucles) de 10 a 10.000.
Entonces:
|
1 2 |
cao-2 $ kubectl crear -f pelea de almohadas-datos-cargador.yaml empleo.lote/pelea de almohadas creado |
Pruebas locales de Prometheus y Grafana
Ahora tenemos un Cluster Couchbase de tres nodos con el Prometheus Couchbase Exporter. El exportador está enviando las métricas de Couchbase al puerto 9091. Ahora, podríamos reenviar ese puerto al igual que reenviamos el puerto 8091 para acceder a la interfaz de usuario de la consola web de Couchbase desde nuestro escritorio. Con ese puerto redireccionado, podríamos tener Prometheus y Grafana ejecutándose en contenedores Docker en el escritorio y utilizar el puerto 9091 redireccionado para obtener las métricas en Prometheus y visualizarlas en Grafana.
Este planteamiento tiene una limitación. En primer lugar, tendríamos que reenviar el puerto 9091 desde los 3 nodos y esos nombres de nodo estarían codificados. Hardcoding nombres de nodo es un gran problema en un entorno Kubernetes. Por otra parte, usted realmente no estaría haciendo el reenvío de puertos en un entorno de producción, donde normalmente se despliega con DNS y utilizaría el DNS SRV para conectarse al clúster. Por último, su mejor práctica para ejecutar Prometheus y Grafana en Kubernetes sí mismo, alineando con el paradigma nativo de la nube.
Próximos pasos
En Parte 2Vamos a hacer precisamente eso, aparte del DNS, ya que queremos que sea lo más sencillo posible para realizar pruebas rápidas.
Recursos:
- Descargar Couchbase Autonomous Operator 2.0 Beta para Kubernetes
- Introducción a Couchbase Autonomous Operator 2.0 Beta
- Tutorial - Operador autónomo de Couchbase en EKS
- Comparta su opinión sobre el Foros de Couchbase
Gracias Prasad por compartir. ¿Puedo preguntar cuáles son las métricas clave para monitorear para decidir cuándo escalar el clúster y es posible configurar el auto-escalado de clúster couchbase en K8s?
Saludos