Presentamos Kubernetes CCM (Cloud Controller Manager) para Yandex.Cloud



Como continuación del reciente lanzamiento del controlador CSI para Yandex.Cloud, estamos publicando otro proyecto de código abierto para esta nube: Cloud Controller Manager . CCM es necesario no solo para el clúster en su conjunto, sino también para el controlador CSI en sí. Los detalles sobre su propósito y algunas características de implementación están por debajo.

Introducción


¿Por qué es esto?


Los motivos que nos impulsaron a desarrollar CCM para Yandex.Cloud coinciden completamente con los ya descritos en el anuncio del controlador CSI. Servimos a muchos grupos de Kubernetes de diferentes proveedores de la nube, para lo cual utilizamos una sola herramienta. Implementa numerosos servicios que "omiten" las soluciones administradas de estos proveedores. Sí, tenemos un caso y necesidades bastante específicos, pero los desarrollos creados por ellos también pueden ser útiles para otros usuarios.

¿Qué es CCM en general?


Como regla general, preparamos nuestro entorno para el clúster desde el exterior , por ejemplo, usando Terraform. Pero a veces es necesario administrar el entorno de nube circundante desde un clúster . Se brinda esa oportunidad y CCM la implementa .

En particular, Cloud Controller Manager proporciona cinco tipos básicos de interacción:

  1. Instancias : implementa una relación 1: 1 entre un objeto de nodo en Kubernetes ( Node) y una máquina virtual en un proveedor de la nube. Para hacer esto, nosotros:
    • Rellene el campo spec.providerIDen el objeto Node. Por ejemplo, para OpenStack CCM, este campo tiene el siguiente formato: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Puede ver el nombre del proveedor de la nube y el UUID único del servidor (máquina virtual en OpenStack) del objeto;
    • nodeInfo Node . , instance type AWS;
    • . , Node NotReady, , providerID. — Node, ;
  2. Zones – failure domain Node, Pod’ ;
  3. LoadBalancerService LoadBalancer , . , Yandex.Cloud NetworkLoadBalancer TargetGroup ;
  4. Route – , .. Kubernetes pod IP- pod’. (VXLAN, GENEVE) :

  5. Volume – PV, PVC SC. CCM, Container Storage Interface (CSI). CSI , , CSI-.

Anteriormente, todo el código que interactuaba con la nube se encontraba principalmente en los repositorios Git del proyecto Kubernetes en la dirección k8s.io/kubernetes/pkg/cloudprovider/providers, pero decidieron rechazar esto debido a la inconveniencia de trabajar con una base de código grande. Todas las implementaciones antiguas se movieron a un repositorio separado . Para mayor comodidad y desarrollo, todos los componentes comunes también se trasladaron a un repositorio separado .

Al igual que con CSI, muchos grandes proveedores de servicios en la nube ya han desarrollado su CCM para uso en la nube en Kubernetes. Si el proveedor no tiene CCM, pero todas las funciones necesarias están disponibles a través de la API, puede implementar CCM usted mismo.

Para escribir su implementación de CCM, es suficiente implementar las interfaces Go necesarias .

YEso es lo que tenemos .

Implementación


¿Cómo llegaste a esto?


Comenzamos el desarrollo (o más bien, incluso lo usamos) con el CCM terminado (!) Para Yandex.Cloud hace un año.

Sin embargo, en esta implementación nos faltó:

  • autenticación a través del token JWT IAM;
  • Servicio de soporte de controlador.

Por acuerdo con el autor (dlisin) en Telegram, bifurcamos yandex-cloud-controller-manager y agregamos las funciones que faltan.

Características clave


CCM actualmente admite las siguientes interfaces:

  • las instancias ;
  • Zonas ;
  • LoadBalancer .

En el futuro, cuando Yandex.Cloud comience a trabajar con las funciones avanzadas de VPC, agregaremos la interfaz de Rutas .

Loadbalanacer como el principal desafío


Inicialmente, intentamos, como con otras implementaciones de CCM, crear un par de LoadBalancery TargetGrouppara cada uno Servicecon un tipo LoadBalancer. Sin embargo, Yandex.Cloud mostró una limitación interesante: no se puede usar TargetGroupscon intersección Targets(par SubnetID- IpAddress).



Por lo tanto, dentro del CCM establecida lanzado un controlador que cuando se cambia el objeto Nodede información recopila sobre todas las interfaces en cada máquina virtual, grupos como pertenecientes a cierta NetworkIDcrea en TargetGroupel NetworkIDy asegurándose de que está en curso. Posteriormente, al crear un objeto Servicecon un tipo, LoadBalanacersimplemente adjuntamos el creado anteriormente TargetGroupa los nuevos NetworkLoadBalanacer.

¿Cómo empezar a usar?


CCM es compatible con Kubernetes versión 1.15 y superior. En el clúster, para su funcionamiento se requiere que el indicador --cloud-provider=externalse establezca en el valor truede kube-apiserver, kube-controller-manager, kube-Scheduler y todos los kubelet'ov.

Todos los pasos necesarios para la instalación en sí se describen en README . La instalación se reduce a crear objetos en Kubernetes a partir de manifiestos.

Para usar CCM también necesitará:

  • especifique en el manifiesto el identificador del directorio Yandex.Cloud ( folder-id);
  • cuenta de servicio para interactuar con la API Yandex.Cloud. En el manifiesto, Secretdebe transferir las claves autorizadas a la cuenta de servicio. La documentación describe cómo crear una cuenta de servicio y obtener las claves.

Estaremos encantados de recibir comentarios y nuevos problemas si encuentra algún problema.

Resumen


Hemos implementado CCM en cinco grupos de Kubernetes en las últimas dos semanas y planeamos expandir su número a 20 en el próximo mes. Actualmente no se recomienda el uso de CCM para instalaciones K8 grandes y críticas.

Como en el caso de CSI, nos alegrará que los desarrolladores de Yandex asuman el desarrollo y el soporte de este proyecto; estamos listos para transferir el repositorio a solicitud de ellos a fin de ocuparnos de tareas más especializadas para nosotros.

PD


Lea también en nuestro blog:


All Articles