Kubernetes è una piattaforma open source per la gestione di applicazioni containerizzate su un cluster di macchine fisiche o virtuali. L'ispirazione originale per Kubernetes era il sistema Borg di Google. Borg è un sistema di gestione dei cluster che gestisce centinaia di migliaia di posti di lavoro e applicazioni attraverso enormi data center di Google. Kubernetes doveva essere una versione più amichevole del sistema di gestione dei cluster che tutti potevano usare.
La popolarità dei contenitori nel processo di sviluppo del software sta rendendo popolare anche Kubernetes. Nel vecchio processo di sviluppo del software, le applicazioni sono state distribuite su macchine host fisiche. Sviluppatori che lavorano su diversi componenti dell'applicazione necessari per mantenere un ambiente coeso. Il personale operativo e IT necessario per gestire attentamente eseguibili, configurazioni e librerie. Componenti diversi dell'applicazione potrebbero essere in conflitto durante il processo di integrazione. Inoltre, il processo era suscettibile agli errori umani e alle comunicazioni errate.
Le macchine virtuali (VM) hanno contribuito a portare un certo livello di affidabilità al processo. Ma era ancora difficile gestire le applicazioni. Inoltre, le VM sono costose da mantenere. I contenitori hanno cambiato il paesaggio. Con i contenitori, è stato possibile per gli sviluppatori che lavoravano su componenti diversi dello stesso software per mantenere ambienti separati. I contenitori sono leggeri, economici e veloci. Questi vantaggi hanno dato origine all'idea di sviluppare software utilizzando microservizi in cui ciascun contenitore serve un'attività specifica per l'applicazione.
Con l'ascesa dell'uso del contenitore, Kubernetes è diventato uno strumento efficace per pianificare ed eseguire applicazioni tra i cluster. Come piattaforma, può liberare gli sviluppatori dall'onere di trattare con qualsiasi tipo di macchina. Invece di progettare per infrastrutture incentrate sull'ospite con considerazioni di macchina fisica o virtuale, gli sviluppatori possono iniziare a progettare per l'infrastruttura incentrata sul contenitore. Kubernetes fornisce il livello di astrazione necessario.
Parte 1: concetti
I componenti principali sono i servizi di controllo per il cluster. Questi componenti gestiscono decisioni ed eventi globali. Qualsiasi nodo nel cluster può eseguirli. Tuttavia, assegnare nodi particolari a questi componenti è considerata buona pratica.
kube-apiserver
Kube-Apiserver serve l'API Kubernetes. L'API di Kubernetes implementa un'interfaccia riposante. Funziona come il ponte tra vari componenti di Kubernetes come baccelli, servizi, controller di replica e altri. È responsabile della coerenza della comunicazione tra il negozio ETCD e i contenitori distribuiti.
ecc
L'ETCD è responsabile della memorizzazione di tutti i dati del cluster Kubernetes. Il progetto ETCD è stato sviluppato dal team Coreos. È un negozio di valore chiave leggero e distribuito che utilizza API HTTP/JSON. I nodi nel cluster possono utilizzare i dati di configurazione dall'ETCD per scoprire i servizi e recuperare da stati non riusciti. A causa dell'importanza dei dati, eccd dovrebbe essere eseguito il backup corretto.
Kube-Controller-Manager
Kube-Controller-Manager gestisce vari controller per fornire servizi diversi. Ad esempio, i controller dei nodi recuperano nodi non riusciti e i controller di replica mantengono il numero corretto di pod. Ogni controller funziona come thread separato e dipende dalle informazioni ETCD per eseguire le proprie attività.
Cloud-Controller-Manager
Il Cloud-Controller-Manager fornisce controller specifici del cloud. Può essere disabilitato nel manager di Kube-Controller. Il Cloud-Controller-Manager è stato separato dal core per consentire al core Kubernetes di evolversi indipendentemente dal codice specifico del provider cloud. In passato, le dipendenze stavano causando problemi.
Kube-Scheduler
Kube-Scheduler è responsabile della distribuzione del carico di lavoro. Tiene traccia dei requisiti delle risorse e assegna nodi per pod di nuova creazione. Si occupa anche della qualità dei requisiti del servizio.
componenti aggiuntivi
I componenti aggiuntivi sono pod e servizi utilizzati per implementare le funzionalità del cluster. Gli utenti possono utilizzare il gestore aggiuntivo per creare e mantenere i componenti aggiuntivi. Alcuni componenti aggiuntivi importanti e utili sono DNS, interfaccia utente Web (dashboard), monitoraggio delle risorse del contenitore e registrazione a livello di cluster.
Una macchina da lavoratore a Kubernetes è chiamata nodo. I componenti del nodo sono presenti in ogni nodo e gestiscono diversi aspetti del carico di lavoro.
kubelet
Il servizio kubelet su ciascun nodo è l'agente principale. Tiene traccia dei pod assegnati al suo nodo tramite apiserver o file di configurazione locale. Comunica con i componenti principali per scoprire le richieste di lavoro e segnalare lo stato del suo nodo.
Kube-Proxy
Kube-Proxy è un piccolo servizio di proxy su ciascun nodo per gestire la sottorete dell'host individuale. Può eseguire bilanciamento del carico rudimentale per TCP e UDP.
Docker
Kubernetes dipende principalmente da Docker per eseguire contenitori. È in grado di creare applicazioni da immagini docker.
rkt
Kubernetes supporta anche contenitori RKT. Il supporto è attualmente sperimentale.
supervisore
Il supervisore può essere utilizzato per monitorare e controllare i kubelet e i contenitori Docker.
Fluentd
Il fluend è un deamon per fornire registrazione a livello di custer.
I carichi di lavoro di Kubernetes possono essere definiti come segue:
Baccelli
Un pod è un'unità fondamentale nel carico di lavoro di Kubernetes. I contenitori non sono assegnati individualmente agli host. Gruppi di contenitori, generalmente appartenenti a un'applicazione, sono rappresentati come un pod e il baccello viene quindi distribuito nell'host come una singola unità. Naturalmente, un baccello può contenere solo un contenitore. Questo è generalmente più comune in Kubernetes. Tuttavia, i contenitori sono raggruppati insieme in base alle esigenze di risorse e applicazioni. Il raggruppamento ha lo scopo di ottimizzare la condivisione delle risorse.
Controller
Controller come set di repliche, controller di replica, distribuzioni, set statali, raccolta dei rifiuti e lavori CRON aiutano a gestire i carichi di lavoro di Kubernetes. I controller di replica gestiscono il numero di pod. Si avvia e termina i baccelli per mantenere il numero corretto di baccelli in esecuzione. Il controller di distribuzione aiuta a cambiare i pod e gli oggetti di distribuzione per raggiungere lo stato di distribuzione desiderato.
Servizi
I baccelli di Kubernetes vengono creati e distrutti regolarmente. Quindi è difficile tenerne traccia attraverso gli indirizzi IP. La natura dinamica dei baccelli rende difficile per loro comunicare tra loro. Un servizio funziona come astrazione. Fornisce la politica per raggiungere un set logico di pod. In Kubernetes, un servizio è un oggetto di riposo. I servizi semplificano il design del contenitore.
Etichette
Le etichette sono un modo potente per tenere traccia e gestire gruppi di componenti di lavoro. Le etichette sono coppie di valore chiave che funzionano come tag arbitrari per aiutare a ottenere un controllo più fine su diverse funzioni del sistema.
Parte 2: progetto pratico
Minikube è un binario che imposta un singolo cluster Kubernetes su una macchina locale. In questo progetto, un nodo.L'applicazione JS verrà trasformata in un'immagine del contenitore Docker e l'immagine verrà eseguita su Minikube.
Installazione di minikube, kubectl, hypervisor, nodejs e docker
È possibile installare lo strumento riga di comando minikube e kubernetes kubectl su mac os x, linux e Windows con vari hypervisor. Le istruzioni per diversi sistemi operativi sono disponibili qui. Inoltre, avrai bisogno di nodejs installati sulla macchina per eseguire l'esempio dell'applicazione Helloworld. Puoi installare docker qui.
Avvio di un cluster
Utilizzare il seguente comando per avviare un cluster:
$ minikube Inizia a iniziare Kubernetes V1.7.5 cluster ... VM iniziale ... Scarica Minikube ISO 106.36 MB / 106.36 MB [=============================================].1.
Usa il comando qui sotto per vedere se il cluster è in esecuzione correttamente:
$ kubectl cluster-info kubernetes master è in esecuzione su https: // 192.168.99.100: 8443
Crea immagine dell'applicazione
Creiamo un server.File JS con il seguente contenuto:
var http = requisite ('http'); |
var handleRequest = function (richiesta, risposta) |
console.log ("richiesta ricevuta per l'URL:" + richiesta.URL); |
risposta.Writehead (200); |
risposta.End ('Hello World!'); |
; |
var www = http.CreateServer (HandleRequest); |
www.Ascolta (8080); |
Puoi eseguire il seguente comando:
$ node server.js
E controlla se il server è in esecuzione su http: // localhost: 8080. Dovresti vedere "Hello World!"Testo sulla pagina Web.
Converti in contenitore Docker
Nella stessa directory del server.JS Crea un file Dockerfile con il seguente testo:
Dal nodo: 6.9.2 |
Esporre 8080 |
Copia server.js . |
Server nodo CMD.js |
Dockerfile creerà un'immagine che inizierà dal nodo: 6.9.2 Immagine sull'hub Docker.
Vogliamo eseguire le immagini Docker a livello locale. Quindi il seguente comando dirà a Docker di utilizzare Minikube Deamon per per l'archiviazione delle immagini Docker:
$ eval $ (minikube Docker-env)
Puoi utilizzare Eval $ (minikube Docker -env -u) per cambiarlo in predefinito.
Ora costruiamo l'immagine Docker:
$ docker build -t my -node: v1 . Invio di un contesto di build a Docker Daemon 3.072kb Passaggio 1: dal nodo: 6.9.2 6.9.2: Pulling from library/node 75a822cd7888: Pull complete 57de64c72267: Pull complete 4306be1e8943: Pull complete 871436ab7225: Pull complete 0110c26a367a: Pull complete 1f04fe713f1b: Pull complete ac7c0b5fb553: Pull complete Digest: sha256:2e95be60faf429d6c97d928c762cb36f1940f4456ce4bd33fbdc34de94a5e043 Status: Downloaded newer image for node:6.9.2 ---> FAAADB4AAF9B Passaggio 2: Expose 8080 ---> Esecuzione in DA7D251B3FD5 ---> 881f9fb69b2c Rimozione del contenitore intermedio DA7D251B3FD5 Passaggio 3: copia server 3: copia server copia.js . ---> 0ACF61D9E75E Rimozione del contenitore intermedio 3A4025539CF6 Passaggio 4: Server nodo CMD.js ---> in esecuzione in 8aa9a4cbd723 ---> 41445e5c48fe Rimozione del contenitore intermedio 8aa9a4cbd723 costruito correttamente 41445e5c48fe
Distribuire nel cluster
Per distribuire My-Node: V1, eseguire il seguente comando:
$ kubectl esegui my-node --image = my-node: v1 --port = 8080 Deployment "My-Node" Creato
Creerà un baccello sul cluster. Possiamo controllare gli stati del pod con i seguenti comandi:
$ kubectl Ottieni il nome di distribuzioni Desiderato Desiderato Acquisito Età disponibile My-Node 1 1 1 1 34S
$ kubectl Ottieni il nome Pods Pronto Stato Riavvia My-Node-276881918-QTH5S 1/1 in esecuzione 0 1m
$ kubectl Ottieni eventi LastSeen FirstSeen Nome Nome tipo Subject Tipo Motivo Messaggio di origine 32M 32M 1 Minikube Nodo normale Avvia Kube-Proxy, Minikube Avvio di Kube-Proxy. 32m 32m 1 nodo minikube normale kubelet, minikube kubelet. 32m 32m 2 minikube Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk 32m 32m 2 minikube Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory 32m 32m 2 minikube Node Normal NodeHasNoDiskPressure kubelet, minikube Node minikube status is now: Nodo nodo normale nodo nodehasnodiskpressure 32m 1 minikube normale kubelet forzato, limite allocabile del nodo aggiornato minikube attraverso pods 32m 32m 1 minikube nodo normale nodo nodo nodi nodi nodi nodi nodi nodi nodi nodi kubeube normali -node node kubeube evento nodo minikube normali nodi nodi nodi normali -node nodi nodi nodi nodi nodi nodi normali -node node node node node node kubeube normali : Nodo node nodo Norme nodo NormalNode NormalNode Evento Minikube nodo NormalNode Minikube: nodo registrato Minikube in nodeController 5m 5m 1 Minikube Nodo normale iniziale Kubelet,Kubelet iniziale minikube. 5m 5m 1 minikube Node Normal NodeAllocatableEnforced kubelet, minikube Updated Node Allocatable limit across pods 5m 5m 1 minikube Node Normal NodeHasSufficientDisk kubelet, minikube Node minikube status is now: NodeHasSufficientDisk 5m 5m 1 minikube Node Normal NodeHasSufficientMemory kubelet, minikube Node minikube status is now: NodeHasSufficientMemory 5m 5m 1 nodo minikube normale Nodehasnodiskpressure kubelet, nodo minikube lo stato del minikube è ora: nodehasnodiskpressure 5m 5m 1 nodo minikube normale nodo normale kubelet kubelet kube kube kube è ora. 5m 5m 1 nodo minikube normale Kubelet nodeready, lo stato del nodo minikube minikube è ora: nodeready 2m 2m 1 my-node-276881918-qth5s pod normale programmata predefinito-my-my-my-my-node con successo assegnato My-node-27688191918-qth5s a minikube 2m 2m 1 my-node predefinito my-node 1-node predefinito assegnato con successo My-Node-276881918-QTH5S a minikube 2m 2m 1 my-node pianificato in modo predefinito my-node -276881918-qTH5S Pod normale riuscito MOUNTVolume Kubelet, Minikube Mountvolume.Impostazione è riuscita per il volume "Default-Token-R5PL1" 2M 2M 1 My-Node-276881918-QTH5S POD Spec.contenitori my-node normale kubelet tirato, immagine contenitore minikube "my-node: v1" già presente sulla macchina 2m 2m 1 my-node-276881918-qth5s pod pod.Contenitori my-node normale Kubelet creato, Minikube Creato Container 2M 2M 1 My-Node-276881918-QTH5S POD Spec.Contenitori My-node Kubelet avviato normale, Minikube avviato contenitore 2m 2m 1 My-Node-276881918 ReplicAset Normale riuscita a riuscita ReplicAset-Controller Creato POD: My-Node-27688191918-QTH5S 2M 2M 1-Node Distributiva normale ScalingReplicASet Displod-Controller Giloller scala-controprotele in scala up replica imposta my-node-276881918
Crea un servizio
Un baccello è inaccessibile. Devi creare un servizio per rendere il pod accessibile al mondo. Il comando seguente dovrebbe creare il servizio necessario:
$ kubectl esponi la distribuzione my-node --type = loadbalancer Service "My-Node" Exposed
Puoi controllare lo stato del servizio in questo modo:
$ kubectl Get Services Nome cluster-ip porte esterne-ip age kubernetes 10.0.0.1443/TCP 34M My-Node 10.0.0.213 8080: 31460/TCP 31s
Se si utilizza il seguente comando, aprirà il servizio su un browser Web:
$ minikube Servizio My-Node Apertura del servizio Kubernetes Predefinito/My-Node nel browser predefinito ..
Puoi controllare cosa sta andando nel tuo pod con il comando "logs" - kubectl logs [nameofthepod].
$ kubectl logs my-node-276881918-qth5s richiesta ricevuta per URL: / richiesta ricevuta per URL: / favicon.ICO
I registri sopra mostrano le richieste effettuate al server.Applicazione JS in esecuzione sul cluster.
Pulire
È possibile eliminare il servizio e il pod con i seguenti comandi:
$ kuBectl Elimina servizio My-Node Service "My-Node" Eliminato $ kubectl Elimina distribuzione my-node [/code] distribuzione "my-node" Eliminata
Puoi fermare il minikube:
$ minikube smettere di fermare il cluster Kubernetes locale ... la macchina è fermata.
Kubernetes è un vasto sistema con capacità su larga scala. La documentazione di Kubernetes è il posto migliore per conoscere questa potente tecnologia.
Ulteriori studi:
Documentazione di Kubernetes: https: // kubernetes.IO/DOCS