Come configurare il cluster Kubernetes con Kubeadm su Ubuntu 22.04
Su questa pagina
- Prerequisiti
- Impostazione dei sistemi
- Imposta il file /etc/hosts
- Configurazione del firewall UFW
- Abilita moduli kernel e disabilita SWAP
- Installazione di Container Runtime: Containerd
- Installazione del pacchetto Kubernetes
- Installazione del plug-in CNI (Container Network Interface): Flannel
- Inizializzazione del piano di controllo Kubernetes
- Aggiunta di nodi di lavoro a Kubernetes
- Conclusione
Kubernetes o k8s è una piattaforma open source per l'orchestrazione dei container che automatizza le distribuzioni, la gestione e il ridimensionamento delle applicazioni containerizzate. Kubernetes è un'orchestrazione di container creata da Google e ora è diventata un progetto open source e diventa uno standard per le moderne piattaforme di distribuzione di applicazioni e elaborazione.
Kubernetes è la soluzione per la moderna era di distribuzione dei container. Fornisce rilevamento e bilanciamento del carico dei servizi, orchestrazione dell'archiviazione, rollout e rollback automatizzati, servizio di riparazione automatica, gestione dei segreti e della configurazione. Kubernetes consente uno sviluppo nativo del cloud a costi contenuti.
In questo tutorial, configurerai il cluster Kubernetes:
- Impostazione dei sistemi, che include: installazione del file /etc/hosts, abilitazione dei moduli del kernel e disabilitazione di SWAP.
- Impostazione del firewall UFW aggiungendo alcune porte necessarie per Kubernetes.
- Installazione di containerd come runtime del contenitore per Kubernetes.
- Installazione di pacchetti Kubernetes come kubelet, kubeadm e kubectl.
- Installazione del plug-in di rete Flannel per i pod Kubernetes.
- Inizializzazione di un nodo del piano di controllo e aggiunta di due nodi di lavoro.
Prerequisiti
Per completare questo tutorial, avrai bisogno dei seguenti requisiti:
- Tre o più server Ubuntu 22.04.
- Un utente non root con privilegi di root/amministratore.
Installazione di sistemi
Prima di iniziare a installare qualsiasi pacchetto per la distribuzione di Kubernetes, dovrai configurare tutti i tuoi sistemi come richiesto per la distribuzione di Kubernetes. Ciò include le seguenti configurazioni:
- Imposta il file /etc/hosts corretto: ogni nome host del server deve essere risolto nell'indirizzo IP corretto. Questo può essere fatto in diversi modi, ma il più facile e semplice è usare il file /etc/hosts su tutti i server.
- Imposta firewall UFW: per l'ambiente di produzione, è sempre consigliabile abilitare il firewall sia sul piano di controllo che sui nodi di lavoro.
- Abilita i moduli del kernel: Kubernetes richiedeva l'abilitazione di alcuni moduli del kernel sul sistema Linux. I moduli del kernel \overlay\ e \br_netfilter\ sono necessari per consentire a iptables di vedere i traffici con bridge.
- Disabilita SWAP: questo è obbligatorio, devi disabilitare SWAP su tutti i nodi Kubernetes, sia sul piano di controllo che sui nodi di lavoro. In caso contrario, il servizio kubelet verrà eseguito con problemi.
Imposta il file /etc/hosts
In questo primo passaggio, imposterai il nome host del sistema e il file /etc/hosts su tutti i tuoi server. Per questa dimostrazione, utilizzeremo i seguenti server.
Hostname IP Address Used as
--------------------------------------------
cplane1 192.168.5.10 control-plane
worker1 192.168.5.25 worker node
worker2 192.168.5.26 worker node
Eseguire il seguente comando hostnamectl di seguito per configurare il nome host del sistema su ciascun server.
Per il nodo del piano di controllo, esegui il seguente comando per impostare il nome host del sistema su \cplane1\.
sudo hostnamectl set-hostname cplane1
Per i nodi di lavoro Kubernetes, esegui il seguente comando hostnamectl.
# setup hostname worker1
sudo hostnamectl set-hostname worker1
# setup hostname worker2
sudo hostnamectl set-hostname worker2
Successivamente, modifica il file /etc/hosts su tutti i server utilizzando il seguente comando.
sudo nano /etc/hosts
Aggiungere la seguente configurazione al file. Assicurati che ogni nome host punti all'indirizzo IP corretto.
192.168.5.10 cplane1
192.168.5.25 worker1
192.168.5.26 worker2
Salva e chiudi il file quando hai finito.
Infine, se esegui il comando ping su ciascun nome host, verrai indirizzato all'indirizzo IP corretto come definito nel file /etc/hosts.
ping cplane1 -c3
ping worker1 -c3
ping worker2 -c3
Configurazione del firewall UFW
Kubernetes ha richiesto l'apertura di alcune porte su tutti i tuoi sistemi. Sul sistema Ubuntu predefinito, il firewall UFW viene utilizzato come firewall predefinito. Aggiungerai alcune porte al firewall UFW per la distribuzione di Kubernetes.
Per il piano di controllo Kubernetes, devi aprire le seguenti porte:
Protocol Direction Port Range Purpose Used By
-----------------------------------------------
TCP Inbound 6443 Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10259 kube-scheduler Self
TCP Inbound 10257 kube-controller-manager Self
Per i nodi di lavoro Kubernetes, devi aprire le seguenti porte:
Protocol Direction Port Range Purpose Used By
--------------------------------------------------
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services† All
Prima di aggiungere le regole UFW, assicurati di aggiungere l'applicazione OpenSSH al firewall utilizzando il comando seguente. Quindi, abilita il firewall UFW. Quando viene richiesta la conferma, immettere \y\ per abilitare ed eseguire il firewall UFW.
sudo ufw allow "OpenSSH"
sudo ufw enable
Sul nodo del piano di controllo \cplane1\, esegui il seguente comando ufw per aprire le porte.
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp
sudo ufw status
Sui nodi di lavoro \worker1\ e \worker2\, esegui il seguente comando ufw per aprire alcune porte.
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw status
Abilita i moduli kernel e disabilita SWAP
Kubernetes richiedeva che i moduli del kernel \overlay\ e \br_netfilter\ fossero abilitati su tutti i server. Ciò consentirà agli iptbales di vedere i traffici con bridge. Inoltre, dovrai abilitare il port forwarding e disabilitare lo SWAP.
Eseguire il seguente comando per abilitare i moduli del kernel \overlay\ e \br_netfilter\.
sudo modprobe overlay
sudo modprobe br_netfilter
Per renderlo permanente, crea il file di configurazione in \/etc/modules-load.d/k8s.conf\. Ciò consentirà ai sistemi Linux di abilitare i moduli del kernel durante l'avvio del sistema.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
Successivamente, crea i parametri systemctl richiesti utilizzando il seguente comando.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
Per applicare la nuova configurazione sysctl senza riavviare, utilizzare il seguente comando. Dovresti ottenere l'elenco dei parametri sysctl predefiniti sul tuo sistema e assicurarti di ottenere i parametri sysctl che hai appena aggiunto nel file \k8s.conf\.
sudo sysctl --system
Per disabilitare SWAP, dovrai commentare la configurazione di SWAP nel file \/etc/fstab\. Questo può essere fatto utilizzando il singolo comando tramite sed (editor di stream) o modificando manualmente il file /etc/fstab.
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
o
sudo nano /etc/fstab
Ora disattiva lo SWAP sulla sessione corrente utilizzando il comando seguente. Quindi, verifica che lo SWAP sia disattivato utilizzando il comando \free -m\. Dovresti vedere che lo SWAP ha valori \0\, il che significa che ora è disabilitato.
sudo swapoff -a
free -m
Installazione di Container Runtime: Containerd
Per configurare Kubernetes Cluster, devi installare il runtime del container su tutti i server in modo che i pod possano essere eseguiti. È possibile utilizzare più runtime di container per le distribuzioni di Kubernetes come containerd, CRI-O, Mirantis Container Runtime e Docker Engine (tramite cri-dockerd).
In questa dimostrazione, utilizzeremo il \containerd\ come contenitore per il nostro deployment Kubernetes. Quindi, installerai containerd su tutti i server, il piano di controllo e i nodi di lavoro.
Esistono diversi modi per installare containerd, il modo più semplice è utilizzare pacchetti binari predefiniti forniti dal repository Docker.
Ora esegui il seguente comando per aggiungere il repository Docker e la chiave GPG.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Aggiorna e aggiorna l'indice del pacchetto sul tuo sistema Ubuntu usando il comando seguente.
sudo apt update
Ora installa il pacchetto containerd usando il comando apt di seguito. E l'installazione inizierà.
sudo apt install containerd.io
Al termine dell'installazione, eseguire il comando seguente per arrestare il servizio containerd.
sudo systemctl stop containerd
Eseguire il backup della configurazione containerd predefinita e generarne una nuova utilizzando il seguente comando.
sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default > /etc/containerd/config.toml
Ora modifica il file di configurazione containerd \/etc/containerd/config.toml\ usando il seguente comando.
sudo nano /etc/containerd/config.toml
Modificare il valore del driver cgroup \SystemdCgroup=false\ in \SystemdCgroup=true\. Ciò abiliterà il driver cgroup systemd per il runtime del contenitore containerd.
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
Quando hai finito, salva e chiudi il file.
Successivamente, esegui il seguente comando systemctl per avviare il servizio containerd.
sudo systemctl start containerd
Infine, controlla e verifica il servizio containerd utilizzando il comando seguente. Dovresti vedere che containerd è abilitato e verrà eseguito automaticamente all'avvio del sistema. E lo stato attuale del servizio containerd è in esecuzione.
sudo systemctl is-enabled containerd
sudo systemctl status containerd
Installazione del pacchetto Kubernetes
Hai installato il runtime del contenitore containerd. Ora installerai i pacchetti Kubernetes su tutti i tuoi sistemi Ubuntu. Ciò include kubeadm per il bootstrap del cluster Kubernetes, kubelet il componente principale del cluster Kubernetes e kubectl l'utilità della riga di comando per la gestione del cluster Kubernetes.
In questo esempio, installeremo i pacchetti Kubernetes utilizzando il repository fornito da Kubernetes. Quindi, aggiungerai il repository Kubernetes a tutti i tuoi sistemi Ubuntu.
Eseguire il seguente comando apt per installare alcune dipendenze del pacchetto.
sudo apt install apt-transport-https ca-certificates curl -y
Ora aggiungi il repository Kubernetes e la chiave GPG utilizzando il seguente comando.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
Aggiorna e aggiorna il tuo repository Ubuntu e l'indice dei pacchetti.
sudo apt update
Al termine dell'aggiornamento, installa i pacchetti Kubernetes utilizzando il seguente comando apt. Immettere Y per confermare l'installazione e premere INVIO per continuare e l'installazione avrà inizio.
sudo apt install kubelet kubeadm kubectl
Al termine dell'installazione, esegui il comando seguente per bloccare la versione corrente dei pacchetti Kubernetes. Ciò impedirà l'aggiornamento automatico dei pacchetti Kubernetes e la differenza di versione tra i pacchetti Kubernetes.
sudo apt-mark hold kubelet kubeadm kubectl
Installazione del plug-in CNI (Container Network Interface): Flannel
Kubernetes supporta vari plug-in di rete di container come AWS VPC per Kubernetes, Azure CNI, Cilium, Calico, Flannel e molti altri. In questo esempio, utilizzeremo Flannel come plug-in CNI per la distribuzione di Kubernetes. E questo richiedeva l'installazione del file binario di Flannel tra i nodi Kubernetes.
Esegui il comando seguente per creare una nuova directory \/opt/bin\. Quindi, scarica il file binario di Flannel al suo interno.
mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64
Ora rendi eseguibile il file binario \flanneld\ modificando i permessi del file usando il comando seguente. Questo file binario \flanneld\ verrà eseguito automaticamente quando configuri il componente aggiuntivo della rete Pod.
sudo chmod +x /opt/bin/flanneld
Inizializzazione del piano di controllo Kubernetes
Hai completato tutte le dipendenze e i requisiti per la distribuzione del cluster Kubernetes. Ora avvierai il cluster Kubernetes inizializzando il nodo del piano di controllo per la prima volta. In questo esempio, Kubernetes Control Plane verrà installato sul server \cplane1\ con l'indirizzo IP \192.168.5.10\.
Prima di inizializzare il nodo Control Plane, eseguire il seguente comando per verificare che i moduli del kernel \br_netfilter\ siano abilitati. Se ottieni un output dal comando, significa che il modulo \br_netfilter\ è abilitato.
lsmod | grep br_netfilter
Successivamente, esegui il comando seguente per scaricare le immagini necessarie per il cluster Kubernetes. Questo comando scaricherà tutte le immagini del contenitore necessarie per la creazione del cluster Kubernetes come coredns, kube-api server, etcd, kube-controller, kube-proxy e l'immagine del contenitore di pausa.
sudo kubeadm config images pull
Al termine del download, esegui il seguente comando \kubeadm init\ per inizializzare il cluster Kubernetes sul server \cplane1\. Questo nodo \cplane1\ verrà selezionato automaticamente come piano di controllo Kubernetes perché questa è la prima volta che inizializza il cluster.
- Inoltre, in questo esempio, specifichiamo la rete per i pod su \10.244.0.0/16\, che è l'intervallo di rete predefinito per il plug-in Flannel CNI.
- \--apiserver-advertise-address\ determina in quale indirizzo IP verrà eseguito il server API Kubernetes, questo esempio utilizza l'indirizzo IP interno \192.168.5.10\.
- Per l'opzione \--cri-socket\ qui, specifichiamo il socket CRI al socket di runtime del contenitore che è disponibile su \/run/containerd/containerd.sock\ . Se stai utilizzando Container Runtime diverso, devi modificare il percorso del file socket oppure puoi semplicemente rimuovere questa opzione \--cri-socket\ perché kubeadm rileverà automaticamente il socket Container Runtime.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///run/containerd/containerd.sock
Di seguito è riportato l'output quando si inizializza il cluster Kubernetes sul server \cplane1\.
Al termine dell'inizializzazione, puoi visualizzare un messaggio del tipo \Il tuo piano di controllo Kubernetes è stato inizializzato correttamente!\ con alcuni importanti messaggi di output per l'impostazione delle credenziali Kubernetes e la distribuzione del componente aggiuntivo di rete Pod, la procedura per aggiungere il nodo di lavoro al tuo cluster Kubernetes.
Prima di iniziare a utilizzare il cluster Kubernetes, dovrai configurare le credenziali Kubernetes. Esegui il comando seguente per configurare le credenziali Kubernetes.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Ora puoi utilizzare il comando \kubectl\ per interagire con il tuo cluster Kubernetes. Esegui il seguente comando \kubectl\ per verificare le informazioni sul cluster Kubernetes. E dovresti vedere il piano di controllo Kubernetes e i core in esecuzione.
kubectl cluster-info
Per ottenere informazioni complete sul tuo Kubernetes, puoi utilizzare l'opzione dump, quindi \kubectl cluster-info dump\.
Dopo che Kubernetes Control Plane è in esecuzione, esegui il seguente comando per installare il plug-in di rete Flannel Pod. Questo comando eseguirà automaticamente il file binario \flanneld\ ed eseguirà alcuni baccelli di flanella.
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Controlla l'elenco dei pod in esecuzione sul tuo Kubernetes utilizzando il seguente comando. se l'installazione di Kubernetes ha esito positivo, dovresti vedere tutti i pod principali per Kubernetes in esecuzione.
kubectl get pods --all-namespaces
Aggiunta di nodi di lavoro a Kubernetes
Dopo aver inizializzato il piano di controllo Kubernetes sul server \cplane1\, aggiungerai i nodi di lavoro \worker1\ e \worker2\ al cluster Kubernetes.
Passa al server \worker1\ ed esegui il comando \kubeadm join\ seguente per aggiungere \worker1\ al cluster Kubernetes. Potresti avere token e hash ca-cert diversi, puoi vedere i dettagli di queste informazioni sul messaggio di output quando inizializzi il nodo del piano di controllo.
kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28
Nel seguente output, puoi vedere che il server \worker1\ è unito dal cluster Kubernetes.
Successivamente, passa al server \worker2\ ed esegui il comando \kubeadm join\ per aggiungere \worker2\ al cluster Kubernetes.
kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28
Vedrai lo stesso messaggio di output al termine del processo.
Ora torna al server del piano di controllo cplane1\ ed esegui il seguente comando per controllare tutti i pod in esecuzione sul cluster Kubernetes. Dovresti vedere che ci sono pod aggiuntivi su ogni componente Kubernetes.
kubectl get pods --all-namespaces
Infine, controlla e verifica tutti i nodi disponibili sul cluster Kubernetes utilizzando il comando kubectl\ riportato di seguito. Dovresti vedere che il server cplane1\ è in esecuzione come piano di controllo Kubernetes e il server \worker1\ e i server \worker2\ sono in esecuzione come nodo di lavoro.
kubectl get nodes -o wide
Conclusione
Durante questo tutorial, hai terminato la distribuzione del cluster Kubernetes con server Ubuntu 22.04 a tre nodi. Il cluster Kubernetes è in esecuzione con un piano di controllo e due nodi di lavoro. È in esecuzione con containerd come container runtime per il tuo cluster Kubernetes e il plug-in di rete Flannel per il collegamento in rete dei pod sul tuo cluster. Hai configurato Kubernetes Cluster completamente, puoi iniziare a distribuire le tue applicazioni nel cluster Kubernetes o provare a installare Kubernetes Dashboard per saperne di più sul tuo ambiente Kubernetes.