{"id":97982,"date":"2020-10-23T14:42:15","date_gmt":"2020-10-23T12:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes"},"modified":"2020-11-18T00:58:47","modified_gmt":"2020-11-17T22:58:47","slug":"devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hej alla! Jag heter Oleg Sidorenkov och jag arbetar som chef f\u00f6r infrastrukturteamet p\u00e5 f\u00f6retaget DomClick. Vi har drivit \"Kubik\" i produktion i \u00f6ver tre \u00e5r och har under den tiden haft m\u00e5nga intressanta upplevelser med den. Idag kommer jag ber\u00e4tta f\u00f6r er hur man med r\u00e4tt tillv\u00e4gag\u00e5ngss\u00e4tt kan pressa \u00e4nnu mer prestanda ur \"vanillja\" Kubernetes f\u00f6r din kluster. Klara, f\u00e4rdiga, g\u00e5! <\/p>\n<p>Ni vet alla att Kubernetes \u00e4r ett skalbart system med \u00f6ppen k\u00e4llkod f\u00f6r orkestrering av containrar; eller 5 bin\u00e4rer som skapar magi genom att hantera livscykeln av era mikrotj\u00e4nster i servermilj\u00f6. Dessutom \u00e4r det ett ganska flexibelt verktyg som kan s\u00e4ttas ihop som en Lego-kloss f\u00f6r maximal anpassning till olika uppgifter.<\/p>\n<p>Och allt verkar bra: sl\u00e4ng servrar i klustret som ved i en kamin och ha inga bekymmer. Men om du bryr dig om milj\u00f6n, b\u00f6rjar du t\u00e4nka: \"Hur kan jag h\u00e5lla elden i kaminen och samtidigt v\u00e5rda skogen?\". Med andra ord, hur kan man hitta s\u00e4tt att f\u00f6rb\u00e4ttra infrastrukturen och s\u00e4nka kostnaderna.<\/p>\n<h2>1. H\u00e5ll koll p\u00e5 resurserna f\u00f6r team och applikationer<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En av de mest grundl\u00e4ggande men effektiva metoderna \u00e4r att inf\u00f6ra requests\/limits. Dela upp applikationerna i namespaces, och namespaces efter utvecklingsteam. Ange resursv\u00e4rden f\u00f6r CPU-tid, minne och ephemeral lagring f\u00f6r applikationen innan deployment.<\/p>\n<pre><code>resources:\n   requests:\n     memory: 2Gi\n     cpu: 250m\n   limits:\n     memory: 4Gi\n     cpu: 500m<\/code><\/pre>\n<p>Genom erfarenhet har vi kommit fram till att man inte b\u00f6r \u00f6ka requests mer \u00e4n dubbelt s\u00e5 mycket som limits. Klusterstorleken ber\u00e4knas utifr\u00e5n requests, och om du ger applikationerna en skillnad i resurser, till exempel 5-10 g\u00e5nger, s\u00e5 f\u00f6rest\u00e4ll dig vad som kommer h\u00e4nda med din nod n\u00e4r den fylls med pods och pl\u00f6tsligt f\u00e5r belastning. Inget bra. Minst throttling, och som v\u00e4rst, kan du s\u00e4ga hejd\u00e5 till workern och f\u00e5 en cyklisk belastning p\u00e5 de andra noderna efter att pods b\u00f6rjar flytta.<\/p>\n<p>Dessutom, med hj\u00e4lp av <code>limitranges<\/code> kan du vid starten ange resursv\u00e4rden f\u00f6r containern - minimala, maximala och standard:<\/p>\n<pre><code>\u279c  ~ kubectl describe limitranges --namespace ops\nName:       limit-range\nNamespace:  ops\nType        Resource           Min   Max   Default Request  Default Limit  Max Limit\/Request Ratio\n----        --------           ---   ---   ---------------  -------------  -----------------------\nContainer   cpu                50m   10    100m             100m           2\nContainer   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -\nContainer   memory             64Mi  40Gi  128Mi            128Mi          2<\/code><\/pre>\n<p>Kom ih\u00e5g att begr\u00e4nsa resurserna i namnutrymmet, s\u00e5 att inget team kan ta alla resurser i klustret:<\/p>\n<pre><code>\u279c  ~ kubectl describe resourcequotas --namespace ops\nName:                   resource-quota\nNamespace:              ops\nResource                Used          Hard\n--------                ----          ----\nlimits.cpu              77250m        80\nlimits.memory           124814367488  150Gi\npods                    31            45\nrequests.cpu            53850m        80\nrequests.memory         75613234944   150Gi\nservices                26            50\nservices.loadbalancers  0             0\nservices.nodeports      0             0<\/code><\/pre>\n<p>Som framg\u00e5r av beskrivningen <code>resourcequotas<\/code>, om teamet ops vill distribuera pods som kommer att konsumera ytterligare 10 cpu, s\u00e5 kommer schemal\u00e4ggaren inte att till\u00e5ta detta och ge ett felmeddelande:<\/p>\n<pre><code>Error creating: pods \"nginx-proxy-9967d8d78-nh4fs\" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10<\/code><\/pre>\n<p>F\u00f6r att l\u00f6sa en s\u00e5dan uppgift kan man skriva ett verktyg, till exempel som <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">det h\u00e4r<\/a><\/noindex>, som kan lagra och commita tillst\u00e5ndet f\u00f6r resurserna i teamen.<\/p>\n<h2>2. V\u00e4lj ett optimalt filsystem<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>H\u00e4r skulle jag vilja ta upp \u00e4mnet om persistenta volymer och lagringssystemet p\u00e5 worker-noder i Kubernetes. Jag hoppas att ingen anv\u00e4nder \"Kuben\" p\u00e5 HDD i produktion, men ibland \u00e4r \u00e4ven en vanlig SSD f\u00f6r lite. Vi har st\u00f6tt p\u00e5 s\u00e5dana problem d\u00e4r loggarna d\u00f6dade disken p\u00e5 grund av in- och utdataoperationer, och h\u00e4r finns det inte s\u00e5 m\u00e5nga l\u00f6sningar: <\/p>\n<ul>\n<li>\n<p>Anv\u00e4nd h\u00f6gpresterande SSD eller \u00f6verg\u00e5 till NVMe (om du sj\u00e4lv ansvarar f\u00f6r din h\u00e5rdvara).<\/p>\n<\/li>\n<li>\n<p>Minska loggniv\u00e5n.<\/p>\n<\/li>\n<li>\n<p>G\u00f6r en \"smart\" belastningsbalansering av pods som sliter p\u00e5 disken (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>Sk\u00e4rmen ovan visar vad som h\u00e4nder med nginx-ingress-controller och disken n\u00e4r loggningen av access_logs \u00e4r aktiverad (~12 000 loggar\/sek.). Detta tillst\u00e5nd kan sj\u00e4lvklart leda till f\u00f6rs\u00e4mring av alla applikationer p\u00e5 denna nod.<\/p>\n<p>N\u00e4r det g\u00e4ller PV har jag tyv\u00e4rr inte testat alla <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">typer<\/a><\/noindex> Best\u00e4ndiga volymer. Anv\u00e4nd det b\u00e4sta alternativet som passar just dig. Historiskt sett har vi haft en liten del av tj\u00e4nsterna som beh\u00f6ver RWX-volymer, och l\u00e4nge har NFS-lagring anv\u00e4nts f\u00f6r detta \u00e4ndam\u00e5l. Billigt och\u2026 tillr\u00e4ckligt. Sj\u00e4lvklart har vi f\u00e5tt utst\u00e5 en del problem \u2014 men vi har l\u00e4rt oss att optimera det, och nu slipper vi huvudv\u00e4rk. Om m\u00f6jligt, \u00f6verg\u00e5 till objektlagring S3.<\/p>\n<h2>3. Samla optimerade bilder<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Det \u00e4r b\u00e4st att anv\u00e4nda bilder som \u00e4r optimerade f\u00f6r containrar, s\u00e5 att Kubernetes kan h\u00e4mta dem snabbare och k\u00f6ra dem effektivare.&nbsp;<\/p>\n<p>Optimering inneb\u00e4r att bilder:<\/p>\n<ul>\n<li>\n<p>inneh\u00e5ller endast en applikation eller utf\u00f6r endast en funktion;<\/p>\n<\/li>\n<li>\n<p>\u00e4r sm\u00e5 i storlek, eftersom stora bilder s\u00e4mre \u00f6verf\u00f6rs \u00f6ver n\u00e4tverket;<\/p>\n<\/li>\n<li>\n<p>har slutpunkter f\u00f6r h\u00e4lsokontroll och beredskap, som Kubernetes kan anv\u00e4nda f\u00f6r att vidta \u00e5tg\u00e4rder vid driftsstopp;<\/p>\n<\/li>\n<li>\n<p>anv\u00e4nder containerv\u00e4nliga operativsystem (som Alpine eller CoreOS), som \u00e4r mer motst\u00e5ndskraftiga mot konfigurationsfel;<\/p>\n<\/li>\n<li>\n<p>anv\u00e4nder flertrinsbyggen s\u00e5 att du endast kan distribuera kompilerade applikationer, inte tillh\u00f6rande k\u00e4llkoder.<\/p>\n<\/li>\n<\/ul>\n<p>Det finns m\u00e5nga verktyg och tj\u00e4nster som kan kontrollera och optimera bilder i realtid. Det \u00e4r viktigt att alltid h\u00e5lla dem uppdaterade och verifierade f\u00f6r s\u00e4kerhet. I slut\u00e4ndan f\u00e5r du: <\/p>\n<ol>\n<li>\n<p>Minskad n\u00e4tverksbelastning p\u00e5 hela klustret.<\/p>\n<\/li>\n<li>\n<p>F\u00f6rkortad starttid f\u00f6r containrar.<\/p>\n<\/li>\n<li>\n<p>Mindre storlek p\u00e5 hela din Docker-registry.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Anv\u00e4nd DNS-cache<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u00e4r vi pratar om h\u00f6g belastning \u00e4r det ganska pl\u00e5gsamt att leva utan finjustering av klustrets DNS-system. F\u00f6r l\u00e4nge sedan st\u00f6dde Kubernetes-utvecklarna sin egen l\u00f6sning kube-dns. Den implementerades \u00e4ven hos oss, men mjukvaran fick ingen finjustering och visade inte den prestanda vi beh\u00f6vde, \u00e4ven om uppgiften verkade enkel. Sedan kom coredns, som vi \u00f6vergick till och som fungerade utm\u00e4rkt, och blev senare standard DNS-tj\u00e4nsten i K8s. Vid en tidpunkt n\u00e5dde vi 40 000 rps till DNS-systemet, och den l\u00f6sningen blev ocks\u00e5 otillr\u00e4cklig. Men av en lycklig slump kom Nodelocaldns, \u00e4ven k\u00e4nd som node local cache, \u00e4ven kallad <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>Varf\u00f6r anv\u00e4nder vi detta? Det finns en bugg i Linux-k\u00e4rnan som vid flera anrop genom conntrack NAT via UDP leder till en race condition f\u00f6r skrivning i conntrack-tabellerna, och en del trafik genom NAT g\u00e5r f\u00f6rlorad (varje anrop via Service inneb\u00e4r NAT). Nodelocaldns l\u00f6ser detta problem genom att eliminera NAT och uppgradera anslutningen till TCP mot upstream DNS, samt lokalt cachande av DNS-f\u00f6rfr\u00e5gningar mot upstream (inklusive en kort negativ cache p\u00e5 5 sekunder).<\/p>\n<h2>5. Skala poddar horisontellt och vertikalt automatiskt<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Kan du med s\u00e4kerhet s\u00e4ga att alla dina mikrotj\u00e4nster \u00e4r redo f\u00f6r en tv\u00e5- till trefaldig \u00f6kning av belastningen? Hur ska resurser f\u00f6rdelas till dina applikationer? Att ha ett par poddar ig\u00e5ng \u00f6ver arbetsbelastningen kan visa sig vara \u00f6verfl\u00f6digt, medan att k\u00f6ra alldeles f\u00f6r n\u00e4ra gr\u00e4nsen riskerar att orsaka stillest\u00e5nd vid en pl\u00f6tslig \u00f6kning av trafik till tj\u00e4nsten. Den gyllene medelv\u00e4gen n\u00e5s med hj\u00e4lp av f\u00f6rm\u00e5gan att skala s\u00e5dana tj\u00e4nster som <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/autoscaler\/tree\/master\/vertical-pod-autoscaler\">Vertical Pod Autoscaler<\/a><\/noindex>. <\/p>\n<p><strong>VPA<\/strong> m\u00f6jligg\u00f6r att automatiskt justera requests\/limits f\u00f6r dina containrar i en pod baserat p\u00e5 faktisk anv\u00e4ndning. Hur kan det vara anv\u00e4ndbart? Om du har poddar som av n\u00e5gon anledning inte kan skalas horisontellt (vilket inte \u00e4r helt tillf\u00f6rlitligt), kan du prova att l\u00e5ta VPA justera dess resurser. Dess funktion \u00e4r ett rekommendationssystem baserat p\u00e5 historiska och aktuella data fr\u00e5n metric-server, s\u00e5 om du inte vill \u00e4ndra requests\/limits automatiskt, kan du helt enkelt \u00f6vervaka de rekommenderade resurserna f\u00f6r dina containrar och optimera inst\u00e4llningarna f\u00f6r att spara processor- och minnesanv\u00e4ndning i klustret. <\/p>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>Bild tagen fr\u00e5n https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Schemal\u00e4ggaren i Kubernetes baseras alltid p\u00e5 requests. Vilket v\u00e4rde du \u00e4n anger d\u00e4r, kommer schemal\u00e4ggaren att s\u00f6ka efter en l\u00e4mplig nod baserat p\u00e5 det. V\u00e4rdena f\u00f6r limits beh\u00f6vs av kubelet f\u00f6r att f\u00f6rst\u00e5 n\u00e4r den ska begr\u00e4nsa eller d\u00f6da en pod. Och eftersom den enda viktiga parametern \u00e4r v\u00e4rdet f\u00f6r requests, kommer VPA att arbeta med detta. Varje g\u00e5ng du st\u00e4ller in vertikal skalning av applikationen definierar du vilka requests som ska g\u00e4lla. Men vad h\u00e4nder d\u00e5 med limits? Detta parameter kommer ocks\u00e5 att skalas proportionellt.<\/p>\n<p>Till exempel, h\u00e4r \u00e4r vanliga inst\u00e4llningar f\u00f6r en pod:<\/p>\n<pre><code>resurser:\n   beg\u00e4rningar:\n     minne: 250Mi\n     cpu: 200m\n   gr\u00e4nser:\n     minne: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>Rekommendationssystemet best\u00e4mmer att din applikation beh\u00f6ver 300m CPU och 500Mi f\u00f6r att fungera normalt. Du f\u00e5r f\u00f6ljande inst\u00e4llningar:<\/p>\n<pre><code>resurser:\n   beg\u00e4rningar:\n     minne: 500Mi\n     cpu: 300m\n   gr\u00e4nser:\n     minne: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Som n\u00e4mnts ovan \u00e4r detta proportionell skalning baserat p\u00e5 f\u00f6rh\u00e5llandet mellan beg\u00e4rningar\/gr\u00e4nser i manifestet:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: f\u00f6rh\u00e5llande 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Minne: 250Mi \u2192 500Mi: f\u00f6rh\u00e5llande 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>N\u00e4r det g\u00e4ller <strong>HPA<\/strong>, \u00e4r mekanismen h\u00e4r tydligare. Tr\u00f6skelv\u00e4rden f\u00f6r metrik, som CPU och minne, st\u00e4lls in, och om det genomsnittliga v\u00e4rdet f\u00f6r alla repliker \u00f6verstiger tr\u00f6skeln, skalas applikationen upp med +1 podd tills v\u00e4rdet sjunker under tr\u00f6skeln eller det maximala antalet repliker uppn\u00e5s.<\/p>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>Bild tagen fr\u00e5n https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Ut\u00f6ver vanliga metrik som CPU och minne kan du st\u00e4lla in tr\u00f6sklar f\u00f6r dina egna anpassade metrik fr\u00e5n Prometheus och arbeta med dem om du anser att det \u00e4r den mest precisa definieringen av n\u00e4r du b\u00f6r skala din applikation. N\u00e4r applikationen stabiliseras under den angivna gr\u00e4nsen f\u00f6r metrik, kommer HPA att b\u00f6rja skala ner poddar till det minimala antalet repliker eller tills lasten uppfyller den angivna tr\u00f6skeln.<\/p>\n<h2>6. Gl\u00f6m inte Node Affinity och Pod Affinity<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Inte alla noder arbetar med samma h\u00e5rdvara, och inte alla poddar beh\u00f6ver k\u00f6ra applikationer som kr\u00e4ver intensiva ber\u00e4kningar. Kubernetes till\u00e5ter specialisering av noder och poddar med hj\u00e4lp av <strong>Node Affinity<\/strong> och <strong>Pod Affinity<\/strong>.<\/p>\n<p>Om du har noder som \u00e4r l\u00e4mpade f\u00f6r ber\u00e4kningstunga operationer, \u00e4r det b\u00e4st att knyta applikationerna till dessa noder f\u00f6r maximal effektivitet. Anv\u00e4nd <code>nodeSelector<\/code> med nodens m\u00e4rkning.<\/p>\n<p>Anta att du har tv\u00e5 noder: en med <code>CPUType=HIGHFREQ<\/code> och m\u00e5nga snabba k\u00e4rnor, och den andra med <code>MemoryType=HIGHMEMORY<\/code> mycket minne och h\u00f6gre prestanda. Det enklaste s\u00e4ttet \u00e4r att tilldela distributionen av podden till noden <code>HIGHFREQ<\/code>, genom att l\u00e4gga till denna selektor i <code>spec<\/code> :<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Ett mer kostsamt och specifikt s\u00e4tt att g\u00f6ra detta \u00e4r att anv\u00e4nda <code>nodeAffinity<\/code> i f\u00e4ltet <code>affinity<\/code> i sektionen <code>spec<\/code>. Det finns tv\u00e5 alternativ:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: strikt konfiguration (planeraren kommer att distribuera poddar endast p\u00e5 specifika noder (och ingen annanstans));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: mjuk konfiguration (planeraren kommer att f\u00f6rs\u00f6ka distribuera p\u00e5 specifika noder, och om det misslyckas kommer den att f\u00f6rs\u00f6ka distribuera p\u00e5 den n\u00e4sta tillg\u00e4ngliga noden).<\/p>\n<\/li>\n<\/ul>\n<p>Du kan ange en specifik syntax f\u00f6r nodernas etikettkontroll, till exempel, <code>In<\/code>, <code>NotIn<\/code>, <code>Exists<\/code>, <code>DoesNotExist<\/code>, <code>Gt<\/code> eller <code>Lt<\/code>. Men kom ih\u00e5g att komplexa metoder i l\u00e5nga listor med etiketter kan f\u00f6rdr\u00f6ja beslutsfattandet i kritiska situationer. Med andra ord, g\u00f6r det inte mer komplicerat.<\/p>\n<p>Som n\u00e4mnts ovan till\u00e5ter Kubernetes att ange bindning av nuvarande pods. Det vill s\u00e4ga att du kan g\u00f6ra s\u00e5 att vissa pods arbetar tillsammans med andra pods i samma tillg\u00e4nglighetszon (relevant f\u00f6r molntj\u00e4nster) eller noder.<\/p>\n<p>I <code>podAffinity<\/code> f\u00e4lt <code>affinity<\/code> i sektionen <code>spec<\/code> \u00e4r desamma som vid <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>och <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. Den enda skillnaden \u00e4r att <code>matchExpressions<\/code> binder pods till noder d\u00e4r en pod med s\u00e5dan etikett redan k\u00f6rs.<\/p>\n<p>Dessutom erbjuder Kubernetes ett f\u00e4lt <code>podAntiAffinity<\/code>, vilket \u00e5 sin sida inte binder en pod till en nod med specifika pods.<\/p>\n<p>N\u00e4r det g\u00e4ller uttryck <code>nodeAffinity<\/code> kan samma r\u00e5d ges: f\u00f6rs\u00f6k att h\u00e5lla reglerna enkla och logiska, f\u00f6rs\u00f6k inte \u00f6verbelasta pod-dokumentationen med en komplicerad upps\u00e4ttning regler. Det \u00e4r mycket l\u00e4tt att skapa en regel som inte kommer att uppfylla klustrets villkor, vilket skapar on\u00f6dig belastning p\u00e5 planeraren och minskar den totala prestandan.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Det finns ocks\u00e5 ett annat s\u00e4tt att hantera planeraren. Om du har ett stort kluster med hundratals noder och tusentals mikrotj\u00e4nster, \u00e4r det mycket sv\u00e5rt att f\u00f6rhindra vissa pods fr\u00e5n att placeras p\u00e5 vissa noder.<\/p>\n<p>Detta underl\u00e4ttas av mekanismen taints \u2014 f\u00f6rbud regler. Till exempel kan man i vissa scenarier f\u00f6rbjuda vissa noder att k\u00f6ra pods p\u00e5 sig. F\u00f6r att till\u00e4mpa en taint p\u00e5 en viss nod b\u00f6r du anv\u00e4nda alternativet <code>taint<\/code> i kubectl. Ange nyckel och v\u00e4rde, och sedan taint som <code>NoSchedule<\/code> eller <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Det \u00e4r ocks\u00e5 v\u00e4rt att notera att taint-mekanismen st\u00f6der tre grundl\u00e4ggande effekter: <code>NoSchedule<\/code>, <code>NoExecute<\/code> och <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>betyder att s\u00e5 l\u00e4nge det inte finns n\u00e5gon motsvarande post i pod-specifikationen <code>tolerations<\/code>, kan den inte distribueras p\u00e5 noden (i detta exempel <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 en f\u00f6renklad version <code>NoSchedule<\/code>. I detta fall kommer planeraren att f\u00f6rs\u00f6ka undvika att distribuera pods utan motsvarande post <code>tolerations<\/code> till noden, men detta \u00e4r ingen strikt begr\u00e4nsning. Om det inte finns n\u00e5gra resurser i klustret, kommer pods att b\u00f6rja distribueras p\u00e5 denna nod.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 denna effekt utl\u00f6ser omedelbar evakuering av pods som inte har n\u00e5gon motsvarande post <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Intressant nog kan s\u00e5dant beteende \u00e5ngras med hj\u00e4lp av toleranser. Detta \u00e4r anv\u00e4ndbart n\u00e4r det finns en \"f\u00f6rbjuden\" nod och du beh\u00f6ver placera enbart infrastrukturtj\u00e4nster p\u00e5 den. Hur g\u00f6r man detta? Till\u00e5t endast de pods f\u00f6r vilka det finns en l\u00e4mplig tolerans.<\/p>\n<p>S\u00e5 h\u00e4r kommer pod-specifikationen att se ut:<\/p>\n<pre><code>spec:\n   tolerations:\n     - key: \"node-role.kubernetes.io\\\/ingress\"\n        operator: \"Equal\"\n        value: \"true\"\n        effect: \"NoSchedule\"<\/code><\/pre>\n<p>Detta betyder inte att vid n\u00e4sta redeployment kommer podden att g\u00e5 p\u00e5 just denna nod, det \u00e4r inte mekanismen f\u00f6r Node Affinity och <code>nodeSelector<\/code>. Men genom att kombinera flera funktioner kan du uppn\u00e5 en mycket flexibel konfiguration av schemal\u00e4ggaren.<\/p>\n<h2>8. St\u00e4ll in prioritet f\u00f6r distribution av pods<\/h2>\n<p>Det faktum att du har konfigurerat bindning av pods till noder betyder inte att alla pods ska behandlas med samma prioritet. Till exempel kan du vilja distribuera vissa pods tidigare \u00e4n andra.<\/p>\n<p>Kubernetes erbjuder olika s\u00e4tt att konfigurera prioriteringar f\u00f6r pods (Pod Priority and Preemption). Konfigurationen best\u00e5r av flera delar: objektet <code>PriorityClass<\/code><strong> <\/strong>och beskrivningen av f\u00e4ltet <code>priorityClassName<\/code><strong> <\/strong>i pod-specifikationen. L\u00e5t oss titta p\u00e5 ett exempel:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Denna prioritetsklass b\u00f6r endast anv\u00e4ndas f\u00f6r mycket viktiga pods\"<\/code><\/pre>\n<p>Vi skapar <code>PriorityClass<\/code>, ger den ett namn, en beskrivning och ett v\u00e4rde.<strong> <\/strong>Ju h\u00f6gre <code>value<\/code>, desto h\u00f6gre prioritet. V\u00e4rdet kan vara vilket 32-bit heltal som helst, mindre eller lika med 1 000 000 000. H\u00f6gre v\u00e4rden \u00e4r reserverade f\u00f6r kritiskt viktiga system-pods som vanligtvis inte kan bli avvisade.<strong> <\/strong>Avvisning kommer att ske endast om den h\u00f6gprioriterade podden inte har n\u00e5gonstans att distribuera, d\u00e5 kommer vissa pods fr\u00e5n en viss nod att evakueras. Om detta mekanism \u00e4r f\u00f6r str\u00e4ng kan du l\u00e4gga till alternativet <code>preemptionPolicy: Never<\/code>, och d\u00e5 blir det ingen avvisning, podden kommer att st\u00e5 f\u00f6rst i k\u00f6n och v\u00e4nta p\u00e5 att schemal\u00e4ggaren hittar lediga resurser f\u00f6r den.<\/p>\n<p>D\u00e4refter skapar vi en pod d\u00e4r vi anger namnet <code>priorityClassName<\/code>:<\/p>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: static-web\n  labels:\n    role: myrole\n spec:\n  containers:\n    - name: web\n      image: nginx\n      ports:\n        - name: web\n          containerPort: 80\n          protocol: TCP\n  priorityClassName: high-priority\n          <\/code><\/pre>\n<p>Du kan skapa hur m\u00e5nga prioritetsklasser som helst, men det rekommenderas att man inte \u00f6verdriver (l\u00e5t oss s\u00e4ga, begr\u00e4nsa sig till l\u00e5g, medelh\u00f6g och h\u00f6g prioritet). <\/p>\n<p>P\u00e5 s\u00e5 s\u00e4tt kan du, om det beh\u00f6vs, \u00f6ka effektiviteten i distribueringsassistenter f\u00f6r kritiska tj\u00e4nster som nginx-ingress-controller, coredns osv.<\/p>\n<h2>9. Optimera ETCD-klustret<\/h2>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD kan beskrivas som hj\u00e4rnan i hela klustret. Det \u00e4r mycket viktigt att h\u00e5lla denna databas p\u00e5 h\u00f6g niv\u00e5, eftersom hastigheten p\u00e5 operationerna i \"Kub\" beror p\u00e5 den. Ett ganska standard och samtidigt bra alternativ \u00e4r att h\u00e5lla ETCD-klustret p\u00e5 master-noder f\u00f6r att f\u00e5 minimal f\u00f6rdr\u00f6jning till kube-apiserver. Om det inte \u00e4r m\u00f6jligt, placera ETCD s\u00e5 n\u00e4ra som m\u00f6jligt, med bra bandbredd mellan deltagarna. T\u00e4nk ocks\u00e5 p\u00e5 hur m\u00e5nga noder av ETCD som kan falla bort utan att skada klustret.<\/p>\n<p><img decoding=\"async\" alt=\"Nio tips f\u00f6r att \u00f6ka Kubernetes-prestanda\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>T\u00e4nk p\u00e5 att en \u00f6verdriven \u00f6kning av antalet deltagare i klustret kan f\u00f6rb\u00e4ttra tillg\u00e4ngligheten p\u00e5 bekostnad av prestanda; allt b\u00f6r vara i balans.<\/p>\n<p>N\u00e4r det g\u00e4ller att konfigurera tj\u00e4nsten finns det inte s\u00e5 m\u00e5nga rekommendationer:<\/p>\n<ol>\n<li>\n<p>Ha bra h\u00e5rdvara, baserat p\u00e5 klustrets storlek (du kan l\u00e4sa mer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Finjustera n\u00e5gra parametrar, om du har spridit klustret \u00f6ver ett par datacenter eller om ditt n\u00e4tverk och dina diskar l\u00e4mnar mycket att \u00f6nska (du kan l\u00e4sa mer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Slutsats<\/h2>\n<p>I den h\u00e4r artikeln beskrivs punkterna som v\u00e5rt team f\u00f6rs\u00f6ker f\u00f6lja. Det h\u00e4r \u00e4r inte en steg-f\u00f6r-steg-beskrivning av \u00e5tg\u00e4rder, utan alternativ som kan vara anv\u00e4ndbara f\u00f6r att optimera kostnaderna f\u00f6r klustret. Det \u00e4r klart att varje kluster \u00e4r unikt och inst\u00e4llningarna kan variera mycket, s\u00e5 det skulle vara intressant att f\u00e5 din feedback: hur \u00f6vervakar du ditt Kubernetes-kluster och hur f\u00f6rb\u00e4ttrar du dess prestanda? Dela med dig av din erfarenhet i kommentarerna, det skulle vara intressant att h\u00f6ra. <\/p>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/520968\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0421\u0438\u0434\u043e\u0440\u0435\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u00ab\u041a\u0443\u0431\u0438\u043a\u00bb \u0432 \u043f\u0440\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u0432\u0435\u0434\u0430\u044e \u0432\u0430\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u00ab\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb Kubernetes \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Ready steady [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97983,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97982","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-23T12:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Nio tips f\u00f6r att f\u00f6rb\u00e4ttra prestandan i Kubernetes | ProHoster","description":"Hej alla!","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-23T12:42:15+00:00","article:modified_time":"2020-11-17T22:58:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97982","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:08:27","updated":"2022-09-30 17:30:03","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/97982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}