Kubernetes è uno strumento di orchestrazione di container di livello di produzione open source che aiuta ad automatizzare la distribuzione, il ridimensionamento e la gestione delle applicazioni containerizzate. Inizialmente Google ha progettato Kubernetes e ora è gestito dalla Cloud Native Computing Foundation.
Puoi chiamare Kubernetes è un gestore di cluster per Docker e fornisce quasi le stesse funzionalità di Docker Swarm . Con Kubernetes, puoi distribuire un numero qualsiasi di repliche di container su un cluster di nodi e Kubernetes gestirà i rimanenti (dove richiamare i container) per te.
Possiamo eseguire Kubernetes nella macchina locale usando i metodi seguenti,
1. MinKube – Un cluster Kubernetes a nodo singolo per lo sviluppo e il test.
2. Kubeadm-dind (Kuberadm) – Un cluster Kubernetes multinodo
Puoi leggere tutti i metodi qui .
Qui, distribuiremo un cluster Kubernetes multinodo usando kubeadm. In questa configurazione multi-nodo, avremo un nodo master e più nodi di lavoro (minion).
Componenti
Nodo principale
server kube-API: È un server API, viene eseguito sul nodo master che espone l'API Kubernetes
etcd: Un archivio di chiavi che archivia i dati del cluster Kubenetes
kube-scheduler: È uno scheduler che viene eseguito sul nodo master che monitora i pod appena creati ed esegue quei pod su nodi selezionati in base alla disponibilità delle risorse.
kube-controller-manager: È un gestore di controllo che viene eseguito sul gestore responsabile del monitoraggio dei nodi e della gestione della replica dei pod.
cloud-controller-manager: Un cloud control manager che interagisce con i cloud provider sottostanti (Es:DigitalOcean, Rancher, ecc.).
Nodi di lavoro
kubelet: Funziona su tutti i nodi di lavoro e gestisce attività come l'avvio di pod e container.
kube-proxy: È un proxy di rete Kubernetes che inoltra le richieste TCP/UDP in entrata al container back-end.
Runtime del container: È un software contenitore (Docker)
Ambiente
Nodo | Nome host | Indirizzo IP | OS | CPU | RAM |
---|---|---|---|---|---|
Nodo principale | master.itzgeek.local | 192.168.1.10 | CentOS 7 / RHEL 7 | 2 | 2GB |
Minion Nodo 1 | node1.itzgeek.local | 192.168.1.20 | Ubuntu 18.04 / 16.04 | 2 | 2GB |
Minion Nodo 2 | node2.itzgeek.local | 192.168.1.30 | Debian 9 | 2 | 2GB |
Qui, sto usando un ambiente misto per questa demo. Tuttavia, ti chiedo di utilizzare il sistema operativo simile solo per facilitare la risoluzione dei problemi.
Prerequisiti
Diventa l'utente root.
su -
O
sudo su -
Imposta nome host
Imposta un nome host univoco per tutti i tuoi nodi. Esempio:
hostnamectl set-hostname master.itzgeek.local
Crea una voce host o DNS record per risolvere il nome host per tutti i nodi.
vi /etc/hosts
Inserimento:
192.168.1.10 master.itzgeek.local master192.168.1.20 node1.itzgeek.local node1192.168.1.30 node2.itzgeek.local node2
Firewall
Configura Firewall affinché Kubernetes funzioni correttamente.
Sul nodo principale
FirwallD:
firewall-cmd --permanent --add-port=6443/tcpfirewall-cmd --permanent --add-port=2379-2380/tcpfirewall-cmd --permanent --add-port=10250/tcpfirewall-cmd --permanent --add-port=10251/tcpfirewall-cmd --permanent --add-port=10252/tcpfirewall-cmd --permanent --add-port=10255/tcpfirewall-cmd --reload
UFW:
ufw consentire 6443/tcpufw consentire 2379tcpufw consentire 2380/tcpufw consentire 10250/tcpufw consentire 10251/tcpufw consentire 10252/tcpufw consentire 10255/tcpufw ricaricare
Sui nodi di lavoro
FirwallD:
firewall-cmd --permanent --add-port=10251/tcpfirewall-cmd --permanent --add-port=10255/tcpfirewall-cmd --reload
UFW:
ufw consentire 10251/tcpufw consentire 10255/tcpufw ricaricare
SELinux
Prendi in considerazione la disabilitazione di SELinux su CentOS 7 / RHEL 7 nodi.
setenforce 0sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
Impostazioni del kernel
In RHEL 7/CentOS 7 , imposta net.bridge.bridge-nf-call-iptables su 1 nella tua configurazione sysctl.
cat </etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables =1net.bridge.bridge-nf-call-iptables =1EOFsysctl -p
Installa Docker
Installa Docker su tutti i tuoi nodi (Master e Minion). Si consiglia la versione Docker v18.06, ma v1.11, v1.12, v1.13 e 17.03 funzionano bene anche con Kubernetes.
CentOS 7 / RHEL 7
### Installa Docker dal repository CentOS/RHEL ### yum install -y dockersystemctl abilita docker systemctl start dockerOR### Installa Docker CE 18.06 dai repository CentOS di Docker #### Installa prerequisiti yum install -y yum-utils device-mapper-persistent-data lvm2# Aggiungi repository Docker yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # Installa Dockeryum updateyum install -y docker-ce-18.06.1.ce# Crea directory Docker mkdir /etc/docker# Imposta Docker Daemoncat> /etc/docker/daemon.json <Ubuntu 18.04 / Ubuntu 16.04
### Installa Docker dai repository di Ubuntu ### apt-get updateapt-get install -y docker.ioOPPURE ### Installa Docker CE 18.06 dai repository di Docker per Ubuntu #### Installa prerequisiti apt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-common# Scarica la chiave GPG curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -# Aggiungi il repository Docker add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"# Installa Docker apt-get updateapt-get install -y docker-ce=18.06.0~ce~3-0~ubuntu# Setup Daemon cat> /etc/docker/daemon.json <# Riavvia il demone Docker systemctl daemon-reloadsystemctl riavvia la finestra mobile Debian 9
### Installa Docker dai repository di Debian ### apt-get updateapt-get install -y docker.ioOPPURE ### Installa Docker CE 18.06 dai repository di Docker per Debian ### # Prerequisito di installazione sapt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-common# Scarica la chiave GPG curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -# Aggiungi il repository Docker add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable"# Installa Docker apt-get updateapt-get install -y docker-ce=18.06.0~ce~3-0~debian# Setup Daemon cat> /etc/docker/daemon.json <# Riavvia il demone Docker systemctl daemon-reloadsystemctl riavvia la finestra mobile Configura il repository Kubernetes
Kubernetes i pacchetti non sono disponibili nei repository del sistema operativo, quindi devi seguire i passaggi seguenti per configurare il relativo repository su tutti i tuoi nodi.
### CentOS 7 / RHEL 7 ###cat </etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/ yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum /doc/rpm-package-key.gpgexclude=kube*EOF### Ubuntu 18.04 / 16.05 e Debian 9 ###apt-get updateapt-get install -y curl apt-transport-httpscurl -s https://packages. cloud.google.com/apt/doc/apt-key.gpg | apt-key add -echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list Installa kubeadm, kubelet e kubectl
Su tutti i tuoi nodi, esegui i seguenti comandi per installare i pacchetti richiesti.
kubeadm:il comando per creare il cluster.
kubelet:viene eseguito su tutte le macchine nel tuo cluster e fa cose come l'avvio di pod e container.
kubectl:l'utilità della riga di comando per gestire il tuo cluster.
### CentOS 7 / RHEL 7 ###yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetessystemctl abilita kubelet systemctl start kubelet### Ubuntu 16.04 / Debian 9 ###apt-get updateapt-get install - e kubelet kubeadm kubectlInizializza Kubernetes Master
Sul nodo Master, esegui il comando kubeadm init nel terminale per inizializzare il cluster.
A seconda del componente aggiuntivo di rete che utilizzi, potrebbe essere necessario impostare il--pod-network-cidr
ad un valore specifico. Qui sto usando la rete pod Wave che non richiede argomenti aggiuntivi.kubeadm initRisultato:
[init] Utilizzo della versione Kubernetes:v1.13.0[preflight] Esecuzione dei controlli pre-flight [WARNING Firewalld]:firewalld è attivo, assicurati che le porte [6443 10250] siano aperte o il tuo cluster potrebbe non funzionare correttamente[preflight] Pulling immagini richieste per configurare un cluster Kubernetes[preflight] L'operazione potrebbe richiedere uno o due minuti, a seconda della velocità della tua connessione Internet[preflight] Puoi anche eseguire questa azione in anticipo usando 'kubeadm config images pull'[kubelet-start] Scrittura del file di ambiente kubelet con flag nel file "/var/lib/kubelet/kubeadm-flags.env"[kubelet-start] Scrittura della configurazione di kubelet nel file "/var/lib/kubelet/config.yaml"[kubelet-start] Attivazione il servizio kubelet[certs] Utilizzo della cartella certificateDir "/etc/kubernetes/pki"[certs] Generazione del certificato "ca" e della chiave[certs] Generazione del certificato e della chiave "apiserver-kubelet-client". . .. . .. . .[bootstraptoken] ha configurato le regole RBAC per consentire la rotazione dei certificati per tutti i certificati client del nodo nel cluster[bootstraptoken] creando la "cluster-info" ConfigMap nello spazio dei nomi "kube-public" [addons] Addon essenziale applicato:CoreDNS[addons] applicato componente aggiuntivo essenziale:kube-proxyIl tuo master Kubernetes è stato inizializzato correttamente!Per iniziare a utilizzare il tuo cluster, devi eseguire quanto segue come utente normale: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin .conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Ora dovresti distribuire una rete pod nel cluster. Esegui "kubectl apply -f [podnetwork].yaml" con una delle opzioni elencate in:https://kubernetes.io/docs/concepts/cluster-administration/addons/You ora possono aderire qualsiasi numero di macchine eseguendo quanto segue su ciascuna radice nodeas: kubeadm uniscono 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cERT-hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede21509427009Gestisci cluster
Esegui questi comandi nel terminale per gestire e lavorare sul cluster come utente normale.
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configEsegui il comando kubectl get pods –all-namespaces per controllare lo stato del cluster.
kubectl get pods --all-namespacesRisultato:
Puoi vedere che coredn pod è in stato di attesa e lo stato dovrebbe cambiare dopo l'installazione della rete pod.
Imposta rete pod
È necessario configurare un componente aggiuntivo di rete pod nel cluster in modo che i pod possano comunicare tra loro. Esistono diversi progetti che forniscono reti di pod Kubernetes vale a dire, calicò, canale, flanella, ecc.
Qui utilizzeremo la rete pod Wave per questa demo.
export kubever=$(versione kubectl | base64 | tr -d '\n')kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"Risultato:
serviceaccount/weave-net createclusterrole.rbac.authorization.k8s.io/weave-net createclusterrolebinding.rbac.authorization.k8s.io/weave-net createrole.rbac.authorization.k8s.io/weave-net createrolebinding.rbac .authorization.k8s.io/weave-net creatodaemonset.extensions/weave-net creatoControlla di nuovo lo stato del cluster. Il pod coredns dovrebbe ora essere in esecuzione.
kubectl get pods --all-namespacesRisultato:
Unisci i nodi di lavoro al cluster Kuberenete
Se ricordi, c'era un token nell'output del comando kubeadm init per unire i nodi. Usa il token e unisciti a tutti i tuoi nodi di lavoro.
kubeadm join 192.168.1.10:6443 --token d1dyaj.31zxywbg93s1ywjy --discovery-token-ca-cert-hash sha256:71a91721595fde66b6382908d801266602a14de8e16bdb7a3cede2150942>7Risultato:
[preflight] Esecuzione dei controlli pre-flight[discovery] Tentativo di connessione al server API "192.168.1.10:6443"[discovery] Creato un client di rilevamento delle informazioni sul cluster, richiedendo informazioni da "https://192.168.1.10:6443 "[scoperta] Richiesta di informazioni da" https://192.168.1.10:6443" di nuovo per convalidare TLS rispetto alla chiave pubblica bloccata [discovery] La firma e il contenuto delle informazioni del cluster sono validi e il certificato TLS viene convalidato rispetto alle radici bloccate, utilizzerà il server API " 192.168.1.10:6443"[scoperta] Connessione stabilita con successo con il server API "192.168.1.10:6443"[unirsi] Lettura della configurazione dal cluster...[unirsi] Cordiali saluti:puoi guardare questo file di configurazione con 'kubectl -n kube-system get cm kubeadm-config -oyaml'[kubelet] Download della configurazione per il kubelet da "kubelet-config-1.13" ConfigMap nello spazio dei nomi del sistema kube[kubelet-start] Scrittura della configurazione del kubelet nel file "/var/lib /kubelet/config.yaml"[kubelet-start] Scrittura del file di ambiente kubelet con flag nel file "/var/lib/kubelet/kubeadm-fl ags.env"[kubelet-start] Attivazione del servizio kubelet[tlsbootstrap] In attesa che il kubelet esegua il bootstrap TLS...[patchnode] Caricamento delle informazioni del socket CRI "/var/run/dockershim.sock" nell'API del nodo oggetto "node1.itzgeek.local" come annotazioneQuesto nodo è entrato a far parte del cluster:* La richiesta di firma del certificato è stata inviata a apiserver ed è stata ricevuta una risposta.* Il Kubelet è stato informato dei nuovi dettagli di connessione sicura. Esegui 'kubectl get nodes' su il master per vedere questo nodo unirsi al cluster.L'output precedente conferma che il nodo è stato aggiunto correttamente al cluster.
Ora controlla lo stato dei nodi di lavoro sul nodo master usando il comando seguente.
kubectl ottiene nodiRisultato:
Dovresti vedere che i nodi di lavoro sono in stato pronto.
Nel prossimo articolo distribuiremo pod, servizi e controller di replica in Kubernetes.
Questo è tutto.