Kubernetes Gestionado te da un clúster de Kubernetes real sin tener que llevar tú la parte difícil. CubePath gestiona el control plane (el API server y todo lo que mantiene sano el clúster), y tus workers corren en VPS de CubePath que tú dimensionas y escalas. Recibes un kubeconfig, apuntas kubectl a él, y despliegas.

Es la forma de correr contenedores en producción: aplicaciones web, APIs, procesos en segundo plano, y todo lo que de otro modo montarías a mano sobre un montón de servidores.

Cómo funciona

Creas un clúster en un proyecto y una ubicación, eligiendo una versión de Kubernetes y uno o más node pools. Un node pool es un grupo de servidores worker idénticos (mismo plan); CubePath los aprovisiona como VPS, los une al clúster, y mantiene el control plane gestionado por delante. Los workers pueden tener IPs públicas o estar en una red privada, y los pods y servicios tienen sus propias redes internas. Cuando el clúster está listo descargas su kubeconfig y lo usas con kubectl o cualquier herramienta de Kubernetes, igual que cualquier otro clúster. Gestionas el clúster, sus node pools y los add-ons desde el panel o la API.

Antes de empezar

  • En el panel: my.cubepath.com → Kubernetes.
  • Por la API: URL base https://api.cubepath.com, autentica con Authorization: Bearer <token> (scopes kubernetes:read / kubernetes:write) y añade X-Requested-With: XMLHttpRequest en las escrituras. Consigue un token en Cuenta → Tokens de API.
  • Tu organización debe estar verificada, sin suspensión y con saldo positivo. Cada worker es un VPS del plan que elijas y se factura como cualquier VPS.
  • Ten kubectl instalado en local para hablar con el clúster una vez levantado.

Crear un clúster

Lista primero las versiones disponibles (GET /kubernetes/versions) y los planes de worker (GET /kubernetes/plans), y luego crea el clúster con al menos un node pool:

curl -X POST https://api.cubepath.com/kubernetes/ \
  -H "Authorization: Bearer $CUBEPATH_TOKEN" \
  -H "X-Requested-With: XMLHttpRequest" \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": 1,
    "name": "prod",
    "location_name": "us-mia-1",
    "version": "v1.30",
    "ha_control_plane": true,
    "node_pools": [
      { "name": "default", "plan": "ck2-2-4", "count": 3, "auto_scale": true }
    ]
  }'

Las opciones:

  • version: déjala fuera para usar la versión por defecto actual.
  • ha_control_plane: un control plane redundante y de alta disponibilidad. Recomendado para producción; déjalo en false para dev/test.
  • allocate_ipv4 / allocate_ipv6: da IPs públicas a los workers (ambas por defecto true). Si desactivas la IPv6 pública, el clúster necesita una red privada (abajo).
  • network: opcional. Conéctalo a una red privada existente con network_id, o haz que se cree una pasando un node_cidr. Los pods y servicios usan sus propios rangos (pod_cidr por defecto 10.42.0.0/16, service_cidr por defecto 10.43.0.0/16); no deben solaparse.
  • node_pools: de uno a diez pools, cada uno con un plan y un count de nodos (de 1 a 100).

El clúster se aprovisiona en segundo plano. Sigue su estado con GET /kubernetes/{uuid}.

Node pools

Un node pool es un conjunto de workers que comparten plan y ajustes de planificación. Dividir los workers en pools te permite mezclar tamaños (por ejemplo un pool general pequeño más un pool grande de memoria) y dirigir cargas con labels y taints.

  • Crear un pool: POST /kubernetes/{cluster_uuid}/node-pools.
  • Escalar o reajustar: PATCH /kubernetes/{cluster_uuid}/node-pools/{pool_uuid} para cambiar desired_nodes, activar o desactivar auto_scale, fijar min_nodes / max_nodes, o actualizar labels y taints. Con el autoescalado activo, el pool crece y se reduce entre el mínimo y el máximo según la demanda.
  • Añadir o quitar workers individuales: POST .../node-pools/{pool_uuid}/nodes y DELETE .../node-pools/{pool_uuid}/nodes/{vps_id}.
  • Eliminar un pool: DELETE /kubernetes/{cluster_uuid}/node-pools/{pool_uuid}.

Conectar con kubectl

Descarga el kubeconfig del clúster y apunta kubectl a él:

curl https://api.cubepath.com/kubernetes/<cluster_uuid>/kubeconfig \
  -H "Authorization: Bearer $CUBEPATH_TOKEN" -o kubeconfig.yaml

export KUBECONFIG=$PWD/kubeconfig.yaml
kubectl get nodes

A partir de aquí es un clúster estándar: aplica manifests, instala charts de Helm, corre lo que quieras.

Add-ons

CubePath tiene un catálogo de add-ons de un clic (controladores de ingress, monitorización y más) que puedes instalar en un clúster en lugar de montar Helm a mano.

  • Explora el catálogo: GET /kubernetes/addons (y GET /kubernetes/addons/{slug} para los detalles).
  • Instala en un clúster: POST /kubernetes/{cluster_uuid}/addons/{slug}/install, opcionalmente con custom_values para sobrescribir los valores por defecto.
  • Mira lo instalado: GET /kubernetes/{cluster_uuid}/addons.
  • Desinstala: DELETE /kubernetes/{cluster_uuid}/addons/{addon_uuid}.

Exponer tus aplicaciones

Para llevar tráfico desde internet a los servicios del clúster, pon un Load Balancer delante; puedes ver los balanceadores que apuntan a un clúster con GET /kubernetes/{cluster_uuid}/loadbalancers. Para clústeres solo internos, conecta una red privada al crearlo y omite las IPs públicas de los workers.

Gestionar el clúster

  • Renombrar: PATCH /kubernetes/{uuid} (nombre y label).
  • Proteger: POST /kubernetes/{uuid}/protection bloquea el borrado hasta que lo desactives.
  • Mover de proyecto: POST /kubernetes/{uuid}/move.
  • Eliminar: DELETE /kubernetes/{uuid} destruye el clúster y sus workers. Desactiva la protección antes si está activa.

Límites

ConceptoLímite
Node pools por clúster1 a 10
Nodos por pool1 a 100
Labels / taints por pool50 de cada

Lo que esto no hace

  • No gestionas el control plane ni tienes SSH a él. Lo lleva CubePath. Interactúas con el clúster a través de la API de Kubernetes (kubeconfig), no entrando en las máquinas del control plane.
  • No expone tus aplicaciones por sí solo. Un clúster recién creado no tiene ingress público hasta que añades un add-on de ingress y un Load Balancer.
  • Un clúster vive en una sola ubicación. La colocación de los workers y su red privada están dentro de una única ubicación.

Referencia de la API

GET    /kubernetes/versions                               Listar versiones de Kubernetes.   (scope: kubernetes:read)
GET    /kubernetes/plans                                  Listar planes de worker.          (scope: kubernetes:read)
POST   /kubernetes/   { project_id, name, location_name, node_pools }  Crear un clúster.    (scope: kubernetes:write)
GET    /kubernetes/                                       Listar tus clústeres.             (scope: kubernetes:read)
GET    /kubernetes/{uuid}                                 Ver un clúster.                   (scope: kubernetes:read)
PATCH  /kubernetes/{uuid}   { name, label }               Renombrar un clúster.             (scope: kubernetes:write)
DELETE /kubernetes/{uuid}                                 Eliminar un clúster.              (scope: kubernetes:write)
POST   /kubernetes/{uuid}/protection   { enabled }        Activar/desactivar protección.    (scope: kubernetes:write)
GET    /kubernetes/{uuid}/kubeconfig                      Descargar el kubeconfig.          (scope: kubernetes:read)
POST   /kubernetes/{uuid}/move   { project_id }           Mover a otro proyecto.            (scope: kubernetes:write)
GET    /kubernetes/{uuid}/loadbalancers                   Balanceadores que lo apuntan.     (scope: kubernetes:read)
GET    /kubernetes/{cluster_uuid}/node-pools              Listar node pools.                (scope: kubernetes:read)
POST   /kubernetes/{cluster_uuid}/node-pools   { name, plan, count }  Crear un node pool.   (scope: kubernetes:write)
PATCH  /kubernetes/{cluster_uuid}/node-pools/{pool_uuid}  Escalar o actualizar un pool.     (scope: kubernetes:write)
DELETE /kubernetes/{cluster_uuid}/node-pools/{pool_uuid}  Eliminar un pool.                 (scope: kubernetes:write)
POST   /kubernetes/{cluster_uuid}/node-pools/{pool_uuid}/nodes   { count }  Añadir workers. (scope: kubernetes:write)
DELETE /kubernetes/{cluster_uuid}/node-pools/{pool_uuid}/nodes/{vps_id}  Quitar un worker.  (scope: kubernetes:write)
GET    /kubernetes/addons                                 Explorar el catálogo de add-ons.  (scope: kubernetes:read)
GET    /kubernetes/{cluster_uuid}/addons                  Listar add-ons instalados.        (scope: kubernetes:read)
POST   /kubernetes/{cluster_uuid}/addons/{slug}/install   Instalar un add-on.               (scope: kubernetes:write)
DELETE /kubernetes/{cluster_uuid}/addons/{addon_uuid}     Desinstalar un add-on.            (scope: kubernetes:write)

Todas las peticiones se autentican con Authorization: Bearer <token> (o X-API-Key). Las peticiones de escritura necesitan además X-Requested-With: XMLHttpRequest.