Présentation de Kubernetes CCM (Cloud Controller Manager) pour Yandex.Cloud



Dans la continuité de la récente version du pilote CSI pour Yandex.Cloud, nous publions un autre projet Open Source pour ce cloud - Cloud Controller Manager . CCM est nécessaire non seulement pour le cluster dans son ensemble, mais aussi pour le pilote CSI lui-même. Les détails sur son objectif et certaines fonctionnalités de mise en œuvre sont sous la coupe.

introduction


Pourquoi est-ce?


Les motifs qui nous ont poussés à développer CCM pour Yandex.Cloud coïncident complètement avec ceux déjà décrits dans l' annonce du pilote CSI. Nous desservons de nombreux clusters Kubernetes de différents fournisseurs de cloud, pour lesquels nous utilisons un seul outil. Il implémente de nombreux équipements «contournant» les solutions managées de ces prestataires. Oui, nous avons un cas et des besoins assez spécifiques, mais les développements créés à cause d'eux peuvent également être utiles à d'autres utilisateurs.

Qu'est-ce que CCM en général?


En règle générale, nous préparons notre environnement pour le cluster de l'extérieur - par exemple, en utilisant Terraform. Mais il est parfois nécessaire de gérer l'environnement cloud environnant à partir d'un cluster . Une telle opportunité est offerte et CCM la met en œuvre .

En particulier, Cloud Controller Manager propose cinq types d'interaction de base:

  1. Instances - implémente une connexion 1: 1 entre un objet nœud dans Kubernetes ( Node) et une machine virtuelle dans un fournisseur de cloud. Pour ce faire, nous:
    • remplissez le champ spec.providerIDde l'objet Node. Par exemple, pour OpenStack CCM, ce domaine a le format suivant: openstack:///d58a78bf-21b0-4682-9dc6-2132406d2bb0. Vous pouvez voir le nom du fournisseur de cloud et l'UUID unique du serveur (machine virtuelle dans OpenStack) de l'objet;
    • 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-.

Auparavant, tout le code interagissant avec le cloud se trouvait principalement dans les référentiels Git du projet Kubernetes à l'adresse k8s.io/kubernetes/pkg/cloudprovider/providers, mais ils ont décidé de le refuser en raison de l'inconvénient de travailler avec une grande base de code. Toutes les anciennes implémentations ont été déplacées vers un référentiel distinct . Pour plus de support et de développement, tous les composants communs ont également été déplacés vers un référentiel séparé .

Comme avec CSI, de nombreux grands fournisseurs de services cloud ont déjà développé leur CCM pour une utilisation cloud dans Kubernetes. Si le fournisseur ne dispose pas de CCM, mais que toutes les fonctions nécessaires sont disponibles via l'API, vous pouvez implémenter CCM vous-même.

Pour écrire votre implémentation CCM, il suffit d'implémenter les interfaces Go nécessaires .

ETc'est ce que nous avons .

la mise en oeuvre


Comment en êtes-vous arrivé là


Nous avons commencé le développement (ou plutôt même l'utilisation) avec le CCM terminé (!) Pour Yandex.Cloud il y a un an.

Cependant, dans cette mise en œuvre, nous manquions:

  • authentification via le jeton JWT IAM;
  • Prise en charge du contrôleur de service.

En accord avec l'auteur (dlisin) dans Telegram, nous avons bifurqué yandex-cloud-controller-manager et ajouté les fonctions manquantes.

Principales caractéristiques


CCM prend actuellement en charge les interfaces suivantes:

  • les instances ;
  • Zones ;
  • LoadBalancer .

À l'avenir, lorsque Yandex.Cloud commencera à travailler avec les fonctionnalités avancées de VPC, nous ajouterons l'interface Routes .

Loadbalanacer comme principal défi


Initialement, nous avons essayé, comme avec d'autres implémentations CCM, de créer une paire de LoadBalanceret TargetGrouppour chacun Serviceavec un type LoadBalancer. Cependant, Yandex.Cloud a montré une limitation intéressante: il ne peut pas être utilisé TargetGroupsavec une intersection Targets(paire SubnetID- IpAddress).



Par conséquent, au sein du CCM mis en place a lancé un contrôleur lors du changement de l'objet Noderecueille des informations sur toutes les interfaces sur chaque machine virtuelle, les groupe comme appartenant à certains NetworkIDcrée sur TargetGrouple NetworkIDet en vous assurant qu'il est courant. Par la suite, lors de la création d'un objet Serviceavec un type, LoadBalanacernous attachons simplement celui créé précédemment TargetGroupaux nouveaux NetworkLoadBalanacer.

Comment commencer à utiliser?


CCM prend en charge Kubernetes version 1.15 et supérieure. Dans le cluster, pour son fonctionnement, il est nécessaire que l'indicateur --cloud-provider=externalsoit défini sur la valeur truede kube-apiserver, kube-controller-manager, kube-scheduler et all kubelet'ov.

Toutes les étapes nécessaires à l'installation elle-même sont décrites dans le fichier README . L'installation se résume à la création d'objets dans Kubernetes à partir de manifestes.

Pour utiliser CCM, vous aurez également besoin de:

  • spécifiez dans le manifeste l'identifiant du répertoire Yandex.Cloud ( folder-id);
  • compte de service pour interagir avec l'API Yandex.Cloud. Dans le manifeste, Secretvous devez transférer les clés autorisées sur le compte de service. La documentation décrit comment créer un compte de service et obtenir les clés.

Nous serons heureux de recevoir des commentaires et de nouveaux problèmes si vous rencontrez des problèmes!

Sommaire


Nous avons utilisé CCM mis en œuvre dans cinq clusters Kubernetes au cours des deux dernières semaines et prévoyons d'augmenter leur nombre à 20 dans le mois à venir. L'utilisation de CCM pour les installations K8 de grande taille et critiques n'est actuellement pas recommandée.

Comme dans le cas de CSI, nous serons heureux si les développeurs Yandex prennent en charge le développement et le support de ce projet - nous sommes prêts à transférer le référentiel à leur demande afin de traiter des tâches plus spécialisées pour nous.

PS


Lisez aussi dans notre blog:


All Articles