Nos conclusions sur un an de migration de GitLab.com vers Kubernetes

Note de traduction.: l'adaptation de Kubernetes dans GitLab est considérée comme l'un des deux principaux facteurs contribuant à la croissance de l'entreprise. Cependant, jusqu'à récemment, l'infrastructure du service en ligne GitLab.com était construite sur des machines virtuelles, et seulement il y a environ un an a commencé sa migration vers K8s, qui n'est toujours pas terminée. Nous sommes heureux de présenter la traduction d'un récent article d'un ingénieur SRE de GitLab sur la maniÚre dont cela se déroule et les conclusions tirées par les ingénieurs participant au projet.

Nos conclusions sur un an de migration de GitLab.com vers Kubernetes

Depuis prÚs d'un an, notre département infrastructure travaille à la migration de tous les services fonctionnant sur GitLab.com vers Kubernetes. Pendant ce temps, nous avons rencontré des problÚmes liés non seulement au déplacement des services vers Kubernetes, mais aussi à la gestion du déploiement hybride pendant la transition. Cet article traitera des leçons précieuses que nous avons apprises.

Depuis le dĂ©but, GitLab.com a fonctionnĂ© sur le cloud avec des machines virtuelles. Ces machines virtuelles sont gĂ©rĂ©es par Chef, et leur installation se fait via notre paquet Linux officiel. StratĂ©gie de dĂ©ploiement au cas oĂč il serait nĂ©cessaire de mettre Ă  jour l'application, consiste Ă  mettre Ă  jour le parc de serveurs de maniĂšre coordonnĂ©e et sĂ©quentielle Ă  l'aide d'un pipeline CI. Cette mĂ©thode - bien qu'elle soit lente et un peu ennuyeuse - garantit que GitLab.com applique les mĂȘmes mĂ©thodes d'installation et de configuration que les utilisateurs des installations (autonomes) de GitLab, qui utilisent nos paquets Linux.

Nous utilisons cette méthode car il est d'une importance cruciale de ressentir toutes les joies et les peines que rencontrent les membres de la communauté lorsqu'ils installent et configurent leurs propres copies de GitLab. Cette approche a bien fonctionné pendant un certain temps, mais lorsque le nombre de projets sur GitLab a dépassé les 10 millions, nous avons réalisé qu'elle ne répondait plus à nos besoins en matiÚre de mise à l'échelle et de déploiement.

Premiers pas vers Kubernetes et GitLab cloud-native

En 2017, le projet a Ă©tĂ© créé GitLab Charts pour prĂ©parer GitLab Ă  ĂȘtre dĂ©ployĂ© dans le cloud, ainsi que pour donner aux utilisateurs la possibilitĂ© d'installer GitLab dans des clusters Kubernetes. À l'Ă©poque, nous savions que le transfert de GitLab vers Kubernetes augmenterait la capacitĂ© de mise Ă  l'Ă©chelle de la plateforme SaaS, simplifierait les dĂ©ploiements et amĂ©liorerait l'efficacitĂ© de l'utilisation des ressources informatiques. En mĂȘme temps, de nombreuses fonctions de notre application dĂ©pendaient de sections NFS montĂ©es, ce qui ralentissait la transition depuis des machines virtuelles.

L'aspiration à une approche cloud native et à Kubernetes a permis à nos ingénieurs de planifier une transition progressive, au cours de laquelle nous avons abandonné certaines dépendances de l'application vis-à-vis des stockages en réseau, tout en continuant à développer de nouvelles fonctionnalités. Depuis que nous avons commencé à planifier la migration à l'été 2019, de nombreuses restrictions ont été levées, et le processus de transfert de GitLab.com vers Kubernetes est maintenant en cours !

Caractéristiques de GitLab.com dans Kubernetes

Pour GitLab.com, nous utilisons un cluster GKE rĂ©gional unique qui gĂšre tout le trafic de l'application. Pour minimiser la complexitĂ© dĂ©jĂ  assez complexe de la migration, nous nous concentrons sur les services qui ne dĂ©pendent pas de stockages locaux ou de NFS. GitLab.com utilise principalement une base de code monolithique sur Rails, et nous orientons le trafic en fonction des caractĂ©ristiques de la charge de travail vers diffĂ©rents points de terminaison, isolĂ©s dans leurs propres pools de nƓuds.

Dans le cas du front-end, ces types se divisent en requĂȘtes web, API, Git SSH/HTTPS et Registry. Pour le back-end, nous dĂ©coupons les travaux dans les files d'attente selon diverses caractĂ©ristiques en fonction de limites de ressources prĂ©dĂ©finies, ce qui nous permet d'Ă©tablir des objectifs de niveau de service (Service-Level Objectives, SLOs) pour diffĂ©rentes charges.

Tous ces services GitLab.com sont configurĂ©s Ă  l'aide du Helm chart GitLab non modifiĂ©. La configuration se fait dans des sous-charts qui peuvent ĂȘtre activĂ©s sĂ©lectivement au fur et Ă  mesure que nous transfĂ©rons progressivement des services dans le cluster. MĂȘme si nous avons dĂ©cidĂ© de ne pas inclure dans la migration certains de nos services Ă©tat, tels que Redis, Postgres, GitLab Pages et Gitaly, l'utilisation de Kubernetes permet de rĂ©duire radicalement le nombre de VM actuellement gĂ©rĂ©es par Chef.

Transparence et gestion des configurations Kubernetes

Tous les paramĂštres sont gĂ©rĂ©s par GitLab lui-mĂȘme. Pour cela, trois projets de configuration basĂ©s sur Terraform et Helm sont utilisĂ©s. Nous essayons d'utiliser GitLab pour dĂ©ployer GitLab autant que possible, mais pour les tĂąches opĂ©rationnelles, nous avons une installation sĂ©parĂ©e de GitLab. Cela est nĂ©cessaire pour ne pas dĂ©pendre de la disponibilitĂ© de GitLab.com lors des dĂ©ploiements et mises Ă  jour de GitLab.com.

Bien que nos pipelines pour le cluster Kubernetes fonctionnent sur une installation séparée de GitLab, les dépÎts de code ont des miroirs, accessibles publiquement aux adresses suivantes :

  • k8s-workloads/gitlab-com — enveloppe de configuration GitLab.com pour le Helm chart de GitLab ;
  • k8s-workloads/gitlab-helmfiles — contient des configurations pour des services qui ne sont pas liĂ©s directement Ă  l'application GitLab. Cela inclut des configurations pour la gestion des logs et la surveillance du cluster, ainsi que pour des outils intĂ©grĂ©s comme PlantUML ;
  • Gitlab-com-infrastructure — configuration Terraform pour Kubernetes et l'ancienne infrastructure VM (legacy). Ici, toutes les ressources nĂ©cessaires au dĂ©ploiement du cluster sont configurĂ©es, y compris le cluster lui-mĂȘme, les pools de nƓuds, les comptes de service, et la rĂ©servation d'adresses IP.

Nos conclusions sur un an de migration de GitLab.com vers Kubernetes
Lors de modifications, un résumé public est affiché avec un lien vers un diff détaillé, que l'équipe SRE analyse avant d'apporter des modifications au cluster. Pour les SRE, le lien mÚne à un diff détaillé dans l'installation de GitLab, qui est utilisée pour les opérations et à laquelle l'accÚs est restreint. Cela permet aux employés et à la communauté sans accÚs au projet opérationnel (qui n'est ouvert qu'aux SRE) de consulter les modifications proposées dans la configuration. En combinant une instance publique de GitLab pour le code avec une instance fermée pour les pipelines CI, nous préservons un flux de travail unique tout en garantissant une indépendance par rapport à GitLab.com lors des mises à jour de configuration.

Ce que nous avons appris pendant la migration

Au cours de la migration, de l'expérience a été acquise, que nous appliquons aux nouvelles migrations et déploiements dans Kubernetes.

1. Augmentation des coûts en raison du trafic entre les zones de disponibilité

Statistiques quotidiennes de l'egress (octets par jour) pour la flotte de dépÎts Git sur GitLab.com

Nos conclusions sur un an de migration de GitLab.com vers Kubernetes
Statistiques quotidiennes d'egress (octets par jour) pour le parc de dépÎts Git sur GitLab.com

Google divise son rĂ©seau en rĂ©gions. Celles-ci sont ensuite subdivisĂ©es en zones de disponibilitĂ© (AZ). L'hĂ©bergement Git est associĂ© Ă  de grands volumes de donnĂ©es, il est donc crucial de maĂźtriser l'egress rĂ©seau. En ce qui concerne le trafic interne, l'egress est gratuit uniquement s'il reste Ă  l'intĂ©rieur d'une mĂȘme zone de disponibilitĂ©. Au moment de la rĂ©daction de cet article, nous transfĂ©rons environ 100 To de donnĂ©es en journĂ©e normale (et cela ne concerne que les dĂ©pĂŽts Git). Les services qui, dans notre ancienne topologie basĂ©e sur des VM, Ă©taient sur les mĂȘmes machines virtuelles, fonctionnent dĂ©sormais dans diffĂ©rents pods Kubernetes. Cela signifie qu'une partie du trafic, qui auparavant Ă©tait locale aux VM, peut potentiellement sortir des zones de disponibilitĂ©.

Les clusters régionaux GKE permettent de couvrir plusieurs zones de disponibilité pour la redondance. Nous envisageons la possibilité de diviser le cluster régional GKE en clusters zonés uniques pour les services générant de gros volumes de trafic. Cela permettra de réduire les coûts d'egress tout en maintenant la redondance au niveau du cluster.

2. Limites, requĂȘtes de ressources et mise Ă  l'Ă©chelle

Nos conclusions sur un an de migration de GitLab.com vers Kubernetes
Nombre de répliques traitant le trafic de production sur registry.gitlab.com. Le trafic atteint son pic vers ~15h00 UTC.

Notre histoire de migration a commencĂ© en aoĂ»t 2019, lorsque nous avons dĂ©placĂ© notre premier service — le registre de conteneurs GitLab (GitLab Container Registry) — vers Kubernetes. Ce service critique, soumis Ă  un trafic Ă©levĂ©, Ă©tait bien adaptĂ© pour cette premiĂšre migration, car il s'agit d'une application sans Ă©tat avec peu de dĂ©pendances externes. Le premier problĂšme auquel nous avons Ă©tĂ© confrontĂ©s a Ă©tĂ© le grand nombre de pods expulsĂ©s en raison d'un manque de mĂ©moire sur les nƓuds. Cela nous a contraints Ă  modifier les requĂȘtes et les limites.

Il a Ă©tĂ© dĂ©couvert que, pour une application dont la consommation de mĂ©moire augmente avec le temps, des valeurs faibles pour les requĂȘtes (rĂ©servant de la mĂ©moire pour chaque pod) combinĂ©es Ă  une limite « gĂ©nĂ©reuse » sur l'utilisation entraĂźnaient une saturation (saturation) des nƓuds et un taux Ă©levĂ© d'expulsions. Pour remĂ©dier Ă  ce problĂšme, il a Ă©tĂ© dĂ©cidĂ© d'augmenter les requĂȘtes et de rĂ©duire les limites.. Cela a rĂ©duit la pression sur les nƓuds et a assurĂ© un cycle de vie des pods qui n'exerçait pas une pression trop Ă©levĂ©e sur le nƓud. Nous commençons maintenant les migrations avec des valeurs de demandes et de limites gĂ©nĂ©reuses (et presque identiques), que nous ajustons si nĂ©cessaire.

3. Métriques et journaux

Nos conclusions sur un an de migration de GitLab.com vers Kubernetes
Le département des infrastructures se concentre sur les latences, le taux d'erreurs et la saturation par rapport aux objectifs de niveau de service (SLO), liés à la disponibilité générale de notre systÚme..

Au cours de l'annĂ©e Ă©coulĂ©e, l'un des Ă©vĂ©nements clĂ©s dans le dĂ©partement des infrastructures a Ă©tĂ© des amĂ©liorations dans le suivi et la gestion des SLO. Les SLO nous ont permis de dĂ©finir des objectifs pour des services spĂ©cifiques, que nous avons surveillĂ©s de prĂšs pendant la migration. Mais mĂȘme avec une visibilitĂ© amĂ©liorĂ©e, il n'est pas toujours possible de voir immĂ©diatement les problĂšmes en utilisant les mĂ©triques et les alertes. Par exemple, en nous concentrant sur les latences et le taux d'erreurs, nous ne couvrons pas complĂštement tous les scĂ©narios d'utilisation du service en migration.

Ce problĂšme a Ă©tĂ© dĂ©tectĂ© presque immĂ©diatement aprĂšs le transfert d'une partie des charges de travail vers le cluster. Il s'est particuliĂšrement manifestĂ© lors de la vĂ©rification de fonctionnalitĂ©s dont le nombre de requĂȘtes est faible, mais qui ont des dĂ©pendances de configuration trĂšs spĂ©cifiques. L'une des leçons clĂ©s tirĂ©es de la migration a Ă©tĂ© la nĂ©cessitĂ© de prendre en compte non seulement les mĂ©triques lors de la surveillance, mais Ă©galement les journaux et le « long tail » (il s'agit de ce type de rĂ©partition sur le graphique - note du trad.) d'erreurs. Maintenant, pour chaque migration, nous incluons une liste dĂ©taillĂ©e des requĂȘtes aux journaux (log queries) et prĂ©voyons des procĂ©dures de rollback claires, pouvant ĂȘtre transmises d'une Ă©quipe Ă  l'autre en cas de problĂšmes.

Le service parallĂšle des mĂȘmes requĂȘtes sur l'ancienne infrastructure VM et la nouvelle, basĂ©e sur Kubernetes, reprĂ©sentait un dĂ©fi unique. Contrairement Ă  la migration de type lift-and-shift (transfert rapide d'applications « telles quelles » vers la nouvelle infrastructure ; pour en savoir plus, par exemple, ici — n.d.t.), le travail parallĂšle sur les « anciennes » VM et Kubernetes nĂ©cessite que les outils de surveillance soient compatibles avec les deux environnements et puissent agrĂ©ger les mĂ©triques en une seule vue. Il est important que nous utilisions les mĂȘmes tableaux de bord et les mĂȘmes requĂȘtes de journaux afin d'obtenir une observabilitĂ© cohĂ©rente pendant la pĂ©riode de transition.

4. Changement de trafic vers le nouveau cluster

Pour GitLab.com, une partie des serveurs est dĂ©diĂ©e Ă  l'Ă©tape canari. Le parc canari sert nos projets internes, mais peut Ă©galement ĂȘtre activĂ© par les utilisateurs. Mais il est avant tout destinĂ© Ă  tester les modifications apportĂ©es Ă  l'infrastructure et Ă  l'application. Le premier service migrĂ© a commencĂ© par recevoir un volume limitĂ© de trafic interne, et nous continuons d'utiliser cette mĂ©thode pour assurer le respect des SLO avant de diriger tout le trafic vers le cluster.

Dans le cas de la migration, cela signifie que les requĂȘtes pour les projets internes sont d'abord dirigĂ©es vers Kubernetes, puis nous transfĂ©rons progressivement le reste du trafic vers le cluster en ajustant le poids pour le backend via HAProxy. Au cours de la transition des VM vers Kubernetes, il est devenu Ă©vident qu'il est trĂšs avantageux d'avoir une mĂ©thode simple pour rediriger le trafic entre l'ancienne et la nouvelle infrastructure et, par consĂ©quent, de garder l'ancienne infrastructure prĂȘte Ă  ĂȘtre rĂ©activĂ©e dans les premiers jours aprĂšs la migration.

5. Capacités de secours des pods et leur utilisation

Presque immédiatement, le problÚme suivant a été identifié : les pods pour le service Registry démaraient rapidement, mais le démarrage des pods pour Sidekiq prenait jusqu'à deux minutes. Le démarrage prolongé des pods pour Sidekiq est devenu un problÚme lorsque nous avons commencé la migration des charges de travail vers Kubernetes pour les workers qui doivent traiter rapidement les jobs et se mettre à l'échelle rapidement.

Dans ce cas, la leçon Ă©tait que, bien que le Horizontal Pod Autoscaler (HPA) dans Kubernetes gĂšre bien l'augmentation du trafic, il est important de prendre en compte les caractĂ©ristiques des charges de travail et de prĂ©voir des capacitĂ©s de secours pour les pods (surtout en cas de demande inĂ©gale). Dans notre cas, nous avons observĂ© une brusque augmentation des jobs, entraĂźnant une mise Ă  l'Ă©chelle rapide, ce qui a conduit Ă  saturer les ressources CPU avant que nous puissions redimensionner le pool de nƓuds.

Il y a toujours la tentation de maximiser l'utilisation du cluster, mais aprÚs avoir rencontré des problÚmes de performance, nous commençons avec un budget pod généreux et le réduisons ensuite, surveillant de prÚs le SLO. Le lancement des pods pour le service Sidekiq s'est considérablement accéléré et prend désormais en moyenne environ 40 secondes. De la réduction du temps de lancement des pods en ont bénéficié tant GitLab.com que nos utilisateurs des installations self-managed utilisant le chart Helm officiel de GitLab.

Conclusion

AprĂšs avoir migrĂ© chaque service, nous avons apprĂ©ciĂ© les avantages de l'utilisation de Kubernetes en production : un dĂ©ploiement d'application plus rapide et plus sĂ»r, une scalabilitĂ© accrue et une rĂ©partition des ressources plus efficace. Les avantages de la migration vont mĂȘme au-delĂ  du service GitLab.com. Chaque amĂ©lioration du chart Helm officiel en bĂ©nĂ©ficie Ă©galement Ă  ses utilisateurs.

J'espÚre que vous avez aimé l'histoire de nos aventures dans la migration vers Kubernetes. Nous continuons à transférer de nouveaux services dans le cluster. Vous pouvez trouver plus d'informations dans les publications suivantes :

P.S. de l'auteur

Lisez aussi dans notre blog :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster