En términos sencillos, kops es kubectl para clústeres kubernetes (k8s). El poder de kubernetes es que elimina la dependencia del proveedor, proporciona portabilidad para sus aplicaciones, bases de datos en caso de que se tome la decisión de cambiar de proveedor de nube o si los flujos de trabajo en la nube tienen que ir en-prem. Sea cual sea el escenario, kubernetes da esa libertad.

Arquitectura KOPS
En el espíritu de hacer la divulgación completa, es más fácil utilizar las herramientas proporcionadas por los proveedores de nube. Herramientas de código abierto como kops funcionan igual de bien y son muy eficientes.
El Operador Autónomo de Couchbase extiende la API de Kubernetes creando una Definición Personalizada de Recursos (CRD) y registrando un controlador específico de Couchbase (el Operador Autónomo) para gestionar los clusters de Couchbase.
Para este blog utilizaremos AWS como IaaS y demostraremos el uso de kops, sus capacidades y Couchbase Autonomous Operator ejecutando Couchbase Cluster a escala.
¿Qué puede hacer KOPS?
"kops le ayuda a crear, destruir, actualizar y mantener clústeres Kubernetes de grado de producción y alta disponibilidad desde la línea de comandos. AWS (Amazon Web Services) es actualmente soportado oficialmente, con GCE en soporte beta, y VMware vSphere en alfa, y otras plataformas previstas." [1]
Vayamos al grano y veamos cómo funciona...
- Instalar kops
- Crear un clúster k8s en AWS
- Configurar el panel k8s
- Verificación y validación del clúster k8s
- Despliegue de Couchbase Autonomous Operator en K8s
- Despliegue del clúster couchbase
- Resistencia del servicio
- Próximos pasos
Instalar KOPS
OSX desde Homebrew
1 2 |
$ cerveza actualización $ cerveza instale kops |
Linux
1 |
$ rizo -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64chmod +x kops-linux-amd64sudo mv kops-linux-amd64 /usr/local/bin/kops |
Crear un clúster k8s en AWS
Antes de que podamos utilizar kops para crear k8s cluster, necesitamos crear políticas IAM para kops y para que kops pueda aprovisionar los recursos necesarios para crear k8s cluster. Esta es una operación que se realiza una sola vez.
Requisitos previos para los kops
Instalar AWS CLI
Para MacOS
$ pip3 instale awscli -actualización --usuario
Para otras plataformas, pulse aquí
NOTA: operación única
Habilita el entorno AWS ejecutando 'aws configure' y ejecuta los siguientes comandos
1 2 3 4 5 6 7 8 9 10 |
$ aws configure # introducir credenciales apropiadas con usuario con permisos para crear usuario/grupos $ aws Soy crear-grupo --grupo-nombre kops $ aws Soy adjuntar-grupo-política --política-arn arn:aws:Soy::aws:política/AmazonEC2AccesoCompleto --grupo-nombre kops $ aws Soy adjuntar-grupo-política --política-arn arn:aws:Soy::aws:política/AmazonRuta53AccesoCompleto --grupo-nombre kops $ aws Soy adjuntar-grupo-política --política-arn arn:aws:Soy::aws:política/AmazonS3AccesoCompleto --grupo-nombre kops $ aws Soy adjuntar-grupo-política --política-arn arn:aws:Soy::aws:política/IAMFullAccess --grupo-nombre kops $ aws Soy adjuntar-grupo-política --política-arn arn:aws:Soy::aws:política/AmazonVPCFullAccess --grupo-nombre kops $ aws Soy crear-usuario --usuario-nombre kops $ aws Soy añada-usuario-a-grupo --usuario-nombre kops --grupo-nombre kops $ aws Soy crear-acceda a-clave --usuario-nombre kops |
Crear S3 bucket para almacenar kops config/data
En mi caso, se llama rd-k8s-aws y para la región us-oeste-1
1 2 3 |
$ aws s3api crear-cubo --cubo rd-k8s-aws --región us-oeste-1 --crear-cubo-configuración LocationConstraint=us-oeste-1 $ aws s3api poner-cubo-versionado --cubo rd-k8s-aws --versionado-configuración Estado=Activado |
Definir env var's para kops state store y cluster name
Elija cualquier nombre para su cluster, yo he elegido rdc.k8s.local
1 2 3 |
$ exportar KOPS_STATE_STORE=s3://rd-k8s-aws $ exportar KOPS_CLUSTER_NAME=rdc.k8s.local |
Crear cluster k8s con kops
Elija la región de AWS, el tamaño de la instancia y el número de nodos para el clúster k8s.
1 |
$ kops crear grupo --nodo-cuente=7 --nodo-talla=m4.4xlarge --zonas=us-oeste-2a --nombre ${KOPS_CLUSTER_NAME} --estado=${KOPS_STATE_STORE} --sí |
NOTA: tarda unos 5-8 minutos, ¡un buen momento para tomar un café!
La salida de ejemplo tiene este aspecto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ kops valide grupo Validación de grupo rdc.k8s.local INSTANCIA GRUPOS NOMBRE PAPEL TIPO DE MÁQUINA MIN MAX SUBREDES maestro-us-oeste-1a Maestro m3.medio 1 1 us-oeste-1a nodos Nodo m4.4xlarge 7 7 us-oeste-1a NODO ESTADO NOMBRE PAPEL LISTO ip-172-20-42-242.us-oeste-1.compute.internal nodo Verdadero ip-172-20-43-56.us-oeste-1.compute.internal nodo Verdadero ip-172-20-44-17.us-oeste-1.compute.internal nodo Verdadero ip-172-20-44-80.us-oeste-1.compute.internal nodo Verdadero ip-172-20-48-254.us-oeste-1.compute.internal nodo Verdadero ip-172-20-56-254.us-oeste-1.compute.internal nodo Verdadero ip-172-20-60-79.us-oeste-1.compute.internal maestro Verdadero ip-172-20-63-146.us-oeste-1.compute.internal nodo Verdadero Su grupo rdc.k8s.local es listo |
Obtener los nodos y validar el cluster k8s
1 2 3 |
$ kubectl consiga nodos --Mostrar-etiquetas $ kubectl grupo-información |
En este punto kubectl context o k8s context debe apuntar a AWS k8s cluster
Configurar el panel k8s
1 |
$ kubectl aplicar -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
1 2 |
$ kubectl crear cuenta de servicio salpicadero -n por defecto $ kubectl crear clusterrolebinding salpicadero-admin -n por defecto --clusterrole=grupo-admin --cuenta de servicio=por defecto:salpicadero |
En una pestaña/terminal diferente ejecute el siguiente comando para proxy k8s servidor api en el portátil local
1 |
$ kubectl proxy |
Obtener el token para acceder al panel de control k8s
1 |
$ kubectl consiga secreto $(kubectl consiga cuenta de servicio salpicadero -o jsonpath="{.secretos[0].nombre}") -o jsonpath="{.data.token}" | base64 --descodificar |
Elija la opción de usar token y mientras agarra token de arriba, saltar % al final.
Inicie sesión en el salpicadero de k8s en http://127.0.0.1:8001/ui [2]
Verificación y validación del clúster k8s
Validar el cluster k8s utilizando el comando
1 |
$ kops valide grupo |
# comprueba que el número de nodos mencionados en la creación del cluster coincide aquí
1 |
$ kubectl consiga nodos |
Despliegue de Couchbase Autonomous Operator en K8s
Ahora que hemos desplegado el cluster k8s, es el momento de desplegar el operador couchbase
Primero desplegamos el operador, necesitamos habilitar RBAC para el operador, necesitamos crear ClusterRole para el Operador Couchbase
1 |
$ kubectl crear -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/cluster-role.yaml |
Nota: Esta función sólo debe crearse una vez.
Una vez creado el ClusterRole, es necesario crear un ServiceAccount en el espacio de nombres en el que se está instalando el Operador Couchbase y, a continuación, asignar el ClusterRole a ese ServiceAccount mediante una directiva ClusterRoleBinding. En esta guía utilizaremos el por defecto
para crear el ServiceAccount.
1 2 3 |
$ kubectl crear cuenta de servicio couchbase-operador --espacio de nombres por defecto $ kubectl crear clusterrolebinding couchbase-operador --clusterrole couchbase-operador --cuenta de servicio por defecto:couchbase-operador |
Despliegue del operador couchbase
1 |
$ kubectl crear -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/operator.yaml |
La ejecución de este comando descarga la imagen Docker de Couchbase Operator especificada en el comando operador.yaml
y crea un archivo despliegue que gestiona una única instancia de Couchbase Operator. Couchbase Operator utiliza un despliegue para poder reiniciarse si el pod en el que se ejecuta muere.
1 |
$ kubectl consiga despliegues -l aplicación=couchbase-operador |
Debe continuar sondeando el estado del Operador hasta que su salida tenga un aspecto similar a la siguiente salida:
1 2 |
NOMBRE DESEADO ACTUAL UP-A-FECHA DISPONIBLE EDAD couchbase-operador 1 1 1 1 47s |
Cuando el operador couchbase esté en funcionamiento, tendrá un aspecto similar al siguiente
1 2 3 |
$ kubectl consiga vainas NOMBRE LISTO ESTADO RESTARTS EDAD couchbase-operador-7676b7cf47-99b5v 1/1 Ejecutar 0 1m |
Necesitamos desplegar secreto para la autenticación de couchbase servidor GUI
1 |
$ kubectl crear -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/secret.yaml |
Despliega ahora el cluster Couchbase de 10 nodos
1 |
$ kubectl crear -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/couchbase-cluster-multi.yaml |
Obtener el listado de los pods de couchbase
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ kubectl consiga vainas NOMBRE LISTO ESTADO RESTARTS EDAD cb-ejemplo-aws-0000 1/1 Ejecutar 0 7m cb-ejemplo-aws-0001 1/1 Ejecutar 0 6m cb-ejemplo-aws-0002 1/1 Ejecutar 0 5m cb-ejemplo-aws-0003 1/1 Ejecutar 0 4m cb-ejemplo-aws-0004 1/1 Ejecutar 0 3m cb-ejemplo-aws-0005 1/1 Ejecutar 0 2m cb-ejemplo-aws-0006 1/1 Ejecutar 0 2m cb-ejemplo-aws-0007 1/1 Ejecutar 0 1m cb-ejemplo-aws-0008 1/1 Ejecutar 0 1m cb-ejemplo-aws-0009 1/1 Ejecutar 0 50s couchbase-operador-7676b7cf47-99b5v 1/1 Ejecutar 0 17m |
Para acceder a la GUI de couchbase, accederemos al puerto 8091 y para ello podemos realizar un redireccionamiento de puertos como el siguiente
1 |
$ kubectl puerto-adelante cb-ejemplo-aws-0000 8091:8091 |
Se puede acceder a la GUI del servidor Couchbase en http://localhost:8091
Resistencia del servicio
Para mostrar la resistencia del servicio, podemos matar un pod, simulando la pérdida de un nodo couchbase.
1 |
$ kubectl borrar vaina cb-ejemplo-aws-0001 |
Si perdemos un pod, entonces kubernetes comprueba la definición del clúster, y entiende que necesita tener 3 pods, y creará uno nuevo, lo añadirá al clúster, y luego realizará el reequilibrio en el clúster. De este modo se elimina la crucial tarea de administración de monitorizar el cluster en busca de fallos de nodos, decidir qué hacer cuando ocurra y luego realizar la operación de reequilibrio. Todo esto ocurre a cubierto, y las aplicaciones funcionarán sin interrupciones.
Si volvemos a listar los pods, deberíamos ver algo como esto
1 2 3 4 5 6 7 |
$ kubectl consiga vainas --ver ... ... cb-ejemplo-aws-0010 0/1 Pendiente 0 0s cb-ejemplo-aws-0010 0/1 Pendiente 0 0s cb-ejemplo-aws-0010 0/1 ContenedorCrear 0 0s cb-ejemplo-aws-0010 1/1 Ejecutar 0 1s |
Instalando cbc-pillowfight para generar carga KV, nos da una idea de cuales son los límites que podemos empujar en este cluster
Desde un único servidor de aplicaciones, ejecutando pillowfight con los siguientes parámetros
1 |
# cbc-pillowfight -U couchbase://localhost/kopsClusterBucket -u Administrador -P contraseña -J -t 4 -I 10000 -p `nombrehost`. |

Actuación de KV con pillowfight
Con un único servidor de aplicaciones podemos obtener ~34.000 operaciones/seg.
Aumentando el nivel, utilizando otro servidor de aplicaciones para ejecutar pillowfight, podemos obtener un mayor rendimiento del orden de ~51k Ops/Sec.

Actuación de KV con pillowfight
Conclusión
Lo que aprendimos aquí es que usando kops es bastante fácil desplegar clusters Couchbase a escala y el operador autónomo proporciona beneficios como la resiliencia del servicio, auto-rebalanceo, creación automática de buckets, fácil integración con CI/CD pipeline. Los archivos yaml pueden ser estandarizados para Dev/QA/UAT y prod.
Referencias:
[1] https://github.com/kubernetes/kops
[2] solución de problemas del salpicadero del k8s