Installare Kubernetes in locale: mini guida pratica
Installazione di Kubernetes: mini guida dedicata all’installazione di Kubernetes in locale
Installare e dunque avviare Kubernetes in locale è il modo migliore per vedere e comprendere tutti i componenti di Kubernetes e come si integrano fra di loro.
Kubernetes funziona quasi ovunque, su diverse versioni di Linux e grazie a diversi servizi cloud (link articolo “Servizi Cloud Kubernetes”), la compatibilità di questo tool con i sistemi operativi utilizzati in tutto il mondo rappresenta uno dei veri punti di forza di questo strumento.
Se date un’occhiata al sito ufficiale di Kubernetes troverete una pagina della documentazione che riepiloga lo stato delle numerose combinazioni di distribuzione del sistema oltre a tutta una serie di guide introduttive che vi potranno dare alcuni spunti notevoli per una corretta installazione di Kubernetes in locale.
Detto questo, Kubernetes può essere distribuito in modalità autonoma, l’unica vera necessità è quella di avere Linux con Docker installato sulla propria macchina o su una virtual machine.
Prima di entrare nel dettaglio diamo una ripassata all’architettura di Kubernetes, vi tornerà utile nel prosieguo della lettura:
- Il master è il “piano di controllo” di Kubernetes e ha una serie di componenti a livello di cluster, incluso un server API che gli strumenti (ad esempio kubectl ) utilizzano per interagire con il cluster.
- Ogni nodo ha un servizio kubelet che riceve ordini dal master e un runtime del container (incluso ma non limitato a Docker) con cui si interfaccia per gestire le istanze del container. Vediamolo in azione e descriviamo ulteriormente questi componenti mentre li configuriamo.
Installazione Kubernetes in locale
Come descritto nella guida introduttiva, ci sono solo tre passaggi per ottenere un cluster autonomo attivo e funzionante, li vediamo insieme
Fase uno: eseguire etcd
docker run -d \
–net=host \
gcr.io/google_containers/etcd:2.0.9 \
/usr/local/bin/etcd \
–addr=127.0.0.1:4001 \
–bind-addr=0.0.0.0:4001 \
–data-dir=/var/etcd/data
Kubernetes utilizza etcd per archiviare in modo affidabile lo stato principale e la configurazione. I vari componenti master “osservano” questi dati e agiscono di conseguenza, ad esempio avviando un nuovo contenitore per mantenere un numero desiderato di repliche.
Fase due: eseguire il Master
docker run -d \
–net=host \
-v /var/run/docker.sock:/var/run/docker.sock \
jetstack/hyperkube:v0.20.1 \
/hyperkube kubelet \
–api_servers=http://localhost:8080 \
–v=2 \
–address=0.0.0.0 \
–enable_server \
–hostname_override=127.0.0.1 \
–config=/etc/kubernetes/manifests
Questo passaggio esegue un contenitore kubelet, che in questa distribuzione locale esegue a sua volta i componenti a livello di cluster che formano il “piano di controllo” principale di Kubernetes.
- Server API : fornisce l’API Kubernetes RESTful per gestire la configurazione del cluster, supportata dal datastore etcd.
- Scheduler : posiziona i pod sui nodi in base a regole (ad es. etichette). In questa fase, lo scheduler è semplice ma, come la maggior parte dei componenti in Kubernetes, è configurabile.
- Controller Manager : gestisce tutte le funzioni a livello di cluster, inclusa la creazione/aggiornamento degli endpoint, il rilevamento dei nodi, la gestione e il monitoraggio e la gestione dei pod.
Passaggio tre: eseguire il proxy di servizio
docker run -d \
–net=host \
–privileged \
jetstack/hyperkube:v0.20.1 \
/hyperkube proxy \
–master=http://127.0.0.1:8080 \
–v=2
Il proxy ( kube-proxy ) viene eseguito su ciascun nodo e fornisce un semplice proxy di rete e capacità di bilanciamento del carico. Questo proxy consente di esporre i servizi con un indirizzo di rete e un nome stabili.
A questo punto dovremmo avere un cluster Kubernetes eseguibile localmente. Per essere sicuri che tutto sia a posto, potete usare Docker ps per controllare le istanze del contenitore in esecuzione; dovrebbe essere simile a questo che vedete nell’immagine qui sotto (diverse colonne sono state omesse per brevità):
IMMAGINE |
COMANDO |
jetstack/hyperkube:v0.20.1 |
/hyperkube proxy |
jetstack/hyperkube:v0.20.1 |
/hyperkube scheduler |
jetstack/hyperkube:v0.20.1 |
/hyperkube apiserver |
jetstack/hyperkube:v0.20.1 |
/hyperkube controller |
gcr.io/google_containers/pause:0.8.0 |
/pause |
jetstack/hyperkube:v0.20.1 |
/hyperkube kubelet |
gcr.io/google_containers/etcd:2.0.9 |
/usr/local/bin/etcd |
tag alt = installazione Kubernetes
Per interagire con il cluster dobbiamo utilizzare lo strumento CLI di kubectl. Può essere scaricato pre-costruito direttamente da Google (nota 0.20.1 è l’ultima versione al momento della scrittura).
wget https://storage.googleapis.com/kubernetes-release/release/v0.20.1/bin/linux/amd64/kubectl
chmod u+x kubetctl
sudo mv kubectl /usr/local/bin/
Il modo più rapido per avviare un container nel cluster consiste nell’usare il comando kubectl run. Quindi, ad esempio, per avviare un container Nginx, potrete utilizzare il comando e fare riferimento al nome dell’immagine del contenitore.
kubectl run web –image=nginx
Sebbene ciò sia conveniente e adatto per la sperimentazione, le risorse come i pod vengono generalmente create utilizzando artefatti di configurazione che possono avere dei vantaggi dal fatto che possano essere versionati con GIT, quindi ad esempio facilitando i rollback.
Se si usa YAML (o JSON), viene dichiarato un pod e il suo stato desiderato; è compito poi di Kubernetes garantire che questo pod esista sempre in base a questa specifica fino a quando non viene eliminato.
Ecco un semplice esempio di configurazione di un pod per quel pod nginx (file nginx-pod.yml).
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
– name: nginx
image: nginx
Questo esegue la stessa immagine del container (nginx) di cui sopra, ma in questo caso la configurazione della risorsa specifica alcuni metadati aggiuntivi, ad esempio un’etichetta (coppia chiave/valore) che assegna a questo pod un’etichetta del tipo “app” di “web”.
kubectl create -f nginx-pod.yml
Kubernetes, in background, istruirà un nodo per estrarre l’immagine del contenitore avviando a sua volta il medesimo container.
A questo punto userete di nuovo kubectl pochi istanti dopo e dovresti essere in grado di vedere il pod nginx in esecuzione.
$ kubectl get pods
POD IP CONTAINER(S) IMAGE(S) HOST LABELS STATUS CREATED
web1 172.17.0.1 nginx nginx 127.0.0.1/127.0.0.1 app=web Running About a minute web1
Come richiesto, un contenitore Nginx è ora in esecuzione in un pod (web1-qtlc1 in questo caso) e gli è stato inoltre assegnato un indirizzo IP. In Kubernetes, a ogni pod viene assegnato un indirizzo IP da una rete interna e questo significa che i pod possono comunicare tra loro, peraltro, in questo caso abbiamo distribuito Kubernetes con Docker utilizzando la rete host (–net=host) e questi indirizzi IP saranno accessibili localmente.
Comments