Qu'est-ce qui est considéré comme une bonne pratique avec K8S pour gérer plusieurs environnements (QA, Staging, Production, Dev, etc.)?
Par exemple, supposons qu'une équipe travaille sur un produit nécessitant le déploiement de quelques API, ainsi que d'une application frontale. Généralement, cela nécessite au moins 2 environnements:
En supposant que l’équipe utilise Kubernetes, quelle serait la bonne pratique pour héberger ces environnements? Jusqu'ici, nous avons envisagé deux options:
(1) Il semble que les options les plus sûres, car elles minimisent les risques d’erreurs humaines et de défaillances de la machine susceptibles de mettre en danger l’environnement de production. Toutefois, cela entraîne des coûts supplémentaires en termes de nombre de machines maîtres et de gestion de l’infrastructure.
(2) On dirait que cela simplifie la gestion de l'infrastructure et du déploiement, car il n'y a qu'un seul cluster, mais soulève quelques questions, telles que:
Il y a peut-être d'autres préoccupations, aussi je contacte la communauté K8 sur StackOverflow pour mieux comprendre comment les gens gèrent ce type de défis.
Utilisez sans aucun doute un cluster distinct pour le développement et la création d’images de menu fixe afin que vos clusters de transfert/production puissent être verrouillés pour des raisons de sécurité. Si vous utilisez des grappes distinctes pour staging + production
est à vous de décider en fonction du risque/coût - les garder séparés vous aidera certainement à éviter staging
d'affecter production
.
Je vous recommande également fortement d'utiliser GitOps pour promouvoir les versions de vos applications entre vos environnements.
Pour minimiser les erreurs humaines, je vous recommande également de rechercher autant que possible l'automatisation de votre CI/CD et de votre promotion.
Voici ne démonstration de l'automatisation de CI/CD avec plusieurs environnements sur Kubernetes à l'aide de GitOps pour la promotion entre les environnements et les environnements de prévisualisation sur les demandes d'extraction, effectuée en direct sur GKE bien que Jenkins X prenne en charge la plupart des clusters de Kubernetes.
Cela dépend de ce que vous voulez tester dans chacun des scénarios. En général, j'essaie d'éviter d'exécuter des scénarios de test sur le cluster de production afin d'éviter des effets secondaires inutiles (impact sur les performances, etc.).
Si votre intention est de tester avec un système de transfert qui imite exactement le système de production, je vous recommanderais d'activer une réplique exacte du cluster complet et de l'éteindre une fois que vous avez terminé les tests et que les déploiements passent en production. .
Si votre objectif est de tester un système de transfert qui permet tester l'application de déployer, j'exécuterais en permanence un cluster de transfert intermédiaire plus petit et mettrais à jour les déploiements (avec également une version réduite des déploiements) comme requis pour les tests continus .
Pour contrôler les différents clusters, je préfère avoir une machine ci/cd distincte qui ne fait pas partie du cluster mais qui est utilisée pour allumer et éteindre des clusters, ainsi que pour effectuer un travail de déploiement, lancer des tests, etc. Cela permet de configurer et d'arrêter les clusters. grappes dans le cadre de scénarios de tests automatisés.
Jetez un coup d'œil à ce billet de blog: liste de contrôle: avantages et inconvénients de l'utilisation de plusieurs clusters Kubernetes et de la répartition des charges de travail entre eux .
Je voudrais souligner certains des avantages/inconvénients:
Raisons d'avoir plusieurs grappes
- Séparation production/développement/test: spécialement pour tester une nouvelle version de Kubernetes, un maillage de service, d’un autre logiciel de cluster
- Conformité: selon certaines réglementations, certaines applications doivent être exécutées dans des clusters/VPN distincts
- Meilleure isolation pour la sécurité
- Cloud/sur site: pour répartir la charge entre des services sur site
Raisons d'avoir un seul cluster
- Réduire les coûts d'installation, de maintenance et d'administration
- Améliorer l'utilisation
- Réduction des coûts
Considérant un environnement pas trop coûteux, avec une maintenance moyenne, tout en assurant toujours l'isolation de sécurité pour les applications de production, je recommanderais:
C'est un bonne pratique pour garder le développement, la mise en scène et la production aussi similaires que possible:
Les différences entre les services de support signifient que de minuscules incompatibilités apparaissent, faisant échouer le code qui a fonctionné et qui a réussi les tests de développement ou de mise en scène. Ces types d'erreur créent des frictions qui découragent le déploiement continu.
Combinez un puissant outil CI/CD avec barre. Vous pouvez utiliser la flexibilité de valeurs de barre pour définir les configurations par défaut, en remplaçant simplement les configurations qui diffèrent d’un environnement à l’autre.
GitLab CI/CD avec AutoDevops possède une intégration puissante avec Kubernetes, ce qui vous permet de gérer plusieurs clusters Kubernetes déjà avec un support helm.
kubectl
interactions)Lorsque vous travaillez avec plusieurs clusters Kubernetes, il est facile de déconner avec les contextes et d’exécuter
kubectl
dans le mauvais cluster. Au-delà de cela, Kubernetes a restrictions pour incompatibilité de version entre le client (kubectl
) et le serveur (maître kubernetes). Par conséquent, exécuter des commandes dans le bon contexte ne signifie pas exécuter la bonne version du client.
Pour surmonter ceci:
asdf
pour gérer plusieurs versions de kubectl
KUBECONFIG
env var pour changer entre plusieurs fichiers kubeconfig
kube-ps1
pour suivre votre contexte/espace de noms actuelkubectx
et kubens
pour changer rapidement de clusters/espaces de nomsJetez un oeil à cet article, il explique comment faire cela: tilisation de différentes versions de kubectl avec plusieurs clusters Kubernetes
Je recommande également cette lecture: Maîtriser le fichier KUBECONFIG
Il est clair qu'en gardant le cluster de production à l'écart du groupe de stockage intermédiaire, le risque d'erreur potentielle ayant une incidence sur les services de production est réduit. Cependant, cela implique un coût supplémentaire en termes de gestion d’infrastructure/configuration, car cela nécessite au minimum:
N'oublions pas non plus qu'il pourrait y avoir plus d'un environnement. Par exemple, j'ai travaillé dans des entreprises où il existe au moins 3 environnements:
Je pense que les clusters éphémères/à la demande ont du sens, mais seulement dans certains cas d'utilisation (test de charge/performance ou de très "grands" tests d'intégration/de bout en bout), mais pour les environnements plus persistants/collants, je vois un temps système qui pourrait être réduit. en les exécutant dans un seul cluster.
Je suppose que je voulais contacter la communauté k8s pour voir quels modèles sont utilisés pour de tels scénarios tels que ceux que j'ai décrits.
Sauf indication contraire de la conformité ou d'autres exigences, je privilégie un cluster unique pour tous les environnements. Avec cette approche, les points d’attention sont:
Assurez-vous également de regrouper les nœuds par environnement à l'aide d'étiquettes. Vous pouvez ensuite utiliser nodeSelector
sur des ressources pour vous assurer qu'elles fonctionnent sur des nœuds spécifiques. Cela réduira les risques de dépassement de la consommation de ressources (en excès) entre les environnements.
Traitez vos espaces de noms comme des sous-réseaux et interdisez tout trafic de sortie/entrée par défaut. Voir https://kubernetes.io/docs/concepts/services-networking/network-policies/ .
Ayez une stratégie pour gérer les comptes de service. ClusterRoleBindings
implique quelque chose de différent si un cluster héberge plus d'un environnement.
Faites preuve de vigilance lorsque vous utilisez des outils tels que Helm. Certains graphiques installent de manière flagrante des comptes de service avec des autorisations pour l'ensemble du cluster, mais les autorisations d'accès aux comptes de service doivent être limitées à l'environnement dans lequel elles se trouvent.
Je pense que l’exploitation d’un seul cluster a du sens car elle réduit les frais généraux, ainsi que la surveillance. Cependant, vous devez vous assurer de placer les stratégies de réseau, le contrôle d'accès en place.
Stratégie réseau: interdire à la charge de travail de l'environnement dev/qa d'interagir avec les magasins prod/staging.
Contrôle d'accès - qui ont accès à différentes ressources d'environnement à l'aide de ClusterRoles, Roles, etc.