Så här kommer du åt ditt Kubernetes-kluster API från dina poddar

0
95

Kubernetes API är din väg till att inspektera och hantera ditt kluster. Du kan använda API:t med Kubectl CLI, verktyg som curl eller de officiella integrationsbiblioteken för populära programmeringsspråk.

API:et är också tillgängligt för applikationer inom ditt kluster. Kubernetes Pods ges automatiskt åtkomst till API:et och kan autentiseras med ett tillhandahållet tjänstkonto. Du utför interaktioner genom att konsumera de injicerade miljövariablerna och certifikatfilerna för att göra anslutningar från den klient du väljer.

Varför få åtkomst till Kubernetes API inom Poddar?

Det finns flera användningsfall för in-Pod API-åtkomst. Den här tekniken gör det möjligt för applikationer att dynamiskt inspektera sin miljö, tillämpa Kubernetes-ändringar och samla in kontrollplansmått som ger prestandainsikter.

Vissa organisationer utvecklar sina egna verktyg kring Kubernetes. De kan distribuera en speciell klusterapplikation som använder API:et för att exponera ytterligare funktionalitet. Att arbeta inifrån klustret kan vara säkrare än att göra API-anrop från ett externt skript eftersom du inte behöver öppna upp din miljö eller dela tjänstekonton och autentiseringstoken.

Använda API-klientbiblioteken

Den enklaste och rekommenderade metoden för att komma åt Kubernetes API från en Pod är att använda ett klientbibliotek. Fullt stödda alternativ finns tillgängliga för C, .NET, Go, Haskell, Java, JavaScript, Perl, Python och Ruby. Det finns likvärdiga gemenskapsunderhållna lösningar för de flesta andra populära programmeringsspråk.

Klientbiblioteken har inbyggt stöd för att upptäcka klustermiljön de körs i. Varje implementering tillhandahåller en funktion som du kan anropa som konfigurerar biblioteket för att ansluta till rätt API-server.

Här& #8217;är ett exempel på hur du listar Pods i ditt kluster i en Python-applikation:

från kubernetes import klient, config   config.load_incluster_config()   api = klient.CoreV1Api()   # Utför nödvändiga API-interaktioner # pods = api.list_pod_for_all_namespaces()

Detta tillvägagångssätt är lätt att arbeta med och kräver ingen manuell konfiguration. Ibland kommer du dock inte att kunna använda ett klientbibliotek. I dessa fall är det fortfarande möjligt att manuellt få åtkomst till API:t med hjälp av tjänstkontot Kubernetes tillhandahåller.

Utföra manuella API-interaktioner

< p>För att anropa API:et behöver du veta två saker: värdnamnet i klustret det är exponerat på och tjänstekontotoken som kommer att autentisera din Pod.

API-värdnamnet är alltid kubernetes.default.svc. Kubernetes DNS-leverantör kommer att lösa detta namn till kontrollplanets API-server. Alternativt kan du använda miljövariabeln $KUBERNETES_SERVICE_HOST för att upptäcka API-serverns IP-adress:

$ echo $KUBERNETES_SERVICE_HOST 10.96.0.1

API:erna är endast tillgängliga över HTTPS. Du kan hitta certifikatutfärdarfilen för ditt kluster på /var/run/secrets/kubernetes.io/serviceaccount/ca.crt i din Pod. Kubernetes lägger in detta i filsystemet varje gång en ny behållare skapas.

Du måste autentisera för att uppnå något användbart med API:et. Kubernetes skapar ett nytt tjänstkonto för varje Pod och tillhandahåller dess token på /var/run/secrets/kubernetes.io/serviceaccount/token. Detta bör inkluderas med varje HTTP-begäran som en bärartoken i auktoriseringshuvudet.

Här är ett exempel på hur man gör en grundläggande Kubernetes API-begäran i Pod med curl:

. p>$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Auktorisering: Bärare $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https: //kubernetes.default.svc/api { “kind”: “APIVersions”, “versions”: [ “v1” ], “serverAddressByClientCIDRs”: [ { “clientCIDR”: “0.0.0.0/0”, “serverAddress”: “192.168.49.2:8443” } ]

Kubernetes-servern har svarat med de API-versioner som är tillgängliga. Detta bekräftar att en framgångsrik anslutning har gjorts med kubernetes.default.svc-värdnamnet och det tillhandahållna tjänstkontot.

Hantera RBAC

Även om en API-begäran har gjorts framgångsrikt, kommer de flesta andra att vara förbjudna om RBAC är aktiverat för ditt kluster. Nyskapade tjänstkonton får inte automatiskt roller så din Pod kommer inte att kunna begära skyddade API-slutpunkter.

Du kan lösa detta genom att skapa dina egna rollobjekt och binda dem till tjänstekonto som tillhandahålls till dina Pods. Skapa först en ny roll:

apiVersion: rbac.authorization.k8s.io/v1 typ: Rollmetadata: namnutrymme: standardnamn: < /strong>demo-rollregler: – apiGroups: [""]resurser: ["pods" ] verb: ["get", "lista"& #93;

Använd det på ditt kluster med Kubectl:

$ kubectl apply -f role.yaml

Bind sedan rollen till tjänstkontot:

apiVersion: rbac.authorization.k8s.io/v1 typ: RoleBinding metadata: namnutrymme strong>: standardnamn: demo-rollbindande ämnen: – snäll: ServiceAccount namn: standard apiGroup: "" rollRef:snäll: Roll namn: demo-roll apiGroup< /strong>: ""

Standardtjänstkontot är valt som rollbindningens ämne. Pods levereras alltid med det här tjänstekontot, omfattningen av namnutrymmet de skapades i. I det här exemplet används standardnamnutrymmet, men detta bör ändras på Role- och RoleBinding-objekten om din Pod finns i ett annat namnområde.

Lägg till RoleBinding i ditt kluster:

$ kubectl apply -f role-binding.yaml

Nu kommer dina Pods att tillåtas att hämta och lista andra Pod-objekt i standardnamnrymden. Du kan verifiera detta genom att göra en API-begäran till Pods-ändpunkten med namnavstånd:

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/namespaces/default/pods { “kind”: “PodList”, “apiVersion”: ” v1″ … }

Pods kan identifiera sitt eget namnområde genom att läsa filen /var/run/secrets/kubernetes.io/serviceaccount/namespace:

$ cat /var/run/secrets/kubernetes.io/serviceaccount/namespace default

Detta ger en bekväm metod för att interpolera den aktiva namnrymden till slutpunkts-URL:er:

$ curl –cacert /var/run/secrets /kubernetes.io/serviceaccount/ca.crt -H “Auktorisering: Bärare $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods { “kind”: “PodList”, “apiVersion”: “v1” … }

Att välja ett annat tjänstkonto

Kubernetes förser automatiskt Pods med standardtjänstkontot i deras namnområde. Du kan valfritt injicera ett annat tjänstkonto istället genom att ställa in fältet spec.serviceAccountName på dina Pods:

apiVersion: v1typ: Podmetadata: namn: demo spec: serviceAccountName: demo-sa < p>I det här exemplet kommer Podden att autentiseras som demo-sa-token. Du kan skapa detta tjänstekonto manuellt och binda det till de roller du behöver.

$ kubernetes create serviceaccount demo-sa

Tjänstekontot bör finnas i samma namnområde som Pod.

Opting Out of Service Kontomontering

Automatisk injektion av servicekonto är inte alltid önskvärt. Det kan vara en säkerhetsrisk eftersom en framgångsrik Pod-kompromiss ger omedelbar tillgång till ditt Kubernetes-kluster API. Du kan inaktivera servicekontotokenmontering med spec.automountServiceAccountToken Pod-manifestfältet:

apiVersion: v1 typ: Podmetadata:namn: demo spec: automountServiceAccountToken: falskt

Kubernetes kommer inte att injicera filen /var/run/secrets/kubernetes.io/serviceaccount/token. Detta kommer att förhindra att podden autentiseras till Kubernetes API om du inte manuellt anger autentiseringsuppgifter med en annan metod. Det här fältet stöds även på tjänstkontoobjekt, vilket gör dem inte kvalificerade för att automatiskt monteras i någon Pod.

Om du använder servicekontomontering, ställ in lämpliga RBAC-policyer för att begränsa token till dina avsedda användningsfall . Om du undviker högprivilegierad åtkomst minskar risken för skada om en angripare får åtkomst till din Pod.

Sammanfattning

När du kommer åt Kubernetes API-server från ditt kluster kan du köra applikationer inspekterar och modifierar närliggande arbetsbelastningar. Du kan lägga till extra funktionalitet utan att öppna ditt kluster för extern API-åtkomst.

De officiella klientbiblioteken gör det enkelt att komma igång, om de är lämpliga för ditt användningsfall. I andra situationer måste du manuellt göra förfrågningar till https://kubernetes.default.svc och tillhandahålla certifikatutfärdarens fil och tjänstkontotoken som Kubernetes injicerar i dina Pod-behållare. Oavsett vilket tillvägagångssätt du använder, måste tjänstekontot vara korrekt konfigurerat med RBAC-rollbindningar så att Poden har tillstånd att utföra sina avsedda åtgärder.

LÄS NÄSTA

  • › NASA och SpaceX vill ge Hubble-teleskopet en knuff
  • › Vad är DLSS 3 och kan du använda det på befintlig maskinvara?
  • › Vår favoritkontroll för PC-spel kostar bara $45 idag
  • › Spotify vs. Audible: Vilken är bättre för ljudböcker?
  • › Intel’s RTX 3060-konkurrent kostar mindre än $300
  • › Vad är “Click of Death” på en hårddisk, och vad ska du göra?