Kubernetes, noto anche come K8s, è un sistema di orchestrazione open-source per automatizzare la distribuzione, la scalabilità e la gestione di applicazioni containerizzate. La sua portabilità, flessibilità e capacità di scalabilità automatica lo rendono un sistema ampiamente utilizzato. Tra tutte le caratteristiche di spicco, l'opzione di creare record DNS per servizi e pod lo rende imbattibile rispetto ad altri sistemi software. Il servizio DNS di Kubernetes consente di contattare i servizi con nomi DNS coerenti invece di indirizzi IP.
Prerequisiti
Per ottenere il massimo da questo tutorial e comprendere meglio il servizio DNS di Kubernetes, assicurati di rispolverare le basi di Kubernetes. Ti sarà utile anche leggere la Panoramica di terminologie, componenti e concetti DNS per comprendere meglio i concetti DNS. Inoltre, una panoramica dell'ecosistema Docker e le basi della tecnologia di containerizzazione rappresenteranno un grande vantaggio.
Cos'è un sistema DNS?
Il Domain Name System (DNS) è un meccanismo per collegare vari tipi di informazioni a nomi facili da ricordare, come gli indirizzi IP. L'uso di un sistema DNS per tradurre i nomi delle richieste in indirizzi IP consente agli utenti finali di raggiungere facilmente il nome di dominio di destinazione. La maggior parte dei cluster Kubernetes include un servizio DNS interno configurato per impostazione predefinita per offrire un approccio leggero per il service discovery. Anche quando i pod e i servizi vengono creati, eliminati o spostati tra i nodi, il service discovery integrato semplifica l'identificazione e la comunicazione delle applicazioni con i cluster Kubernetes.
Nelle versioni recenti di Kubernetes, le specifiche tecniche del servizio DNS di Kubernetes sono cambiate. Questo tutorial si propone di introdurre sia l’implementazione kube-dns che CoreDNS del servizio DNS di Kubernetes. Analizzeremo in dettaglio i record DNS di Kubernetes e dimostreremo come funziona il DNS di Kubernetes.
Cosa include il servizio DNS di Kubernetes?
In precedenza, prima del rilascio della versione 1.11, il servizio DNS di Kubernetes si basava su kube-dns. Tuttavia, la sicurezza e la privacy rappresentavano ancora una seria preoccupazione. Successivamente, la community di Kubernetes ha introdotto CoreDNS nella nuova versione 1.11 per risolvere i problemi di sicurezza e stabilità di kube-dns.
Indipendentemente dalla versione del software utilizzata per gestire i record DNS, kube-dns e CoreDNS funzionano in modo simile:
- Vengono creati un servizio kube-dns e uno o più pod.
- Il servizio kube-dns monitora l'API di Kubernetes per gli eventi relativi a servizi ed endpoint e modifica le sue voci DNS di conseguenza. Quando si modificano questi servizi Kubernetes e i relativi pod con operazioni di creazione, modifica o eliminazione, questi eventi vengono attivati automaticamente.
- Kubelet assegna l'IP del cluster del servizio kube-dns all'opzione etc/resolv.conf nameserver di ogni nuovo pod, insieme alle impostazioni di search appropriate per consentire hostname più brevi:
|
1 2 3 |
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5 |
-
Le applicazioni containerizzate possono quindi risolvere hostname come example-service.namespace all'indirizzo IP del cluster appropriato.
Una panoramica dei record DNS di Kubernetes
Cerchiamo di comprendere meglio i record DNS di Kubernetes con l’aiuto di un esempio. L’intero record DNS A per un servizio Kubernetes si presenterà così:
service.namespace.svc.cluster.local
Un pod avrebbe un record in questo formato, che rappresenterebbe l’indirizzo IP reale del pod:
10.32.0.125.namespace.pod.cluster.local
Inoltre, vengono creati record SRV per le porte specificate di un servizio Kubernetes:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
Di conseguenza, la tua applicazione o microservizio può raggiungere un hostname semplice e coerente per connettersi ad altri servizi o pod sul cluster, grazie al meccanismo integrato di service discovery basato su DNS.
Risoluzione di hostname più brevi e ricerca di domini
Non avrai sempre bisogno di utilizzare l’intero hostname per accedere a un altro servizio a causa dei suffissi del dominio di ricerca impostati nel resolv.conf file. Se stai contattando un servizio nello stesso namespace, puoi semplicemente chiamarlo con il suo nome:
|
1 |
other-service |
Aggiungi other-service alla query se il servizio si trova in un namespace diverso:
|
1 |
other-service.other-namespace |
Dovrai utilizzare almeno quanto segue se stai cercando di raggiungere un pod:
|
1 |
pod-ip.other-namespace.pod |
Solo i .svc suffissi vengono completati automaticamente nel file resolv.conf predefinito. Pertanto, è essenziale specificare le impostazioni fino a .pod. Successivamente, esaminiamo le complessità delle due implementazioni DNS alternative di Kubernetes che abbiamo appreso finora.
Implementazione DNS di Kubernetes
La versione 1.11 di Kubernetes ha fornito un nuovo software per gestire il servizio kube-dns , come menzionato nella sezione precedente. Il motivo principale alla base del nuovo aggiornamento era migliorare le prestazioni e la sicurezza del servizio. Iniziamo con l’integrazione kube-dns fin dall’inizio.
-
kube-dns
Nella precedente versione 1.11 di Kubernetes, il servizio kube-dns aveva tre container operativi in un pod kube-dns nel namespace kube-system . Dai un’occhiata ai tre container qui sotto:
- kube-dns: un container che esegue SkyDNS e funge da servizio di risoluzione delle query DNS.
- dnsmasq: le risposte di SkyDNS vengono memorizzate nella cache da dnsmasq, un comune resolver e cache DNS leggero.
- sidecar: un container a fianco del servizio che esegue il reporting delle metriche e reagisce ai controlli dello stato di salute.
CoreDNS è stato creato a seguito di vulnerabilità di sicurezza in Dnsmasq e problemi di prestazioni di scalabilità con SkyDNS.
-
CoreDNS
Come nuovo servizio DNS di Kubernetes, CoreDNS è stato aggiornato a General Availability in Kubernetes 1.11. Ciò implica che è pronto per la produzione e verrà utilizzato da molti strumenti di installazione e provider Kubernetes gestiti come servizio DNS predefinito del cluster.
CoreDNS è un server DNS flessibile ed estensibile che funge da cluster DNS di Kubernetes. Esegue tutte le funzionalità del sistema precedente. Un container DNS è responsabile della risoluzione e della memorizzazione nella cache delle query DNS. CoreDNS risponde ai controlli dello stato di salute e fornisce metriche in un unico container. Inoltre, risolve alcuni piccoli difetti e fornisce nuove funzionalità per risolvere problemi di prestazioni e sicurezza:
- Alcuni conflitti tra l'uso di stubDomains e servizi esterni sono stati risolti.
- Rendendo casuale l'ordine in cui vengono restituite alcune voci, CoreDNS può migliorare il bilanciamento del carico round-robin.
- Essendo più efficiente nell'iterare su ciascuno dei suffissi del dominio di ricerca definiti in resolv.conf, una funzionalità chiamata autopath può migliorare i tempi di risposta DNS durante la risoluzione di hostname esterni.
- Anche se il pod non esiste, kube-dns 10.32.0.125.namespace.pod.cluster.local risolverà sempre in 10.32.0.125. CoreDNS offre una modalità di convalida dei pod che risolverà solo se esiste un pod con l'indirizzo IP e il namespace corretti.
Per approfondire la tua conoscenza su Kubernetes endpoints, autopaths, e wildcards, consulta un tutorial su come Kubernetesconsente la lettura dei dati di zona dal suo cluster.
Funzionalità di personalizzazione
Kubernetes consente di configurare i pod DNS e personalizzare la risoluzione DNS del cluster, grazie al servizio di personalizzazione DNSGli amministratori possono sfruttare questi servizi per modificare i nameserver a monte o i suffissi del dominio di ricerca definiti in resolv.conf. Soprattutto, c'è una funzionalità aggiuntiva per personalizzare pod e container utilizzando l'opzione dnsConfig :

L’aggiornamento di questa configurazione forzerà la riscrittura del file resolv.conf di un pod, consentendo alle modifiche di avere effetto. La configurazione sopra descritta creerà un file contenente le righe nameserver 203.0.113.44 e search custom.dns.local , che si trasferiscono direttamente alle normali opzioni resolv.conf .
Conclusione
In questo tutorial, ti abbiamo guidato attraverso le basi del servizio DNS di Kubernetes e la sua implementazione in diverse versioni. Abbiamo anche discusso i record DNS di Kubernetes con l'aiuto di un esempio. Inoltre, abbiamo evidenziato alcune opzioni di configurazione aggiuntive per personalizzare i pod e risolvere le query DNS. Questo copre le basi del servizio DNS di Kubernetes, ma il tuo apprendimento non dovrebbe finire qui. Consulta la documentazione ufficiale di Kubernetes per approfondire l'argomento.
Per approfondire le tue conoscenze su DevOps ed esplorare gli elementi essenziali di Kubernetes, consulta i seguenti tutorial del nostro blog:
- Introduzione a Helm: Package Manager per Kubernetes
- Come installare e utilizzare Kubernetes su Ubuntu 20.04
- Distribuire un'applicazione PHP su un cluster Kubernetes con Ubuntu 18.04
Buon computing!
Commenti
Ancora nessun commento. Scrivi il primo.