Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Devoxx2022 - Qu'avons nous appris après un an à...

Devoxx2022 - Qu'avons nous appris après un an à developper des opérateurs Kubernetes ?

Les operateurs Kubernetes sont un bon moyen d'exploiter encore plus ses cluster Kubernetes et de pousser encore plus l'automatisation avec du software.

La démocratisation des frameworks ainsi que la généralisation des opérateurs pour les applications que nous utilisons tous au quotidien dans nos clusters (prometheus, mysql, postgresql, cert-manager, traefik etc etc) fait se poser la question, et si je faisais moi aussi mes propres opérateurs ?

Chez Artifakt nous avons fait ce choix il y a maintenant plus d'un an. Après une dizaine d'opérateurs développé et déployé en production, il est temps de faire un bilan.

Nous vous invitons à partager ce bilan avec nous, nous vous expliquerons pourquoi nous avons choisis cette direction, qu'est ce que nous avons appris mais également les erreurs que nous avons commises. Nous vous donnerons des sujets concrets qui interviennent lors du développements des opérateurs Kubernetes. Comment les testers ? Comment les déployer ? Qu'est ce qu'une boucle de réconciliation ? et plein d'autre sujets que vous nous trouverez pas dans des articles.

Etienne Coutaud

April 22, 2022
Tweet

More Decks by Etienne Coutaud

Other Decks in Programming

Transcript

  1. #DevoxxFR Qu’avons nous appris après 1 an passé à développer

    des opérateurs Kubernetes Etienne Coutaud @etiennecoutaud 1
  2. #DevoxxFR un PaaS multicloud Console Frontend Backend Platform AWS GCP

    Azure • Introduction d’une couche d’abstraction (platform) • Homogénéiser et standardiser les ressources clouds et leurs cycle de vie • Offrir un point d’entrée unique pour piloter les clouds provider (API) • Rendre cette couche portable, modulaire évolutive et cloud agnostique
  3. #DevoxxFR Zoom sur la plateforme (1/2) Kubernetes API CRD CRD

    CRD CRD controller controller controller controller controller controller controller controller CRD
  4. #DevoxxFR Zoom sur la plateforme (2/2) service.artifakt.io infrastructure.artifakt.io catalog.artifakt.io auth.artifakt.io

    apps.artifakt.io Cache Database MessagingQuueue ElasticSearch Registry Environment DNSREcord DNSProvider Network KubernetesCluster LoadBalancer NodeGroup GitRepository CloudAccount ApplicationBundle CacheBundle DatabaseBundle MessagingQueueBundle ElasticSearchBundle NodeGroupBundle Application
  5. #DevoxxFR Qu’est ce qu’un controller Kubernetes ? • controller =>

    opère sur des ressources builtin • operator => opère sur des ressources custom
  6. #DevoxxFR Prendre le temps de définir sa CRD avec le

    métier La CRD (Custom Resource Definition) est le contrat d’interface entre les utilisateurs et le controller La ressource CRD contient entre autre: • le versionning de la ressource • sa structure • le typage de chaque champ • un premier niveau de contrôle ◦ typage ◦ champ obligatoire ◦ enumeration ◦ regex • Le endpoint de conversion https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource- definitions/
  7. #DevoxxFR Utilisez un framework pour construire votre controller ! •

    Simplifie l’intégration avec Kubernetes et la mécanique d’indexation et de queue. • Contient plein de fonction utils • Génère du code • Génère la CRD depuis la structure de donnée du code • Génère les manifests de déploiement Le framework permet de se focaliser uniquement sur ce qui a de la valeur dans le controller : la boucle de reconciliation
  8. #DevoxxFR Sinon … Toute cette partie doit être géré à

    la main dans l’opérateur en amont de la réconciliation
  9. #DevoxxFR Les frameworks à votre disposition • Charmed Operator Framework

    • Kopf (Kubernetes Operator Pythonic Framework) • kubebuilder • KubeOps (.NET operator SDK) • KUDO (Kubernetes Universal Declarative Operator) • Metacontroller along with WebHooks that you implement yourself • Operator Framework • shell-operator
  10. #DevoxxFR MutatingWebhook • Fonctionnement similaire au ValidatingWebhook • Permet de

    faire muter un objet à la volée, transformation des specs • Exemple : istio utilise la mutation pour injecter les sidecars • Ne jamais modifer les specs d’un objet dans la reconcilation pour eviter des tour de boucle inutiles
  11. #DevoxxFR Conditions et cycle de vie des objets admission controller

    ETCD predicates obj = getObject(key) obj.isUnderDeletion() obj.deleteFunc() obj.RemoveFinalizer() yes obj.addFinalizer() No reconcile action [...] obj.SetStatus() client.Update(obj)
  12. #DevoxxFR Faire évoluer les CRDs et assurer la compatibilité Un

    controller n’opère de réconciliation que dans la dernière version il n’y pas de réconciliation distincte en fonction de la version
  13. #DevoxxFR Organisation globale du code chez Artifakt • lib externe

    “core” qui centralise du code commun à l’ensemble des opérateurs ◦ les types d’objet API (structure go) ◦ des fonctions utils ◦ des bouts de réconciliation commun à nos controllers ◦ Evite les dépendances cycliques • un seul controller peut manipuler plusieurs type de CRD ◦ une boucle de réconciliation = 1 seul type d’objet mais des get sont possibles ◦ un controller peut supporter plusieurs boucle de réconciliations si cela fait sens ▪ exemple notre controller network reconcilie les LBs, les DNSReccord et le Network • CICD automatique via ArgoCD • Les libs Kubernetes avancent plus vite que nous ! • Reflexion autour d’une migration vers un monorepos central générant plusieurs binaires comme ke repos Kubernetes
  14. #DevoxxFR Conclusion • Ecrire/Maintenir/Deployer un controller va plus loin qu’un

    simple script, c’est une brique de software • Go est plus adapté car adopté massivement par la communauté et l’intégration est native mais d’autres langages sont possibles • Utilisez un framework • Réflechissez à la structure de votre CRD avec le métier, c’est une interface entre le controller et son utilisateur • Cette CRD sera amené à évoluer • L’algorithme de réconciliation est le coeur de votre controller • Testez votre code, tout est disponible pour mocker ou simuler localement un cluster Kubernetes • Ouvrez les controllers disponibles sur Github !