Database
 sql >> Database >  >> RDS >> Database

Come installare Kubernetes usando Kubeadm

Kubernetes è stato introdotto in un articolo precedente, "Guida introduttiva a Kubernetes su Amazon Web Services (AWS)." Kubernetes è stato discusso anche in un altro articolo, "Utilizzo di Kubernetes (K8s) su IBM Bluemix". Kubernetes può essere installato su bare metal su quasi tutti i sistemi operativi inclusi Fedora, CentOS, Ubuntu e CoreOS per scopi di sviluppo.

Il problema

L'installazione di Kubernetes su bare metal comporta l'esecuzione di diversi comandi per la configurazione di un nodo master, nodi di lavoro, rete pod e così via.

La soluzione

Kubernetes 1.4 introduce un nuovo strumento chiamato kubeadm per eseguire il bootstrap di un cluster Kubernetes. Il kubeadm esegue il bootstrap di un cluster Kubernetes con due comandi. Dopo aver installato Docker, kubectl e kubelet, il nodo master può essere avviato con kubeadm init e nodi di lavoro aggiunti con kubeadm join .

In questo articolo, utilizzeremo la procedura seguente per installare e avviare un cluster Kubernetes e successivamente testare il cluster:

  1. Avvia tre nuove istanze Ubuntu su Amazon EC2.
  2. Su tutte le istanze di Ubuntu, installa Docker, kubeadm, kubectl e kubelet.
  3. Da una delle istanze di Ubuntu, inizializza il master del cluster Kubernetes con il seguente comando:
    kubeadm init
  4. Applica il criterio di rete Calico Pod kubeadm/calico.yaml .
  5. Unisciti alle altre due istanze (nodi) di Ubuntu con master con kubeadm join --token= .
  6. Su master, tre nodi vengono elencati con "kubectl get nodes".
  7. Esegui un'applicazione su master:
    kubectl -s http://localhost:8080 run nginx
       --image=nginx
       --replicas=3 --port=80
    
  8. Elenca i pod:
    kubectl get pods -o wide
  9. Disinstalla il cluster Kubernetes.
    kubeadm reset

Questo articolo ha le seguenti sezioni:

  • Impostazione dell'ambiente
  • Installazione di Docker, kubeadm, kubectl e kubelet su ciascun host
  • Inizializzazione del Master
  • Installazione della rete Calico Pod
  • Unire i nodi al cluster
  • Installazione di un'applicazione di esempio
  • Disinstallazione del cluster
  • Limitazioni
  • Ulteriori sviluppi in kubeadm
  • Conclusione

Impostazione dell'ambiente

Il kubeadm lo strumento richiede le seguenti macchine che eseguono Ubuntu 16.04+, HypriotOS v1.0.1+ o CentOS 7 in esecuzione su di esse.

  • Una macchina per il nodo master
  • Una o più macchine per i nodi di lavoro

Almeno 1 GB di RAM è richiesto su ciascuna delle macchine. Abbiamo utilizzato tre macchine Ubuntu in esecuzione su Amazon EC2 per eseguire il bootstrap di un cluster con un singolo nodo master e due nodi di lavoro. Le tre macchine Ubuntu sono mostrate nella Figura 1.


Figura 1: Macchine Ubuntu

Installazione di Docker, kubeadm, kubectl e kubelet su ciascun host

In questa sezione installeremo Docker, kubelet, kubectl e kubeadm su ciascuna delle tre macchine. I componenti installati sono discussi nella Tabella 1.

Componente Descrizione
Docker Il runtime del contenitore. Si consiglia la versione 1.11.2 e vanno bene anche v1.10.3 e v1.12.1. Richiesto su tutte le macchine nel cluster.
kubelet Il componente principale di Kubernetes che viene eseguito su tutte le macchine nel cluster. Avvia contenitori e Pod. Richiesto su tutte le macchine nel cluster.
kubectl Lo strumento da riga di comando per gestire un cluster. Richiesto solo sul nodo master, ma utile se installato su tutti i nodi.
kubeadm Lo strumento per avviare un cluster. Richiesto su tutte le macchine nel cluster.

Tabella 1: Componenti da installare

Ottieni l'indirizzo IP pubblico di ciascuna delle tre macchine e accedi SSH a ciascuna delle macchine:

ssh -i "docker.pem" [email protected]
ssh -i "docker.pem" [email protected]
ssh -i "docker.pem" [email protected]

I comandi per installare i binari devono essere eseguiti come root; quindi, imposta l'utente su root.

sudo su -

Esegui i seguenti comandi su ciascuna delle macchine:

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg
   | apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

Il primo comando scarica i pacchetti richiesti per Kubernetes, come mostrato nell'output nella Figura 2.


Figura 2: Download di pacchetti per Kubernetes

Il comando 2 scarica gli elenchi dei pacchetti dai repository e li aggiorna con le versioni più recenti dei pacchetti.

apt-get update

L'output è mostrato nella Figura 3.


Figura 3: Aggiornamento dei pacchetti di repository

Quindi, installa Docker:

# Install docker if you don't have it already.
apt-get install -y docker.io

Docker viene installato, come mostrato nell'output del comando nella Figura 4.


Figura 4: Installazione Docker

E, successivamente, installa kubelet (componente principale di Kubernetes), kubeadm (strumento di avvio), kubectl (strumento di gestione dei cluster) e kubernetes-cni (plug-in di rete):

apt-get install -y kubelet kubeadm kubectl kubernetes-cni

L'output dei comandi precedenti è mostrato nella Figura 5.


Figura 5: Installazione di kubelet, kubeadm, kubectln e kubernetes-cni

Inizializzazione del Master

Quindi, inizializza il master su cui funzionano il database etcd e il server API. Il kubelet avvia Pods per eseguire questi componenti. Esegui il seguente comando che rileva automaticamente gli indirizzi IP:

kubeadm init

Come mostrato nell'output del comando, innanzitutto vengono eseguiti alcuni controlli pre-flight per convalidare lo stato del sistema. Successivamente, viene generato un token master/token da utilizzare come chiave di autenticazione reciproca per i nodi di lavoro che desiderano unirsi al cluster. Successivamente, vengono generati una chiave e un certificato dell'autorità di certificazione autofirmati per fornire identità a ciascuno dei nodi del cluster per la comunicazione con i client. Una chiave e un certificato del server API vengono creati per il server API per la comunicazione con i client. Un util/kubeconfig viene creato il file per consentire al kubelet di connettersi al server API e un altro util/kubeconfig viene creato un file per l'amministrazione. Successivamente viene creata la configurazione del client API. L'output da kubeadm init comando è mostrato nella Figura 6.


Figura 6: Esecuzione di kubeadm init

Tutti i componenti del piano di controllo diventano pronti. Il primo nodo diventa pronto e viene eseguita una distribuzione di prova. Vengono creati anche i componenti aggiuntivi essenziali kube-discovery, kube-proxy e kube-dns, come mostrato nell'output del comando nella figura 7. Il master Kubernetes viene inizializzato correttamente. Viene generato un comando con la seguente sintassi; deve essere eseguito su macchine (nodi) che devono unirsi al cluster.

kubeadm join -token=<token> <IP Address of the master node>

Il comando precedente deve essere copiato e conservato per un successivo utilizzo sui nodi di lavoro.


Figura 7: Master Kubernetes inizializzato

Per impostazione predefinita, i nodi master non sono schedulabili e lo fanno utilizzando la contaminazione “dedicata”. Il nodo master può essere reso schedulabile con il seguente comando:

kubectl taint nodes --all dedicated-

Il kubeadm comando supporta alcune altre opzioni (vedi Tabella 2) che non dovevamo utilizzare ma che potrebbero essere utilizzate per sovrascrivere il comando predefinito.

Parametro di comando Descrizione Predefinito
--skip-preflight-checks Salta i controlli preflight I controlli preliminari vengono eseguiti
--use-kubernetes-version Imposta la versione di Kubernetes da utilizzare v1.5.1
--api-advertise-addresses Il comando kubeadm init auto rileva e utilizza l'indirizzo IP dell'interfaccia di rete predefinita e lo utilizza per generare certificati per il server API. Questo parametro di configurazione può essere utilizzato per sovrascrivere l'impostazione predefinita con uno o più indirizzi IP su cui deve essere convalidato il server API. Rilevamento automatico
--api-external-dns-names Questo parametro di configurazione può essere utilizzato per sovrascrivere l'interfaccia di rete predefinita con uno o più nomi host su cui deve essere convalidato il server API. Deve essere utilizzato solo uno degli indirizzi IP o dei nomi DNS esterni.
--cloud-provider Specifica un provider cloud.

Il cloud manager supporta "aws", "azure", "cloudstack", "gce", "mesos", "openstack", "ovirt", "rackspace" e "vsphere". La configurazione del provider cloud può essere fornita nel file /etc/kubernetes/cloud-config. L'utilizzo di un provider Cloud ha anche il vantaggio di utilizzare volumi persistenti e bilanciamento del carico.

Nessun rilevamento automatico di un provider cloud
--pod-network-cidr Assegna gli intervalli di rete (CIDR) a ciascun nodo ed è utile per alcune soluzioni di rete, inclusi i provider Flannel e Cloud.
--service-cidr Esegue l'override della sottorete utilizzata da Kubernetes per assegnare indirizzi IP ai pod. Il /etc/systemd/system/kubelet.service.d/10-kubeadm.conf anche deve essere modificato. 10.96.0.0/12
--service-dns-domain Sostituisce il suffisso del nome DNS per l'assegnazione di servizi con nomi DNS; ha il formato ..svc.cluster.local . Il /etc/systemd/system/kubelet.service.d/10-kubeadm.conf anche deve essere modificato. cluster.local
--token Specifica il token da utilizzare per l'autenticazione reciproca tra il master e i nodi che si uniscono al cluster. Generato automaticamente

Tabella 2: Opzioni del comando Kubeadm

Installazione della rete Calico Pod

Affinché i Pod possano comunicare tra loro, è necessario installare un componente aggiuntivo di rete Pod. Calico fornisce una configurazione di installazione ospitata da kubeadm sotto forma di ConfigMap su http://docs.projectcalico.org/master/getting-started/kubernetes/installation/hosted/kubeadm/calico.yaml che useremo in questa sezione per installare una rete Pod. Eseguire il comando seguente sul nodo master per installare la rete Pod:

kubectl apply -f
   http://docs.projectcalico.org/master/getting-started/
   kubernetes/installation/hosted/kubeadm/calico.yaml

In alternativa, scarica calico.yaml e copia nel nodo principale:

scp -i "docker.pem" calico.yaml [email protected]:~

Successivamente, esegui il seguente comando:

kubectl apply -f calico.yaml

Vengono installati Calico e un cluster etcd a nodo singolo, come mostrato nella Figura 8.


Figura 8: Installazione della politica di Calico

Successivamente, elenca tutti i Pod in tutti gli spazi dei nomi Kubernetes.

kubectl get pods --all-namespaces

Il kube-dns Il pod deve essere in esecuzione, come elencato nella Figura 9.


Figura 9: Elencare i Pod in tutti gli spazi dei nomi

Unire i nodi al cluster

In questa sezione, uniremo i nodi di lavoro al cluster utilizzando kubeadm join comando, che ha la seguente sintassi:

kubeadm join --token=<token> <master-ip>

Facoltativamente, il partecipazione a kubeadm il comando può essere eseguito con i --skip-preflight-checks opzione per saltare la convalida preliminare.

Il partecipazione a kubeadm Il comando utilizza il token fornito per comunicare con il server API e ottenere il certificato CA radice e crea una coppia di chiavi locali. Successivamente, una richiesta di firma del certificato (CSR) viene inviata al server API per la firma e il kubelet locale viene configurato per connettersi al server API.

Esegui kubeadm join comando copiato dall'output di kubeadm init comando su ciascuna delle macchine Ubuntu che devono unirsi al cluster.

Innanzitutto, accedi SSH alle istanze di Ubuntu:

ssh -i "docker.pem" [email protected]

e

ssh -i "docker.pem" [email protected]

Successivamente, esegui il kubeadm join comando. Innanzitutto, vengono eseguiti alcuni controlli pre-volo. Il token fornito è convalidato. Successivamente, viene utilizzato il rilevamento dei nodi. Viene creato un client di rilevamento delle informazioni del cluster e le informazioni vengono richieste dal server API. Viene ricevuto un oggetto informazioni sul cluster e viene verificata una firma utilizzando il token specificato. La firma e il contenuto delle informazioni sul cluster risultano validi e il rilevamento del nodo è completo. Successivamente viene eseguito il bootstrap del nodo, in cui gli endpoint API https://10.0.0.129:6443 vengono utilizzati per stabilire una connessione. Successivamente, viene effettuata una richiesta di firma del certificato (csr) utilizzando un client API per ottenere un certificato univoco per il nodo. Una volta ricevuto un certificato firmato dal server API, viene generato un file di configurazione kubelet. Il messaggio "Node join complete" elencato nella Figura 10 indica che il nodo è entrato a far parte del cluster.


Figura 10: Unire un nodo al cluster

Allo stesso modo, esegui lo stesso comando sull'altra macchina Ubuntu. Anche l'altro nodo si unisce al cluster, come indicato dall'output nella Figura 11.


Figura 11: Unire il secondo nodo al cluster

Sul nodo master, esegui il comando seguente per elencare i nodi:

kubectl get nodes

Il nodo master ei due nodi di lavoro dovrebbero essere elencati, come mostrato nella Figura 12.


Figura 12: Elenco dei nodi del cluster Kubernetes

Installazione di un'applicazione di esempio

Successivamente, testeremo il cluster. Esegui il comando seguente per eseguire un nginx cluster Pod basato su tre repliche:

kubectl -s http://localhost:8080 run nginx
   --image=nginx
   --replicas=3 --port=80

Elenca le distribuzioni:

kubectl get deployments

Elenca i Pod a livello di cluster:

kubectl get pods -o wide

Esponi la distribuzione come un servizio di tipo LoadBalancer :

kubectl expose deployment nginx --port=80 --type=LoadBalancer

Elenca i servizi:

kubectl get services

L'output dei comandi precedenti indica nginx è stata creata la distribuzione e i tre pod vengono eseguiti sui due nodi di lavoro nel cluster. Viene anche creato un servizio chiamato "nginx", come mostrato nella Figura 13.


Figura 13: Esecuzione di un cluster Pod nginx

Copia l'IP del cluster del servizio. Esegui il comando curl per richiamare il servizio:

curl 10.0.0.99

Viene visualizzato il markup HTML del servizio, come mostrato nella Figura 14.


Figura 14: Invocare il servizio nginx

Disinstallazione del cluster

Per disinstallare il cluster installato da kubeadm, esegui il comando seguente:

kubeadm reset

Il cluster viene disinstallato, come mostrato nella Figura 15.


Figura 15: Disinstallazione/ripristino del cluster Kubernetes

Limiti

kubeadm ha diverse limitazioni ed è consigliato solo per l'uso in fase di sviluppo. Le limitazioni di kubeadm sono le seguenti;

  • Sono supportati solo alcuni sistemi operativi:Ubuntu 16.04+, CentOS 7, HypriotOS v1.0.1+.
  • Non adatto per uso produttivo.
  • L'integrazione dei provider cloud è sperimentale.
  • Viene creato un cluster con un solo master con un unico database etcd. La disponibilità elevata non è supportata, il che implica che il master è un singolo punto di errore (SPOF).
  • Le funzionalità HostPort e HostIP non sono supportate.
  • Alcuni altri problemi noti relativi all'utilizzo di kubeadm con RHEL/CentOS 7 e VirtualBox.

Ulteriori sviluppi in kubeadm

kubeadm è in versione alfa in Kubernetes v 1.5 ed è in versione beta da Kubernetes 1.6. Piccole correzioni e miglioramenti continuano a essere apportati a kubeadm con ogni nuova versione di Kubernetes:

  • Con Kubernetes 1.7, le modifiche alle risorse interne del cluster installate con kubeadm vengono sovrascritte durante l'aggiornamento dalla v 1.6 alla v 1.7.
  • In Kubernetes 1.8, il token Bootstrap predefinito creato con kubeadm init diventa non valido e viene cancellato dopo 24 ore dalla creazione per limitare l'esposizione della credenziale di valore. Il partecipazione a kubeadm Il comando delega il bootstrap TLS al kubelet stesso invece di reimplementare il processo. Il bootstrap KubeConfig il file viene scritto in /etc/kubernetes/bootstrap-kubelet-conf con kubeadm join .

Conclusione

In questo articolo, abbiamo utilizzato la funzionalità dello strumento kubeadm disponibile da Kubernetes v1.4 per avviare un cluster Kubernetes. Innanzitutto, vengono installati i file binari richiesti per Docker, kubectl, kubelet e kubeadm. Successivamente, il kubeadm init Il comando viene utilizzato per inizializzare il nodo master nel cluster. Infine, il unirsi a kubeadm Il comando viene utilizzato per unire i nodi di lavoro al cluster. Un esempio nginx viene eseguita l'applicazione per testare il cluster.