Fermeture de trous dans un cluster Kubernetes. Rapport et transcription avec DevOpsConf

Pavel Selivanov, Southbridge Solution Architect et Slurm Lecturer, a fait une présentation à DevOpsConf 2019. Ce rapport fait partie du cours approfondi de Kubernetes Slur Mega.


Slurm Basic: une introduction Ă  Kubernetes a lieu Ă  Moscou du 18 au 20 novembre.
Slurm Mega: Nous regardons sous le capot de Kubernetes - Moscou, 22-24 novembre.
Slurm Online: les deux cours Kubernetes sont toujours disponibles.



Sous la coupe - transcription du rapport.


Bonjour, collÚgues et sympathisants. Aujourd'hui, je vais parler de sécurité.


Je vois qu'il y a beaucoup de gardes de sécurité dans le hall aujourd'hui. Je m'excuse à l'avance si je n'utilise pas les termes du monde de la sécurité de la maniÚre que vous avez acceptée.


Il se trouve qu'il y a environ six mois, je suis tombĂ© entre les mains d'un groupe public de Kubernetes. Public - signifie qu'il existe un niĂšme nombre d'espaces de noms, dans ces espaces de noms, il y a des utilisateurs isolĂ©s dans leur espace de noms. Tous ces utilisateurs appartiennent Ă  diffĂ©rentes sociĂ©tĂ©s. Eh bien, il Ă©tait supposĂ© que ce cluster devait ĂȘtre utilisĂ© comme CDN. Autrement dit, ils vous donnent un cluster, ils donnent l'utilisateur lĂ -bas, vous allez lĂ -bas dans votre espace de noms, dĂ©ployez vos fronts.


Ils ont essayé de vendre un tel service à ma précédente entreprise. Et on m'a demandé de pousser un cluster sur le sujet - cette solution est-elle appropriée ou non?


Je suis venu dans ce cluster. On m'a donnĂ© des droits limitĂ©s, un espace de noms limitĂ©. LĂ , les gars ont compris ce qu'Ă©tait la sĂ©curitĂ©. Ils ont lu ce que Kubernetes avait le contrĂŽle d'accĂšs basĂ© sur les rĂŽles (RBAC) - et ils l'ont tordu pour que je ne puisse pas exĂ©cuter les pods sĂ©parĂ©ment du dĂ©ploiement. Je ne me souviens pas de la tĂąche que j'essayais de rĂ©soudre en exĂ©cutant sous sans dĂ©ploiement, mais je voulais vraiment exĂ©cuter juste en dessous. J’ai dĂ©cidĂ© pour la bonne chance de voir quels droits j’ai dans le cluster, ce que je peux, ce que je ne peux pas, ce qu’ils ont ratĂ©. Dans le mĂȘme temps, je vais vous dire ce qu'ils ont configurĂ© de maniĂšre incorrecte dans le RBAC.


Il se trouve que deux minutes plus tard, j'ai trouvĂ© un administrateur dans leur cluster, j'ai regardĂ© tous les espaces de noms voisins, j'ai vu les fronts de production des entreprises qui avaient dĂ©jĂ  achetĂ© le service et je suis restĂ© bloquĂ©. Je me suis Ă  peine arrĂȘtĂ©, pour ne pas venir voir quelqu'un en avant et ne mettre aucun mot obscĂšne sur la page principale.


Je vais vous dire avec des exemples comment j'ai fait cela et comment m'en protéger.


Mais d'abord, je me présente. Je m'appelle Pavel Selivanov. Je suis architecte à Southbridge. Je comprends Kubernetes, DevOps et toutes sortes de choses fantaisistes. Les ingénieurs de Southbridge et moi construisons tout cela, et je vous conseille.


En plus de notre cƓur de mĂ©tier, nous avons rĂ©cemment lancĂ© des projets appelĂ©s Slory. Nous essayons d'apporter notre capacitĂ© Ă  travailler avec Kubernetes aux masses, Ă  enseigner aux autres comment travailler avec les K8 aussi.


De quoi je vais parler aujourd'hui. Le sujet du rapport est évident - sur la sécurité du cluster Kubernetes. Mais je veux dire tout de suite que ce sujet est trÚs vaste - et je veux donc préciser immédiatement ce que je ne dirai pas avec certitude. Je ne parlerai pas de termes farfelus qui sont déjà cent fois trop broyés sur Internet. Tout RBAC et certificats.


Je vais parler de la façon dont mes collĂšgues et moi en avons marre de la sĂ©curitĂ© dans le cluster Kubernetes. Nous voyons ces problĂšmes Ă  la fois avec les fournisseurs qui fournissent des clusters Kubernetes et avec les clients qui viennent chez nous. Et mĂȘme avec des clients qui nous viennent d'autres sociĂ©tĂ©s de conseil en administration. Autrement dit, l'ampleur de la tragĂ©die est trĂšs grande en fait.


Littéralement trois points, dont je parlerai aujourd'hui:


  1. Droits utilisateur vs droits pod. Les droits d'utilisateur et les droits de foyer ne sont pas la mĂȘme chose.
  2. Collecte d'informations sur les clusters. Je montrerai qu'à partir du cluster, vous pouvez collecter toutes les informations dont vous avez besoin sans avoir de droits spéciaux sur ce cluster.
  3. Attaque DoS sur le cluster. Si nous ne pouvons pas collecter d'informations, nous pouvons dans tous les cas mettre le cluster. Je vais parler des attaques DoS sur les contrĂŽles de cluster.

Une autre chose courante que je mentionnerai est l'endroit oĂč j'ai tout testĂ©, ce que je peux dire avec certitude que tout fonctionne.


Comme base, nous prenons l'installation d'un cluster Kubernetes Ă  l'aide de Kubespray. Si quelqu'un ne le sait pas, il s'agit en fait d'un ensemble de rĂŽles pour Ansible. Nous l'utilisons constamment dans notre travail. La bonne chose est que vous pouvez rouler n'importe oĂč - vous pouvez rouler sur les glandes et quelque part dans le nuage. Une mĂ©thode d'installation convient en principe Ă  tout.


Dans ce cluster, j'aurai Kubernetes v1.14.5. L'ensemble du cluster de Cuba, que nous examinerons, est divisé en espaces de noms, chaque espace de noms appartient à une équipe distincte, les membres de cette équipe ont accÚs à chaque espace de noms. Ils ne peuvent pas accéder à des espaces de noms différents, mais uniquement aux leurs. Mais il existe un compte administrateur qui a des droits sur l'ensemble du cluster.



J'ai promis que la premiÚre chose que nous aurons serait d'obtenir des droits d'administrateur sur le cluster. Nous avons besoin d'un pod spécialement préparé qui cassera le cluster Kubernetes. Il nous suffit de l'appliquer au cluster Kubernetes.


kubectl apply -f pod.yaml 

Ce pod arrivera chez l'un des maĂźtres du cluster Kubernetes. Et aprĂšs cela, le cluster nous retournera avec plaisir un fichier appelĂ© admin.conf. À Cuba, tous les certificats d'administrateur sont stockĂ©s dans ce fichier, et en mĂȘme temps, l'API de cluster est configurĂ©e. C'est juste comment vous pouvez obtenir un accĂšs administrateur, je pense, Ă  98% des clusters Kubernetes.


Je répÚte, ce pod a été créé par un développeur de votre cluster qui a accÚs pour déployer ses propositions dans un petit espace de noms, il est tout serré par RBAC. Il n'avait aucun droit. Néanmoins, le certificat est revenu.


Et maintenant sur le foyer spécialement préparé. Exécutez sur n'importe quelle image. Par exemple, prenez debian: jessie.


Nous avons une telle chose:


 tolerations: - effect: NoSchedule operator: Exists nodeSelector: node-role.kubernetes.io/master: "" 

Qu'est-ce que la tolĂ©rance? Les maĂźtres du cluster Kubernetes sont gĂ©nĂ©ralement marquĂ©s d'une chose appelĂ©e taint ("infection" en anglais). Et l'essence de cette "infection" - elle dit que les pods ne peuvent pas ĂȘtre assignĂ©s aux nƓuds maĂźtres. Mais personne ne se soucie d'indiquer en aucune façon qu'il est tolĂ©rant Ă  "l'infection". La section TolĂ©rance dit simplement que si NoSchedule est sur un nƓud, alors notre sous-infection est tolĂ©rante - et aucun problĂšme.


De plus, nous disons que notre sous n'est pas seulement tolĂ©rant, mais veut aussi tomber spĂ©cifiquement sur le maĂźtre. Parce que les maĂźtres sont les plus dĂ©licieux dont nous avons besoin - tous les certificats. Par consĂ©quent, nous disons nodeSelector - et nous avons une Ă©tiquette standard sur les assistants, ce qui nous permet de sĂ©lectionner exactement les nƓuds qui sont des assistants de tous les nƓuds du cluster.


Avec ces deux sections, il viendra définitivement au maßtre. Et il sera autorisé à y vivre.


Mais venir au maßtre ne nous suffit pas. Cela ne nous donnera rien. Par conséquent, nous avons en outre ces deux choses:


 hostNetwork: true hostPID: true 

Nous indiquons que notre sous, que nous lançons, vivra dans l'espace de noms du noyau, dans l'espace de noms du rĂ©seau et dans l'espace de noms PID. DĂšs qu'il dĂ©marre sur l'assistant, il pourra voir toutes les interfaces rĂ©elles et en direct de ce nƓud, Ă©couter tout le trafic et voir le PID de tous les processus.


Ensuite, c'est petit. Prenez etcd et lisez ce que vous voulez.


La plus intéressante est cette fonctionnalité Kubernetes, qui y est présente par défaut.


 volumeMounts: - mountPath: /host name: host volumes: - hostPath: path: / type: Directory name: host 

Et son essence est que nous pouvons dire que nous voulons crĂ©er un volume de type hostPath dans le pod que nous exĂ©cutons, mĂȘme sans les droits sur ce cluster. Cela signifie prendre le chemin de l'hĂŽte sur lequel nous allons commencer - et le prendre comme volume. Et puis appelez-le nom: hĂŽte. Tout ce hostPath que nous montons Ă  l'intĂ©rieur du foyer. Dans cet exemple, dans le rĂ©pertoire / host.


Je répÚte encore une fois. Nous avons dit au pod de venir vers le maßtre, d'y obtenir hostNetwork et hostPID - et de monter la racine entiÚre du maßtre à l'intérieur de ce pod.


Vous comprenez que dans debian, nous avons bash en cours d'exécution, et ce bash fonctionne sous notre racine. Autrement dit, nous venons d'obtenir la racine du maßtre, sans avoir de droits sur le cluster Kubernetes.


De plus, toute la tùche consiste à aller dans le sous-répertoire / host / etc / kubernetes / pki, si je ne me trompe pas, récupérez tous les certificats maßtres du cluster là-bas et, en conséquence, devenez l'administrateur du cluster.


Si vous regardez de cette façon, ce sont certains des droits les plus dangereux dans les pods - malgré les droits de l'utilisateur:


Si j'ai des droits d'exĂ©cution dans un espace de noms de cluster, ce sous-marin a ces droits par dĂ©faut. Je peux exĂ©cuter des pods privilĂ©giĂ©s, et ce sont gĂ©nĂ©ralement tous les droits, pratiquement root sur le nƓud.


Mon prĂ©fĂ©rĂ© est l'utilisateur root. Et Kubernetes a une telle option Run As Non-Root. Il s'agit d'un type de protection contre les pirates. Savez-vous ce qu'est le «virus moldave»? Si vous ĂȘtes un pirate informatique et que vous venez sur mon cluster Kubernetes, alors nous, pauvres administrateurs, demandons: «Veuillez indiquer dans vos pods avec lesquels vous allez pirater mon cluster, exĂ©cutĂ© en tant que non root. Et il se trouve que vous dĂ©marrez le processus dans votre foyer sous la racine, et il vous sera trĂšs facile de me pirater. Veuillez vous protĂ©ger de vous-mĂȘme. »


Volume du chemin de l'hÎte - à mon avis, le moyen le plus rapide d'obtenir le résultat souhaité à partir du cluster Kubernetes.


Mais que faire de tout ça?


Réflexions qui devraient venir à tout administrateur normal qui rencontre Kubernetes: «Oui, je vous l'ai dit, Kubernetes ne fonctionne pas. Il y a des trous dedans. Et le cube entier est des conneries. " En fait, la documentation existe, et si vous y regardez, il y a une section Politique de sécurité des pods .


Il s'agit d'un tel objet yaml - nous pouvons le crĂ©er dans le cluster Kubernetes - qui contrĂŽle les aspects de sĂ©curitĂ© dans la description des foyers. Autrement dit, il contrĂŽle ces droits pour utiliser toutes sortes de hostNetwork, hostPID, certains types de volume, qui sont dans les pods au dĂ©marrage. Avec la politique de sĂ©curitĂ© des pods, tout cela peut ĂȘtre dĂ©crit.


La chose la plus intéressante dans la politique de sécurité des pods est que dans le cluster Kubernetes, tous les installateurs PSP ne sont tout simplement pas décrits en aucune façon, ils sont simplement désactivés par défaut. La politique de sécurité des pods est activée à l'aide du plug-in d'admission.


D'accord, finissons dans une politique de sécurité des pods de cluster, disons que nous avons une sorte de pods de service dans l'espace de noms, auxquels seuls les administrateurs ont accÚs. Disons que dans tous les autres pods, ils ont des droits limités. Parce que trÚs probablement, les développeurs n'ont pas besoin d'exécuter des modules privilégiés dans votre cluster.


Et tout semble aller bien avec nous. Et notre cluster Kubernetes ne peut pas ĂȘtre piratĂ© en deux minutes.


Il y a un problĂšme. TrĂšs probablement, si vous avez un cluster Kubernetes, la surveillance est installĂ©e dans votre cluster. Je prĂ©sume mĂȘme de prĂ©dire que s'il y a une surveillance dans votre cluster, alors cela s'appelle PromĂ©thĂ©e.


Ce que je vais vous dire maintenant sera valable Ă  la fois pour l'opĂ©rateur Prometheus et pour le Prometheus livrĂ© sous sa forme pure. La question est que si je ne parviens pas Ă  obtenir l’administrateur aussi rapidement dans le cluster, cela signifie que j’ai besoin de chercher plus. Et je peux rechercher en utilisant votre surveillance.


Probablement, tout le monde a lu les mĂȘmes articles sur HabrĂ©, et la surveillance est en surveillance. Le diagramme de barre est appelĂ© approximativement le mĂȘme pour tout le monde. Je suppose que si vous installez helm stable / prometheus, vous obtiendrez approximativement les mĂȘmes noms. Et mĂȘme trĂšs probablement, je n'aurai pas Ă  deviner le nom DNS de votre cluster. Parce que c'est standard.



En outre, nous avons un certain dev ns, il est possible de lancer un certain sous. Et plus loin de ce foyer, il est trÚs facile de faire comme ça:


 $ curl http://prometheus-kube-state-metrics.monitoring 

prometheus-kube-state-metrics est l'un des exportateurs prometheus qui collecte des métriques à partir de l'API Kubernetes. Il y a beaucoup de données qui s'exécutent dans votre cluster, ce que c'est, quels problÚmes vous avez avec.


Comme exemple simple:


kube_pod_container_info {namespace = "kube-system", pod = "kube-apiserver-k8s-1", container = "kube-apiserver", image =


"gcr.io/google-containers/kube-apiserver:v1.14.5"


, Image_id = "docker-pullable: //gcr.io/google-containers/kube- apiserver @ SHA256: e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a96 38ee634989", container_id = "docker: // 7cbe7b1fea33f811fdd8f7e0e079191110268f2 853397d7daf08e72c22d3cf8b"} 1


AprÚs avoir fait une simple demande de boucle à partir d'un fichier non privilégié, vous pouvez obtenir ces informations. Si vous ne savez pas dans quelle version de Kubernetes vous utilisez, il vous le dira facilement.


Et le plus intĂ©ressant est que, outre le fait que vous vous tourniez vers les mĂ©triques d'Ă©tat du kube, vous pouvez tout aussi bien appliquer directement Ă  PromĂ©thĂ©e lui-mĂȘme. Vous pouvez collecter des mĂ©triques Ă  partir de lĂ . Vous pouvez mĂȘme crĂ©er des mĂ©triques Ă  partir de lĂ . MĂȘme thĂ©oriquement, vous pouvez crĂ©er une telle demande Ă  partir d'un cluster dans Prometheus, ce qui la dĂ©sactive simplement. Et votre surveillance cesse gĂ©nĂ©ralement de fonctionner Ă  partir du cluster.


Et ici, la question se pose dĂ©jĂ  de savoir si une surveillance externe surveille votre surveillance. Je viens d'avoir l'opportunitĂ© d'agir dans le cluster Kubernetes sans aucune consĂ©quence pour moi. Vous ne saurez mĂȘme pas que j'agis lĂ -bas, car il n'y a plus de surveillance.


Tout comme avec PSP, le problĂšme est que toutes ces technologies Ă  la mode - Kubernetes, Prometheus - ne fonctionnent tout simplement pas et sont pleines de trous. Pas vraiment.


Il y a une telle chose - la politique de réseau .


Si vous ĂȘtes un administrateur normal, alors trĂšs probablement Ă  propos de la stratĂ©gie rĂ©seau, vous savez qu'il s'agit d'un autre yaml, qui dans le cluster est dĂ©jĂ  dofig. Et certaines politiques rĂ©seau ne sont absolument pas nĂ©cessaires. Et mĂȘme si vous lisez ce qu'est la stratĂ©gie rĂ©seau, qu'est-ce que le pare-feu Kubernetes yaml, il vous permet de restreindre les droits d'accĂšs entre les espaces de noms, entre les pods, puis vous avez certainement dĂ©cidĂ© que le pare-feu de type yaml dans Kubernetes est sur les abstractions suivantes ... Non, non . Ce n'est certainement pas nĂ©cessaire.


MĂȘme si vos spĂ©cialistes de la sĂ©curitĂ© n’ont pas Ă©tĂ© informĂ©s qu’en utilisant votre Kubernetes, vous pouvez crĂ©er un pare-feu trĂšs facilement et simplement, et il est trĂšs granulaire. S'ils ne le savent toujours pas et ne vous tirent pas: «Eh bien, donnez, donnez ...» Dans tous les cas, vous avez besoin d'une stratĂ©gie rĂ©seau pour bloquer l'accĂšs Ă  certains emplacements de service que vous pouvez retirer de votre cluster sans aucune autorisation.


Comme dans l'exemple que j'ai cité, vous pouvez extraire les métriques d'état du kube depuis n'importe quel espace de noms du cluster Kubernetes sans y avoir de droits. Les stratégies réseau ont fermé l'accÚs de tous les autres espaces de noms à la surveillance des espaces de noms et, pour ainsi dire, à tout: aucun accÚs, aucun problÚme. Dans tous les graphiques qui existent, à la fois le prometeus standard et ce prometeus qui est dans l'opérateur, il y a simplement dans les valeurs de la barre il y a une option pour simplement activer les politiques de réseau pour eux. Il vous suffit de l'activer et ils fonctionneront.


Il y a vraiment un problÚme ici. En tant qu'administrateur barbu normal, vous avez probablement décidé que les stratégies réseau ne sont pas nécessaires. Et aprÚs avoir lu toutes sortes d'articles sur des ressources telles que Habr, vous avez décidé que la flanelle, en particulier avec le mode passerelle hÎte, était la meilleure chose que vous puissiez choisir.


Que faire


Vous pouvez essayer de redĂ©ployer la solution rĂ©seau qui se trouve dans votre cluster Kubernetes, essayez de la remplacer par quelque chose de plus fonctionnel. Sur le mĂȘme Calico, par exemple. Mais immĂ©diatement, je veux dire que la tĂąche de changer la solution rĂ©seau dans le cluster de travail de Kubernetes n'est pas anodine. Je l'ai rĂ©solu deux fois (les deux fois, cependant, thĂ©oriquement), mais nous avons mĂȘme montrĂ© comment faire cela sur les Slurms. Pour nos Ă©tudiants, nous avons montrĂ© comment changer la solution rĂ©seau dans le cluster Kubernetes. En principe, vous pouvez essayer de vous assurer qu'il n'y a pas de temps d'arrĂȘt sur le cluster de production. Mais vous ne rĂ©ussirez probablement pas.


Et le problÚme est en fait résolu trÚs simplement. Il y a des certificats dans le cluster et vous savez que vos certificats vont mal tourner dans un an. Eh bien, et généralement une solution normale avec des certificats dans le cluster - pourquoi allons-nous créer un nouveau cluster à cÎté de lui, le laisser pourrir dans l'ancien, et nous allons tout refaire. Certes, quand ça va mal, tout se couchera de nos jours, mais alors un nouveau cluster.


Lorsque vous soulevez un nouveau cluster, insĂ©rez en mĂȘme temps Calico au lieu de flanelle.


Que faire si vous avez des certificats délivrés depuis cent ans et que vous n'allez pas recluster le cluster? Il y a une telle chose Kube-RBAC-Proxy. C'est un développement trÚs cool, il vous permet de vous intégrer comme conteneur de sidecar à n'importe quel foyer du cluster Kubernetes. Et elle ajoute en fait une autorisation via Kubernetes RBAC à ce pod.


Il y a un problÚme. Auparavant, Kube-RBAC-Proxy était intégré au prometheus de l'opérateur. Mais il était parti. Désormais, les versions modernes reposent sur le fait que vous avez une stratégie réseau et que vous les fermez. Et donc vous devez réécrire un peu le graphique. En fait, si vous accédez à ce référentiel , il existe des exemples de la façon de l'utiliser comme side-cars, et vous devrez réécrire les graphiques de maniÚre minimale.


Il y a un autre petit problÚme. Non seulement Prometheus donne ses métriques à toute personne qui les obtient. Nous avons également tous les composants du cluster Kubernetes, ils peuvent donner leurs métriques.


Mais comme je l'ai dit, si vous ne pouvez pas accéder au cluster et collecter des informations, vous pouvez au moins faire du mal.


Je vais donc vous montrer rapidement deux façons de gùcher votre cluster Kubernetes.


Vous allez rire quand je vous le dis, ce sont deux cas de la vraie vie.


La premiÚre façon. Manque de ressources.


Nous lançons un autre sous spécial. Il aura une telle section.


 resources: requests: cpu: 4 memory: 4Gi 

Comme vous le savez, les requĂȘtes sont la quantitĂ© de CPU et de mĂ©moire rĂ©servĂ©e sur l'hĂŽte pour des pods spĂ©cifiques avec des requĂȘtes. Si nous avons un hĂŽte Ă  quatre cƓurs dans le cluster Kubernetes et que quatre CPU y arrivent avec des demandes, cela signifie qu'aucun pod supplĂ©mentaire avec des demandes Ă  cet hĂŽte ne peut arriver.


Si je lance ceci sous, alors je ferai une commande:


 $ kubectl scale special-pod --replicas=... 

Personne d'autre ne pourra alors se dĂ©ployer sur le cluster Kubernetes. Parce que dans tous les nƓuds, les demandes se termineront. Et donc j'arrĂȘte votre cluster Kubernetes. Si je le fais le soir, je peux arrĂȘter le dĂ©ploiement pendant un certain temps.


Si nous regardons à nouveau la documentation de Kubernetes, nous verrons une chose appelée Limit Range. Il définit des ressources pour les objets de cluster. Vous pouvez écrire un objet Limit Range dans yaml, l'appliquer à certains espaces de noms - et plus loin dans cet espace de noms, vous pouvez dire que vous avez des ressources pour les pods par défaut, maximum et minimum.


Avec l'aide d'une telle chose, nous pouvons limiter les utilisateurs dans des espaces de noms de produits spĂ©cifiques d'Ă©quipes dans la capacitĂ© d'indiquer des choses dĂ©sagrĂ©ables sur leurs pods. Mais malheureusement, mĂȘme si vous dites Ă  l'utilisateur qu'il est impossible d'exĂ©cuter des pods avec des demandes de plusieurs processeurs, il existe une merveilleuse commande de mise Ă  l'Ă©chelle, ou via le tableau de bord, ils peuvent faire de la mise Ă  l'Ă©chelle.


Et d'ici vient la mĂ©thode numĂ©ro deux. Nous lançons 11 111 111 111 111 111 foyers. C'est onze milliards. Ce n'est pas parce que j'ai trouvĂ© un tel numĂ©ro, mais parce que je l'ai vu moi-mĂȘme.


La vraie histoire. Tard dans la soirée, j'allais quitter le bureau. Je regarde, un groupe de développeurs est assis dans le coin et fait quelque chose frénétiquement avec les ordinateurs portables. Je vais voir les gars et je leur demande: "Qu'est-ce qui vous est arrivé?"


Un peu plus tÎt, à neuf heures du soir, l'un des développeurs rentrait chez lui. Et il a décidé: "Je vais sauter ma candidature jusqu'à maintenant." J'ai cliqué un peu et Internet un peu terne. Il a de nouveau cliqué sur l'unité, il a appuyé sur l'unité, a cliqué sur Entrée. Poussé sur tout ce qu'il pouvait. Puis Internet a pris vie - et tout a commencé à évoluer jusqu'à cette date.


Certes, cette histoire n'a pas eu lieu sur Kubernetes, Ă  l'Ă©poque c'Ă©tait Nomad. Cela s'est terminĂ© par le fait qu'aprĂšs une heure de nos tentatives pour empĂȘcher Nomad de tenter de rester ensemble, Nomad a rĂ©pondu qu'il n'arrĂȘterait pas de coller et ne ferait rien d'autre. "Je suis fatiguĂ©, je pars." Et recroquevillĂ©.


J'ai naturellement essayĂ© de faire de mĂȘme sur Kubernetes. Les onze milliards de pods de Kubernetes n'Ă©taient pas satisfaits, a-t-il dĂ©clarĂ©: «Je ne peux pas. DĂ©passe les protĂšge-dents internes. " Mais 1 000 000 000 de foyers le pouvaient.


En rĂ©ponse Ă  un milliard, le Cube n'est pas entrĂ© Ă  l'intĂ©rieur. Il a vraiment commencĂ© Ă  Ă©voluer. Plus le processus avançait, plus il lui fallait de temps pour crĂ©er de nouveaux foyers. Mais le processus continuait. Le seul problĂšme est que si je peux exĂ©cuter des pods indĂ©finiment dans mon espace de noms, mĂȘme sans demandes et limites, je peux dĂ©marrer un tel nombre de pods avec certaines tĂąches qu'avec ces tĂąches, les nƓuds commenceront Ă  s'additionner Ă  partir de la mĂ©moire, Ă  partir du CPU. Lorsque j'exĂ©cute autant de foyers, les informations qu'ils contiennent doivent aller dans le rĂ©fĂ©rentiel, c'est-Ă -dire, etcd. Et quand trop d'informations arrivent lĂ -bas, l'entrepĂŽt commence Ă  trahir trop lentement - et Ă  Kubernetes les choses ternes commencent.


Et encore un problĂšme ... Comme vous le savez, les Ă©lĂ©ments de contrĂŽle de Kubernetes ne sont pas seulement une chose centrale, mais plusieurs composants. LĂ , en particulier, il y a un gestionnaire de contrĂŽleur, un planificateur, etc. Tous ces gars-lĂ  commenceront Ă  faire un travail stupide inutile en mĂȘme temps, ce qui avec le temps commencera Ă  prendre de plus en plus de temps. Le gestionnaire de contrĂŽleur va crĂ©er de nouveaux pods. Le planificateur va essayer de leur trouver un nouveau nƓud. Les nouveaux nƓuds de votre cluster prendront probablement fin bientĂŽt. Le cluster Kubernetes commencera Ă  fonctionner plus lentement et plus lentement.


Mais j'ai décidé d'aller encore plus loin. Comme vous le savez, à Kubernetes, il existe une chose appelée service. Eh bien, et par défaut dans vos clusters, le service fonctionne probablement à l'aide de tables IP.


Si vous exécutez un milliard de foyers, par exemple, puis utilisez un script pour forcer Kubernetis à créer de nouveaux services:


 for i in {1..1111111}; do kubectl expose deployment test --port 80 \ --overrides="{\"apiVersion\": \"v1\", \"metadata\": {\"name\": \"nginx$i\"}}"; done 

Sur tous les nƓuds du cluster, approximativement de nouvelles rĂšgles iptables seront gĂ©nĂ©rĂ©es approximativement simultanĂ©ment. De plus, pour chaque service, un milliard de rĂšgles iptables seront gĂ©nĂ©rĂ©es.


J'ai vĂ©rifiĂ© tout cela sur plusieurs milliers, jusqu'Ă  une douzaine. Et le problĂšme est que dĂ©jĂ  Ă  ce seuil ssh sur le nƓud est assez problĂ©matique Ă  faire. Parce que les paquets, passant un tel nombre de chaĂźnes, commencent Ă  ne pas se sentir trĂšs bien.


Et tout cela est également résolu avec l'aide de Kubernetes. Il existe un tel objet quota de ressources. Définit le nombre de ressources et d'objets disponibles pour un espace de noms dans un cluster. Nous pouvons créer un objet yaml dans chaque espace de noms du cluster Kubernetes. En utilisant cet objet, nous pouvons dire que nous avons alloué un certain nombre de demandes, des limites pour cet espace de noms, puis nous pouvons dire que dans cet espace de noms, il est possible de créer 10 services et 10 pods. Et un seul développeur peut au moins se faufiler le soir. Kubernetes lui dira: "Vous ne pouvez pas tenir vos pods à un tel montant car il dépasse le quota de ressources." Tout, le problÚme est résolu. La documentation est ici .


Un point problématique se pose à cet égard. Vous sentez à quel point il devient difficile de créer un espace de noms dans Kubernetes. Pour le créer, nous devons considérer un tas de choses.


Quota de ressources + plage limite + RBAC
‱ CrĂ©er un espace de noms
‱ CrĂ©er une plage limite intĂ©rieure
‱ CrĂ©er un quota de ressources interne
‱ CrĂ©er un compte de service pour CI
‱ CrĂ©er une liaison de rĂŽles pour CI et les utilisateurs
‱ ExĂ©cutez Ă©ventuellement les modules de service nĂ©cessaires


Par conséquent, saisissant cette occasion, je voudrais partager mes développements. Il existe une telle chose, appelée l'opérateur SDK. C'est un moyen dans le cluster Kubernetes d'écrire des opérateurs pour lui. Vous pouvez écrire des instructions à l'aide d'Ansible.


Tout d'abord, il a été écrit en Ansible, puis j'ai regardé qu'il y avait un opérateur SDK et j'ai réécrit le rÎle Ansible dans l'opérateur. Cet opérateur vous permet de créer un objet dans le cluster Kubernetes appelé une équipe. yaml . , - .


.


. ?
. Pod Security Policy — . , , - .


Network Policy — - . , .


LimitRange/ResourceQuota — . , , . , .


, , , . .


. , warlocks , .


, , . , ResourceQuota, Pod Security Policy . .


.

Source: https://habr.com/ru/post/fr472484/


All Articles