Come accedere all'API del tuo cluster Kubernetes dall'interno dei tuoi pod

0
53

L'API Kubernetes è la tua strada per ispezionare e gestire le operazioni del tuo cluster. Puoi utilizzare l'API utilizzando la CLI Kubectl, strumenti come curl o le librerie di integrazione ufficiali per i linguaggi di programmazione più diffusi.

L'API è disponibile anche per le applicazioni all'interno del tuo cluster. I pod Kubernetes ottengono automaticamente l'accesso all'API e possono autenticarsi utilizzando un account di servizio fornito. Esegui le interazioni consumando le variabili di ambiente iniettate e i file di certificato per stabilire connessioni dal client di tua scelta.

Perché accedere all'API Kubernetes all'interno Baccelli?

Esistono diversi casi d'uso per l'accesso all'API in-pod. Questa tecnica consente alle applicazioni di ispezionare dinamicamente il proprio ambiente, applicare le modifiche Kubernetes e raccogliere metriche del piano di controllo che forniscono informazioni dettagliate sulle prestazioni.

Alcune organizzazioni sviluppano i propri strumenti attorno a Kubernetes. Potrebbero distribuire un'applicazione in-cluster speciale che utilizza l'API per esporre funzionalità aggiuntive. Operare dall'interno del cluster può essere più sicuro che effettuare chiamate API da uno script esterno poiché non è necessario aprire l'ambiente o condividere account di servizio e token di autenticazione.

Utilizzo delle librerie client API

Il metodo più semplice e consigliato per accedere all'API Kubernetes da un Pod consiste nell'utilizzare una libreria client. Sono disponibili opzioni completamente supportate per C, .NET, Go, Haskell, Java, JavaScript, Perl, Python e Ruby. Esistono soluzioni equivalenti mantenute dalla comunità per la maggior parte degli altri linguaggi di programmazione popolari.

Le librerie client hanno un supporto integrato per scoprire l'ambiente del cluster in cui sono in esecuzione. Ogni implementazione fornisce una funzione che puoi chiamare che configurerà la libreria per la connessione al server API corretto.

Qui& #8217;è un esempio di come elencare i Pod nel tuo cluster all'interno di un'applicazione Python:

from kubernetes import > client, config   config.load_incluster_config()   api = client.CoreV1Api()   # Esegui le interazioni API necessarie # pods = api.list_pod_for_all_namespaces()

Questo approccio è facile da usare e non richiede alcuna configurazione manuale. Tuttavia, a volte non sarai in grado di utilizzare una libreria client. In questi casi, è ancora possibile accedere manualmente all'API utilizzando l'account di servizio fornito da Kubernetes.

Esecuzione di interazioni manuali con l'API

< p>Per chiamare l'API devi sapere due cose: il nome host nel cluster su cui è esposto e il token dell'account di servizio che autenticherà il tuo Pod.

Il nome host dell'API è sempre kubernetes.default.svc. Il provider DNS Kubernetes risolverà questo nome nel server API del piano di controllo. In alternativa, puoi utilizzare la variabile di ambiente $KUBERNETES_SERVICE_HOST per scoprire l'indirizzo IP del server API:

$ echo $KUBERNETES_SERVICE_HOST 10.96.0.1

Le API sono disponibili solo su HTTPS. Puoi trovare il file dell'autorità di certificazione per il tuo cluster in /var/run/secrets/kubernetes.io/serviceaccount/ca.crt all'interno del tuo Pod. Kubernetes lo deposita nel filesystem ogni volta che viene creato un nuovo container.

Dovrai autenticarti per ottenere qualcosa di utile con l'API. Kubernetes crea un nuovo account di servizio per ogni Pod e fornisce il relativo token in /var/run/secrets/kubernetes.io/serviceaccount/token. Questo dovrebbe essere incluso in ogni richiesta HTTP come token di trasporto nell'intestazione di autorizzazione.

Mettendo tutto insieme, ecco un esempio di creazione di una richiesta API Kubernetes in-Pod di base utilizzando curl:

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Autorizzazione: Bearer $(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” } ]

Il server Kubernetes ha risposto con le versioni API disponibili. Ciò conferma che è stata effettuata una connessione riuscita utilizzando il nome host kubernetes.default.svc e l'account di servizio fornito.

Gestione RBAC

Sebbene una richiesta API sia stata effettuata correttamente, la maggior parte delle altre sarà off-limits se RBAC è abilitato per il tuo cluster. Gli account di servizio appena creati non ricevono automaticamente i ruoli, quindi il tuo Pod non sarà in grado di richiedere endpoint API protetti.

Puoi risolvere questo problema creando i tuoi oggetti ruolo e associandoli all'elenco account di servizio fornito ai tuoi Pod. Innanzitutto crea un nuovo ruolo:

apiVersion: rbac.authorization.k8s.io/v1 kind: Ruolo metadati: spazio dei nomi: default nome: < /strong>ruolo demo regole: – apiGroups: [""]risorse: ["baccelli" ] verbi: ["get", "list"& #93;

Applicalo al tuo cluster con Kubectl:

$ kubectl apply -f role.yaml

Quindi associa il ruolo all'account di servizio:

apiVersion: rbac.authorization.k8s.io/v1 tipo: RoleBinding metadati: spazio dei nomi: default nome: demo-role-binding soggetti: – gentile: ServiceAccount nome: default apiGroup: "" roleRef: gentile: Ruolo nome: demo-role apiGroup< /strong>: ""

L'account di servizio predefinito è selezionato come soggetto dell'associazione del ruolo. I pod vengono sempre forniti con questo account di servizio, con ambito allo spazio dei nomi in cui sono stati creati. In questo esempio, viene utilizzato lo spazio dei nomi predefinito, ma questo dovrebbe essere modificato negli oggetti Role e RoleBinding se il tuo Pod esiste in uno spazio dei nomi diverso.

Aggiungi RoleBinding al tuo cluster:

$ kubectl apply -f role-binding.yaml

Ora i tuoi Pod potranno ottenere ed elencare altri oggetti Pod nello spazio dei nomi predefinito. Puoi verificarlo effettuando una richiesta API all'endpoint Pods con spazio dei nomi:

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

I pod possono identificare il proprio spazio dei nomi leggendo il file /var/run/secrets/kubernetes.io/serviceaccount/namespace:

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

Questo fornisce un metodo conveniente per interpolare lo spazio dei nomi attivo negli URL degli endpoint:

$ curl –cacert /var/run/secrets /kubernetes.io/serviceaccount/ca.crt -H “Autorizzazione: Bearer $(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” … }

Scelta di un account di servizio diverso

Kubernetes fornisce automaticamente ai Pod l'account di servizio predefinito all'interno del loro spazio dei nomi. Puoi facoltativamente iniettare un account di servizio diverso impostando il campo spec.serviceAccountName sui tuoi Pod:

apiVersion: v1 tipo: Pod metadati: nome: demo spec: serviceAccountName: demo-sa < p>In questo esempio il Pod si autenticherà come token demo-sa. Puoi creare questo account di servizio manualmente e associarlo ai ruoli richiesti.

$ kubernetes create serviceaccount demo-sa

L'account di servizio dovrebbe esistere nello stesso spazio dei nomi del Pod.

Disattivazione del montaggio dell'account di servizio

L'inserimento automatico dell'account di servizio non è sempre auspicabile. Può essere un rischio per la sicurezza poiché una compromissione Pod riuscita offre l'accesso immediato all'API del tuo cluster Kubernetes. Puoi disabilitare i montaggi dei token dell'account di servizio con il campo manifest del pod spec.automountServiceAccountToken:

apiVersion: v1 tipo: Pod metadati:nome: demo spec: automountServiceAccountToken: falso

Kubernetes non ha inserito il file /var/run/secrets/kubernetes.io/serviceaccount/token. Ciò impedirà al Pod di autenticarsi all'API Kubernetes a meno che tu non fornisca manualmente le credenziali utilizzando un metodo diverso. Questo campo è supportato anche sugli oggetti account di servizio, rendendoli non idonei per il montaggio automatico in qualsiasi Pod.

Se utilizzi il montaggio dell'account di servizio, imposta criteri RBAC appropriati per limitare il token ai casi d'uso previsti . Evitare l'accesso con privilegi elevati ridurrà il rischio di danni nel caso in cui un utente malintenzionato dovesse accedere al tuo Pod.

Riepilogo

L'accesso al server API Kubernetes dall'interno del tuo cluster consente l'esecuzione le applicazioni controllano e modificano i carichi di lavoro vicini. Puoi aggiungere funzionalità extra senza aprire il tuo cluster all'accesso tramite API esterne.

Le librerie client ufficiali semplificano l'installazione e l'esecuzione, se sono adatte al tuo caso d'uso. In altre situazioni dovrai effettuare manualmente richieste a https://kubernetes.default.svc, fornendo il file dell'autorità di certificazione e il token dell'account di servizio che Kubernetes inietta nei contenitori Pod. Indipendentemente dall'approccio utilizzato, l'account di servizio deve essere configurato correttamente con le associazioni di ruolo RBAC in modo che il Pod abbia l'autorizzazione per eseguire le azioni previste.

LEGGI SUCCESSIVO

  • › La NASA e SpaceX vogliono dare una spinta al telescopio Hubble
  • › Che cos'è DLSS 3 e puoi usarlo su hardware esistente?
  • › Il nostro controller preferito per i giochi su PC costa oggi solo $ 45
  • › Spotify e Audible: qual è il migliore per gli audiolibri?
  • › Il concorrente RTX 3060 di Intel costa meno di $ 300
  • › Qual è il “Click of Death” in un HDD e cosa dovresti fare?