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 |
$ brew update $ brew install kops |
Linux
|
1 |
$ curl -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 # enter appropriate credentials with user with perms to create user/groups $ aws iam create-group --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonRoute53FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/IAMFullAccess --group-name kops $ aws iam attach-group-policy --policy-arn arn:aws:iam::aws:policy/AmazonVPCFullAccess --group-name kops $ aws iam create-user --user-name kops $ aws iam add-user-to-group --user-name kops --group-name kops $ aws iam create-access-key --user-name 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 create-bucket --bucket rd-k8s-aws --region us-west-1 --create-bucket-configuration LocationConstraint=us-west-1 $ aws s3api put-bucket-versioning --bucket rd-k8s-aws --versioning-configuration Status=Enabled |
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 |
$ export KOPS_STATE_STORE=s3://rd-k8s-aws $ export 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 create cluster --node-count=7 --node-size=m4.4xlarge --zones=us-west-2a --name ${KOPS_CLUSTER_NAME} --state=${KOPS_STATE_STORE} --yes |
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 validate cluster Validating cluster rdc.k8s.local INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-west-1a Master m3.medium 1 1 us-west-1a nodes Node m4.4xlarge 7 7 us-west-1a NODE STATUS NAME ROLE READY ip-172-20-42-242.us-west-1.compute.internal node True ip-172-20-43-56.us-west-1.compute.internal node True ip-172-20-44-17.us-west-1.compute.internal node True ip-172-20-44-80.us-west-1.compute.internal node True ip-172-20-48-254.us-west-1.compute.internal node True ip-172-20-56-254.us-west-1.compute.internal node True ip-172-20-60-79.us-west-1.compute.internal master True ip-172-20-63-146.us-west-1.compute.internal node True Your cluster rdc.k8s.local is ready |
Obtener los nodos y validar el cluster k8s
|
1 2 3 |
$ kubectl get nodes --show-labels $ kubectl cluster-info |
En este punto kubectl context o k8s context debe apuntar a AWS k8s cluster
Configurar el panel k8s
|
1 |
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
|
1 2 |
$ kubectl create serviceaccount dashboard -n default $ kubectl create clusterrolebinding dashboard-admin -n default --clusterrole=cluster-admin --serviceaccount=default:dashboard |
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 get secret $(kubectl get serviceaccount dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode |
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 https://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 validate cluster |
# comprueba que el número de nodos mencionados en la creación del cluster coincide aquí
|
1 |
$ kubectl get nodes |
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 create -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 create serviceaccount couchbase-operator --namespace default $ kubectl create clusterrolebinding couchbase-operator --clusterrole couchbase-operator --serviceaccount default:couchbase-operator |
Despliegue del operador couchbase
|
1 |
$ kubectl create -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 get deployments -l app=couchbase-operator |
Debe continuar sondeando el estado del Operador hasta que su salida tenga un aspecto similar a la siguiente salida:
|
1 2 |
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE couchbase-operator 1 1 1 1 47s |
Cuando el operador couchbase esté en funcionamiento, tendrá un aspecto similar al siguiente
|
1 2 3 |
$ kubectl get pods NAME READY STATUS RESTARTS AGE couchbase-operator-7676b7cf47-99b5v 1/1 Running 0 1m |
Necesitamos desplegar secreto para la autenticación de couchbase servidor GUI
|
1 |
$ kubectl create -f https://raw.githubusercontent.com/ramdhakne/blogs/master/kops/cbyaml/secret.yaml |
Despliega ahora el cluster Couchbase de 10 nodos
|
1 |
$ kubectl create -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 get pods NAME READY STATUS RESTARTS AGE cb-example-aws-0000 1/1 Running 0 7m cb-example-aws-0001 1/1 Running 0 6m cb-example-aws-0002 1/1 Running 0 5m cb-example-aws-0003 1/1 Running 0 4m cb-example-aws-0004 1/1 Running 0 3m cb-example-aws-0005 1/1 Running 0 2m cb-example-aws-0006 1/1 Running 0 2m cb-example-aws-0007 1/1 Running 0 1m cb-example-aws-0008 1/1 Running 0 1m cb-example-aws-0009 1/1 Running 0 50s couchbase-operator-7676b7cf47-99b5v 1/1 Running 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 port-forward cb-example-aws-0000 8091:8091 |
Se puede acceder a la GUI del servidor Couchbase en https://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 delete pod cb-example-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 get pods --watch ... ... cb-example-aws-0010 0/1 Pending 0 0s cb-example-aws-0010 0/1 Pending 0 0s cb-example-aws-0010 0/1 ContainerCreating 0 0s cb-example-aws-0010 1/1 Running 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 Administrator -P password -J -t 4 -I 10000 -p `hostname` |

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