Pavel Selivanov, lÞsninger arkitekt ved Southbridge og lÊrer hos Slurm, holdt et foredrag pÄ DevOpsConf 2019. Dette foredrag er en del af et af emnerne i det avancerede kursus om Kubernetes "Slurm Mega".
finder sted i Moskva den 18.-20. november.
â Moskva, 22.-24. november.
er altid tilgĂŠngelig.

Under cutten â transskription af foredraget.
Goddag, kolleger og sympathiserende. I dag vil jeg tale om sikkerhed.
Jeg kan se, at der i dag er mange sikkerhedsfolk i salen. Jeg undskylder pÄ forhÄnd, hvis jeg bruger termer fra sikkerhedsverdenen ikke helt som I plejer.
Det skete sĂ„ledes, at for omkring et halvt Ă„r siden fik jeg fat i en offentlig Kubernetes-klynge. Offentlig â betyder, at der er et antal namespaces, i disse namespaces er der brugere, isoleret i deres egen namespace. Alle disse brugere tilhĂžrer forskellige virksomheder. NĂ„, og det var meningen, at denne klynge skulle bruges som CDN. Det vil sige, at de giver dig en klynge, giver dig en bruger, du gĂ„r ind i din namespace, og deployer dine frontend.
Mit tidligere firma forsÞgte at sÊlge en sÄdan tjeneste. Og jeg blev bedt om at teste klyngen for at se, om denne lÞsning var passende eller ej.
Jeg kom ind i denne klynge. Jeg fik begrĂŠnsede rettigheder, begrĂŠnset namespace. Drenge der forstod, hvad sikkerhed var. De havde lĂŠst, hvad Role-based access control (RBAC) er i Kubernetes â og de havde sat det op sĂ„dan, at jeg ikke kunne starte pods adskilt fra deployments. Jeg kan ikke huske opgaven, jeg forsĂžgte at lĂžse ved at starte en pod uden deployment, men jeg havde virkelig lyst til bare at starte en pod. Jeg besluttede at se, hvilke rettigheder jeg havde i klyngen, hvad jeg kunne, hvad jeg ikke kunne, og hvad de havde sat op. Samtidig vil jeg fortĂŠlle, hvad der var indstillet forkert i deres RBAC.
Det lykkedes mig, at to minutter senere fik jeg admin-rettigheder til deres klynge, kiggede i alle nabonamespaces, og sÄ de kÞrende produktionsfrontender fra virksomheder, der allerede havde kÞbt tjenesten og deployet sig. Jeg mÄtte stoppe mig selv for ikke at gÄ ind til nogen i fronten og placere et bandeord pÄ hovedsiden.
Jeg vil forklare med eksempler, hvordan jeg gjorde det, og hvordan man skal beskytte sig imod det.
Men skal jeg starte med at prÊsentere mig. Mit navn er Pavel Selivanov. Jeg er arkitekt hos Southbridge. Jeg har ekspertise inden for Kubernetes, DevOps og andre trendy teknologier. Sammen med ingeniÞrerne hos Southbridge opbygger vi alt dette, mens jeg rÄdgiver.
Udover vores primĂŠre aktiviteter har vi for nylig lanceret projekter, der kaldes SlĂŒrmer. Vi forsĂžger at bringe vores evne til at arbejde med Kubernetes ud til folket og lĂŠre andre mennesker at arbejde med K8s.
Hvad vil jeg tale om i dag. Emnet for mit oplĂŠg er klart â sikkerhed i Kubernetes-klynger. Men jeg vil straks sige, at dette emne er meget omfattende â og derfor vil jeg straks prĂŠcisere, hvad jeg bestemt ikke vil tale om. Jeg vil ikke tale om de overused begreber, som allerede er blevet mast igennem pĂ„ internettet. Alt det der RBAC og certifikater.
Jeg vil tale om, hvad jeg og mine kolleger bekymrer os om, nÄr det kommer til sikkerheden i Kubernetes-klynger. Vi ser disse problemer bÄde hos udbydere, der tilbyder Kubernetes-klynger, og hos kunder, der henvender sig til os. Selv kunder, der kommer til os fra andre konsulentadministrative virksomheder. SÄ skalaen af tragedien er faktisk meget stor.
Lad mig prĂŠsentere tre punkter, som jeg vil tale om i dag:
- Brugerrettigheder vs pod-rettigheder. Brugerrettigheder og pod-rettigheder er ikke det samme.
- Indsamling af information om klyngen. Jeg vil vise, hvilken information der kan samles fra en klynge, uden at have specielle rettigheder i denne klynge.
- DoS-angreb pÄ klyngen. Hvis vi ikke kan indsamle information, kan vi stadig bringe klyngen ned. Jeg vil tale om DoS-angreb pÄ de styrende elementer i klyngen.
En anden generel ting, jeg vil nĂŠvne â hvad jeg har testet dette pĂ„, og hvad jeg kan sige fungerer.
Vi tager udgangspunkt i installationen af en Kubernetes-klynge ved hjĂŠlp af Kubespray. Hvis nogen ikke ved, hvad det er, sĂ„ er det faktisk en samling roller til Ansible. Vi bruger det konstant i vores arbejde. Det er godt, fordi det kan installeres hvor som helst â bĂ„de pĂ„ fysisk hardware og i skyen. En installationsmetode fungerer generelt overalt.
I denne klynge vil jeg have Kubernetes v1.14.5. Hele Kubernetes-klyngen, som vi vil overveje, er opdelt i namespaces, hvor hver namespace tilhÞrer et separat team, og medlemmerne af dette team har adgang til deres eget namespace. De kan ikke gÄ ind i andre namespaces, kun deres eget. Men der findes en admin-konto, som har rettigheder til hele klyngen.

Jeg lovede, at det fÞrste, vi skulle gÞre, var at fÄ admin-rettigheder til klyngen. Vi har brug for en specielt forberedt pod, som skal bryde klyngen i Kubernetes. Alt, hvad vi skal gÞre, er at anvende den i Kubernetes-klyngen.
kubectl apply -f pod.yamlDenne pod vil komme til en af masterne i Kubernetes-klyngen. Efter dette vil klyngen gladeligt returnere en fil, der hedder admin.conf. I denne fil gemmes alle admin-certifikater, og API'en for klyngen er desuden konfigureret. SÄdan kan man nemt fÄ admin-adgang, jeg vil sige til 98% af Kubernetes-klynger.
Jeg gentager, denne pod blev lavet af en udvikler i din klynge, som har adgang til at implementere sine forslag i en lille namespace, han er helt begrĂŠnset af RBAC. Han havde ingen rettigheder. Men alligevel kom certifikatet tilbage.
Og nu til den specielt forberedte pod. Vi kÞrer den pÄ en hvilken som helst image. For eksempel vil vi tage debian:jessie.
Vi har noget som dette:
tolerations:
- effect: NoSchedule
operator: Exists
nodeSelector:
node-role.kubernetes.io/master: "" Hvad er en toleration? Masterne i Kubernetes-klyngen er normalt markeret med noget, der kaldes taint. Essensen af denne 'taint' er, at pod'er ikke kan tildeles til master-noder. Men ingen forhindrer os i at angive i enhver pod, at den er tolerant over for 'taint'. Toleration-sektionen siger netop, at hvis der er NoSchedule pĂ„ en node, er vores pod tolerant over for denne taint â og der er ingen problemer.
Derudover siger vi, at vores pod ikke bare er tolerant, men ogsĂ„ Ăžnsker at gĂ„ specifikt til masteren. Fordi de mest vĂŠrdifulde ting, vi har brug for, findes pĂ„ masterne â alle certifikaterne. Derfor angiver vi nodeSelector â og vi har en standardlabel pĂ„ masterne, der tillader os at vĂŠlge de noder fra hele klyngen, som er mastere.
Med disse to sektioner vil pod'en helt sikkert komme til masteren. Og den vil fÄ lov til at bo der.
Men det er ikke nok bare at komme til masteren. Det giver os ikke noget. Derfor har vi to ting mere:
hostNetwork: true
hostPID: true Vi angiver, at vores pod, som vi kÞrer, vil leve i kernens namespace, i netvÊrks-namespace og i PID-namespace. SÄ snart pod'en kÞrer pÄ masteren, vil den kunne se alle de rigtige, levende interfaces pÄ denne node, lytte til al trafik og se PID for alle processer.
NĂŠste skridt er enkelt. Tag etcd og lĂŠs, hvad du Ăžnsker.
Det mest interessante er denne mulighed i Kubernetes, som er til stede som standard.
volumeMounts:
- mountPath: /host
name: host
volumes:
- hostPath:
path: /
type: Directory
name: host Og essensen er, at vi i pod'en, som vi kĂžrer, selv uden rettigheder til denne klynge, kan sige, at vi Ăžnsker at oprette et volume af typen hostPath. Det vil sige, tage stien fra vĂŠrten, hvori vi vil kĂžre â og tage den som et volume. Og sĂ„ giver vi det navnet: host. Hele denne hostPath monterer vi inde i pod'en. I dette eksempel i mappen /host.
Jeg gentager. Vi sagde til pod'en at komme til masteren, fĂ„ hostNetwork og hostPID â og montere hele roden fra masteren ind i denne pod.
Du forstÄr, at vi har bash kÞrende i debian, og denne bash kÞrer som root. Det vil sige, at vi lige har fÄet root-adgang til masteren uden at have nogen slags rettigheder i Kubernetes-klyngen.
DernÊst er hele opgaven at gÄ ind i pod'en i mappen /host /etc/kubernetes/pki, hvis jeg ikke tager fejl, og hente alle masterens certifikater fra klyngen og dermed blive admin pÄ klyngen.
Ser man det sĂ„dan, er det nogle af de mest farlige rettigheder i pods â uanset hvad rettigheder brugeren har:

Hvis jeg har ret til at starte en pod i et bestemt namespace af klyngen, sÄ har denne pod som standard de samme rettigheder. Jeg kan starte privilegerede pods, og det er i praksis alle rettigheder, nÊsten root pÄ noden.
Mit favorit er Root-bruger. Og Kubernetes har denne mulighed, Run As Non-Root. Det er en slags beskyttelse mod hackere. Ved du, hvad et 'moldovisk virus' er? Hvis du er hacker og er kommet ind i min Kubernetes-klynge, sÄ beder vi, de stakkels administratorer: 'Angiv venligst i dine pods, som du vil hacke min klynge med, run as non-root. Ellers risikerer du at kÞre en proces i din pod som root, og det vil gÞre det meget nemt at hacke mig. Beskyt dig selv, tak.'
Host path volume â efter min mening den hurtigste mĂ„de at opnĂ„ det Ăžnskede resultat fra Kubernetes-klyngen.
Men hvad skal man gĂžre med alt dette?
Tankerne, der bÞr komme til enhver normal administrator, der stÄr over for Kubernetes: "à h, jeg sagde det, Kubernetes fungerer ikke. Der er huller i det. Og hele Kubernetes er skrammel." I virkeligheden findes der noget, der hedder dokumentation, og hvis man kigger der, er der et afsnit .
Dette er et yaml-objekt â vi kan oprette det i Kubernetes-klassen â som kontrollerer sikkerhedsaspekter specifikt ved beskrivelsen af pods. Det vil sige, at det faktisk kontrollerer de rettigheder til at bruge forskellige hostNetwork, hostPID, bestemte typer volume, der findes i pods, nĂ„r de startes. Ved hjĂŠlp af Pod Security Policy kan alt dette beskrives.
Det mest interessante ved Pod Security Policy er, at PSP-installationerne i Kubernetes-klassen ikke er beskrevet pÄ nogen mÄde, de er simpelthen slukket som standard. Pod Security Policy aktiveres ved hjÊlp af en admission plugin.
Okay, lad os deployere Pod Security Policy til klassen og sige, at vi har nogle administrative pods i et namespace, som kun administratorer har adgang til. Lad os sige, at i alle andre pods har begrĂŠnsede rettigheder. For det er sandsynligvis ikke nĂždvendig for udviklerne at kĂžre privilegerede pods i din klasse.
Og alt ser ud til at vÊre i orden. Og vores Kubernetes-klasse kan ikke hacked pÄ to minutter.
Der er et problem. Sandsynligvis, hvis du har en Kubernetes-klasse, sÄ er der installeret overvÄgning i din klasse. Jeg tÞr endda forudsige, at hvis der er overvÄgning i din klasse, sÄ hedder den Prometheus.
Det, jeg nu vil fortÊlle, vil vÊre gyldigt bÄde for Prometheus-operatÞren og for Prometheus, der er sat op i sin reneste form. SpÞrgsmÄlet er, at hvis jeg ikke hurtigt kan fÄ en administrator i klassen, betyder det, at jeg skal lede mere. Og jeg kan lede ved hjÊlp af din overvÄgning.
Sandsynligvis har alle lÊst de samme artikler pÄ Habré, og overvÄgningen findes i namespace'et monitoring. Helm-chartet kaldes nÊsten det samme af alle. Jeg antager, at hvis du laver helm install stable/prometheus, vil du fÄ cirka de samme navne. Og det er endda sandsynligt, at DNS-navnet i din klasse ikke skal gÊtte. For det er standard.

Videre har vi et slags dev ns, i hvilket man kan starte en slags pod. Og derfra er det meget let at gÞre sÄdan her:
$ curl http://prometheus-kube-state-metrics.monitoring prometheus-kube-state-metrics er en af Prometheus' eksportÞrer, der indsamler metrics fra Kubernetes API'en selv. Der er mange data om, hvad der kÞrer i din klynge, hvordan det er, og hvilke problemer du mÄtte have med det.
Som et simpelt eksempel:
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:e29561119a52adad9edc72bfe0e7fcab308501313b09bf99df4a9638ee634989",container_id="docker://7cbe7b1fea33f811fdd8f7e0e079191110268f2853397d7daf08e72c22d3cf8b"} 1
Ved at lave en simpel curl-forespÞrgsel fra en ikke-privilegeret pod kan du fÄ sÄdan en information. Hvis du ikke ved, hvilken version af Kubernetes du kÞrer, sÄ kan den nemt fortÊlle dig det.
Og det mest interessante er, at udover at du tilgÄr kube-state-metrics, kan du ligesÄ godt tilgÄ Prometheus direkte. Du kan indsamle metrics derfra. Du kan endda bygge metrics derfra. Teoretisk set kan du bygge en forespÞrgsel fra klyngen til Prometheus, som simpelthen slukker den. Og din overvÄgning vil overhovedet stoppe med at fungere.
Og her opstÄr spÞrgsmÄlet, overvÄger nogen ekstern overvÄgning din overvÄgning. Lige nu har jeg fÄet mulighed for at agere i Kubernetes-klyngen uden konsekvenser for mig selv. Du vil ikke engang vide, at jeg handler der, da overvÄgningen allerede er vÊk.
Ligesom med PSP, opstĂ„r der en fĂžlelse af, at problemet er, at alle disse trendy teknologier â Kubernetes, Prometheus â de virker bare ikke og er fulde af huller. Men det gĂžr de ikke.
Der er sĂ„dan en ting â .
Hvis du er en normal administrator, sÄ ved du sandsynligvis, at Network Policy er endnu en yaml, der allerede findes i klyngen. Og nogle Network Policies er bestemt ikke nÞdvendige. Selvom du har lÊst om, hvad en Network Policy er, at det er en yaml-firewall i Kubernetes, som begrÊnser adgangen mellem namespaces og pods, sÄ har du helt sikkert besluttet, at en firewall i yaml-format i Kubernetes er bare endnu en abstraktion⊠Nej, det er slet ikke nÞdvendigt.
Selv hvis dine sikkerhedsspecialister ikke har fÄet fortalt, at du nemt og enkelt kan bygge en meget granular firewall ved hjÊlp af din Kubernetes, hvis de ikke ved dette endnu, og ikke trykker pÄ: «Lad os fÄ det...». SÄ er Network Policy noget, du har brug for, for at lukke adgangen til visse services, som kan tilgÄs fra din klynge uden nogen form for autorisation.
Som i det eksempel, jeg nÊvnte, kan man tilgÄ kube state metrics fra enhver namespace i Kubernetes-klyngen uden at have nogen rettigheder til det. Network policies har lukket adgangen fra alle andre namespaces til overvÄgningsnamespace, og som sÄdan: ingen adgang, ingen problemer. I alle chartene, der findes, bÄde den standard Prometheus og den Prometheus, der er i operatoren, er der blot en mulighed i Helm values for at aktivere network policies for dem. Du skal blot aktivere det, sÄ vil det fungere.
Der er dog ét problem. Som en ordentlig bearded admin har du nok besluttet, at network policies ikke er nÞdvendige. Og efter at have lÊst forskellige artikler pÄ ressourcer som Habr, har du besluttet, at flannel, isÊr med host-gateway mode, er det bedste, du kan vÊlge.
Hvad skal man gĂžre?
Du kan prÞve at redeploye den netvÊrkslÞsning, du har i din Kubernetes-klynge, og forsÞge at erstatte den med noget mere funktionelt. Det samme Calico, for eksempel. Men jeg vil straks sige, at opgaven at skifte netvÊrkslÞsningen i en arbejds-Kubernetes-klynge er ganske ikke-triviel. Jeg har lÞst den to gange (begge gange teoretisk), men vi har endda pÄ Slyerma vist, hvordan man gÞr det. For vores studerende har vi vist, hvordan man skifter netvÊrkslÞsning i en Kubernetes-klynge. Du kan principielt prÞve at gÞre det, sÄ der ikke er nedetid pÄ produktionsklyngen. Men sandsynligvis vil du ikke have held.
Og problemet lĂžses faktisk meget enkelt. I klyngen findes der certifikater, og du ved, at dine certifikater udlĂžber om et Ă„r. NĂ„, og den normale lĂžsning med certifikater i klyngen er â hvorfor skal vi bryde os om det, vi kan oprette en ny klynge ved siden af, lad den gamle vĂŠre, indtil den udlĂžber, og sĂ„ redeployer vi alt. Sandt nok, nĂ„r den udlĂžber, vil vi have en dag, hvor alt ligger ned, men vi har i det mindste en ny klynge.
NÄr du opretter den nye klynge, sÄ indsÊt Calico i stedet for flannel.
Hvad skal man gÞre, hvis du har certifikater udstedt i hundrede Är, og du ikke planlÊgger at genudrulle klyngen? Der findes noget kaldet Kube-RBAC-Proxy. Det er en ret smart lÞsning, som gÞr det muligt at integrere sig selv som en sidecar-container til en hvilken som helst pod i Kubernetes-klyngen. Og den tilfÞjer faktisk godkendelse via RBAC fra Kubernetes til denne pod.
Der er et problem. Tidligere var denne Kube-RBAC-Proxy-lÞsning indbygget i Prometheus-operatoren. Men det findes ikke lÊngere. Moderne versioner forudsÊtter, at du har netvÊrkspolitikker, og at du lukker af med dem. SÄ du bliver nÞdt til at omskrive diagrammet en smule. Hvis du gÄr ind i , vil der vÊre eksempler pÄ, hvordan dette kan bruges som sidecars, og diagrammerne skal kun omskrives minimalt.
Der er et andet lille problem. Ikke kun Prometheus giver sine metrikker til hvem som helst. Alle komponenterne i Kubernetes-klyngen kan ogsÄ sende deres egne metrikker.
Men som jeg allerede har sagt, hvis du ikke kan fÄ adgang til klyngen og indsamle information, kan du i det mindste skabe nogen skade.
SÄ jeg vil hurtigt vise to mÄder, hvordan man kan skade sundheden af Kubernetes-klyngen.
Du vil grine, nÄr jeg fortÊller det, det er to tilfÊlde fra virkeligheden.
FĂžrste metode. Udnyttelse af ressourcer.
Vi starter en anden speciel pod. Den vil have sÄdan en sektion.
resources:
requests:
cpu: 4
memory: 4Gi Som du ved, er requests den mÊngde CPU og hukommelse, der reserveres pÄ vÊrten for specifikke pods med requests. Hvis vi har en firekernet vÊrt i Kubernetes-klyngen, og der ankommer en pod med requests pÄ fire CPU'er, sÄ kan der ikke ankomme flere pods med requests til denne vÊrt.
Hvis jeg lancerer en sÄdan pod, og derefter udfÞrer kommandoen:
$ kubectl scale special-pod --replicas=...SÄ vil ingen andre kunne deploye til Kubernetes-klyngen. Fordi alle noder vil lÞbe tÞr for requests. Og pÄ den mÄde vil jeg stoppe din Kubernetes-klynge. Hvis jeg gÞr det om aftenen, kan jeg stoppe deployeringen i ret lang tid.
Hvis vi ser endnu en gang i Kubernetes-dokumentationen, vil vi se noget, der hedder Limit Range. Det fastsĂŠtter ressourcer for klyngeobjekter. Du kan skrive et Limit Range-objekt i yaml, anvende det i bestemte namespaces â og derefter kan du angive, at du har standard, maksimale og minimale ressourcer til pods i dette namespace.
Med en sÄdan ordning kan vi begrÊnse brugerne i specifikke produkt-namespace til at angive alt muligt snavs i deres pods. Men desvÊrre, selvom du siger til brugeren, at de ikke mÄ starte pods med requests stÞrre end én CPU, er der en fantastisk kommando kaldet scale, eller de kan gÞre det gennem dashboardet.
Og herfra kommer den anden metode. Vi starter 11 111 111 111 111 pods. Det er elleve milliarder. Det er ikke, fordi jeg har fundet pÄ det tal, men fordi jeg selv har set det.
En sand historie. Senere om aftenen var jeg allerede ved at forlade kontoret. Jeg ser en gruppe udviklere sidde sammen i hjÞrnet og gÞre noget nervÞst med deres bÊrbare computere. Jeg nÊrmer mig dem og spÞrger: «Hvad er der sket?»
Tidligere, omkring kl. 21, havde en af udviklerne tĂŠnkt sig at tage hjem. Og besluttede: «Jeg vil skalere min applikation til Ă©n.» Han trykkede pĂ„ Ă©n, men internettet var lidt langsomt. Han trykkede igen pĂ„ Ă©n, han trykkede pĂ„ Ă©n, klikkede pĂ„ Enter. Han trykkede pĂ„ alt, hvad han kunne. SĂ„ blev internettet levende â og alt begyndte at skalere til dette tal.
Faktisk foregik denne historie ikke pÄ Kubernetes, det var pÄ det tidspunkt Nomad. Det sluttede med, at efter en times forsÞg pÄ at stoppe Nomad fra sin insisterende skalering, svarede Nomad, at den ikke ville stoppe med at skalere og ikke ville lave noget andet. «Jeg er trÊt, jeg gÄr.» Og lukkede ned.
Jeg forsÞgte naturligvis at gÞre det samme pÄ Kubernetes. Elleve milliarder pods glÊdede ikke Kubernetes, den sagde: «Jeg kan ikke. Overskrider interne grÊnser.» Men 1 000 000 000 pods kunne den hÄndtere.
Som svar pÄ en milliard pods i sig selv, er han virkelig begyndt at skalere. Jo lÊngere processen skred frem, desto mere tid brugte han pÄ at oprette nye pods. Men processen gik stadig. Det eneste problem er, at hvis jeg kan kÞre pods uden begrÊnsninger i mit namespaces, kan jeg selv uden requests og limits starte et sÄdant antal pods med nogle opgaver, at noderne begynder at kollapsere pÄ grund af hukommelse og CPU. NÄr jeg starter sÄ mange pods, skal informationen fra dem gemmes i lagringen, det vil sige etcd. Og nÄr der kommer for meget information derind, begynder lagringen at returnere for langsomt - og Kubernetes oplever flaskehalse.
Men der er endnu et problem... Som I ved, er Kubernetes kontrolmoduler ikke bare én central ting, men flere komponenter. Herunder er der controller manager, scheduler osv. Alle disse drenge vil begynde at udfÞre unÞdvendigt og meningslÞst arbejde samtidig, som med tiden vil tage mere og mere tid. Controller manageren vil oprette nye pods. Scheduler vil forsÞge at finde en ny node til dem. Nye noder i jeres klynge vil snart vÊre opbrugt. Kubernetes-klyngen vil begynde at arbejde langsommere og langsommere.
Men jeg besluttede at tage det et skridt videre. Som I ved, i Kubernetes er der noget, der kaldes en service. Og som standard fungerer servicen sandsynligvis i jeres klynger ved hjĂŠlp af IP tables.
Hvis man starter en milliard pods, for eksempel, og derefter med et lille script fÄr Kubernetes til at oprette nye services:
for i in {1..1111111}; do
kubectl expose deployment test --port 80
--overrides="{"apiVersion": "v1",
"metadata": {"name": "nginx$i"}}";
done PÄ alle noder i klyngen vil der omtrent samtidigt blive genereret nye og nye iptables-regler. Hver service vil generere én milliard iptables-regler.
Jeg har testet det hele med et par tusinde, op til ti. Og problemet er, at allerede ved dette niveau er det ret problematisk at SSH'e ind pÄ noden. Fordi pakkerne, der passerer gennem sÄ mange kÊder, begynder at fÄ det lidt skidt.
Og det hele kan ogsÄ lÞses ved hjÊlp af Kubernetes. Der findes et objekt kaldet Resource quota. Det fastsÊtter antallet af tilgÊngelige ressourcer og objekter for et namespace i klyngen. Vi kan oprette et yaml-objekt i hvert namespace i Kubernetes-klyngen. Ved hjÊlp af dette objekt kan vi angive, at der er afsat et bestemt antal requests og limits til dette namespace, og derefter kan vi sige, at der i dette namespace kan oprettes 10 services og 10 pods. Og udvikleren kan gÞre hvad som helst i aftentimerne. Kubernetes vil sige til ham: "Du kan ikke skalere dine pods op til det antal, fordi det overskrider ressourcekvoten." Problemet er lÞst. .
Et problem opstÄr i den forbindelse. Du kan mÊrke, hvor svÊrt det bliver at oprette et namespace i Kubernetes. For at oprette det skal vi tage hÞjde for en masse ting.
Resource quota + Limit Range + RBAC
âą Opretter namespace
âą Opretter limitrange indeni
âą Opretter resourcequota indeni
âą Opretter serviceaccount til CI
âą Opretter rolebinding til CI og brugere
âą Valgfrit kan der startes de nĂždvendige tjenester i pods
Derfor vil jeg benytte lejligheden til at dele mine udviklinger. Der findes noget, der hedder operator SDK. Det er en mÄde at skrive operatorer til Kubernetes-klyngen. Du kan skrive operatorer ved hjÊlp af Ansible.
FÞrst havde vi skrevet det med Ansible, men sÄ sÄ jeg, at der er en operator SDK og skrev Ansible-rollen om til en operator. Denne operator gÞr det muligt at oprette et objekt i Kubernetes-klyngen, som hedder en kommando. Inden for kommandoen giver det mulighed for at beskrive et yaml-miljÞ til denne kommando. Og inden for miljÞet for kommandoen giver det mulighed for at beskrive, at vi tildeler sÄ mange ressourcer.
Lille .
Og til sidst. Hvad skal vi gĂžre med alt dette?
For det fĂžrste. Pod Security Policy â det er godt. Og selvom ingen af Kubernetes-installatĂžrerne bruger dem til dato, bĂžr de alligevel anvendes i jeres klynger.
Network Policy â det er ikke bare en unĂždvendig funktion. Det er noget, der virkelig er nĂždvendigt i klyngen.
LimitRange/ResourceQuota â det er pĂ„ tide at bruge. Vi begyndte for lĂŠnge siden at anvende dette, og jeg var lĂŠnge overbevist om, at alle anvendte det. Det viste sig at vĂŠre sjĂŠldent.
Udover det, jeg nÊvnte i mit foredrag, er der udocumenterede funktioner, der muliggÞr angreb pÄ klyngen. For nylig kom der en .
Nogle ting er sÄ triste og frustrerende. For eksempel, under visse omstÊndigheder kan kubelets i Kubernetes-klyngen returnere indholdet af warlocks-mappen til uautoriserede brugere.
Der ligger instruktioner om, hvordan man genskaber alt, hvad jeg har talt om. Der ligger filer med produktionsudgaver, som viser, hvordan ResourceQuota og Pod Security Policy ser ud. Og alt dette kan man rĂžre ved.
Tak til alle.
Kilde: habr.com
