Inštalácia Kubernetes klastru na Ubuntu pomocou kubeadm


V tomto návode vás prevediem krokmi na inštaláciu a nastavenie funkčného 3-uzlového Kubernetes klastru na Ubuntu Linux. Kubernetes je open-source systém na orchestráciu kontajnerov, ktorý sa používa na automatizáciu nasadzovania, správy a škálovania kontajnerových aplikácií.

V tomto článku podrobne zdieľame proces:

  • Príprava uzlov Kubernetes
  • Nastavenie úložísk
  • Inštalácia prostredia pre kontajnery
  • Inštalácia komponentov Kubernetes
  • Spúšťanie vášho klastra
  • inštalácia sieťového pluginu pre Kubernetes
  • Pridávanie nových pracovných uzlov do klastra

Poďme začať!

Konečný príručka k desktopu Ubuntu

Ovládnite Ubuntu ako profesionál – od krásnej úpravy plochy až po výkonnú automatizáciu v termináli. Ideálne pre vývojárov, správcov systémov a pokročilých používateľov, ktorí chcú mať úplnú kontrolu nad svojím pracovným prostredím.

Krok 1: Diagram systémov

Toto nastavenie je založené na nasledujúcom diagrame:

Nakonfigurujme názvy hostiteľov systému, aby sme mohli pokračovať k ďalším krokom:

Na hlavnom uzle:

Nastavte názov hosťa nasledovne:

sudo hostnamectl set-hostname k8s-master.example.com

Na pracovnom uzle 01:

Nastavte názov hostiteľa pomocou nástroja príkazového riadku hostnamectl.

sudo hostnamectl set-hostname k8s-node-01.example.com

Na pracovnom uzle 02:

Nastavte tiež názov hostiteľa pre pracovný uzol Kubernetes 02.

sudo hostnamectl set-hostname k8s-node-02.example.com

Keď je na každom hostiteľovi nastavený správny názov hostiteľa, vyplňte na každom uzle hodnoty, ktoré boli nastavené.

$ sudo vim /etc/hosts
192.168.2.2 k8s-master.example.com    k8s-master
192.168.2.3 k8s-node-01.example.com  k8s-node-01
192.168.2.4 k8s-node-02.example.com  k8s-node-02

Odhláste sa a znova prihláste, aby sa použilo nové nakonfigurované meno hostiteľa.

exit||logout

Krok 2: Vytvorte administrátorského používateľa

Pred vykonaním akýchkoľvek konfigurácií špecifických pre Kubernetes sa uistime, že sú splnené všetky závislosti. Tu vykonáme aktualizáciu systému a vytvoríme používateľa Kubernetes.

Aktualizujte systémové balíky na najnovšiu verziu na všetkých uzloch:

sudo apt update && sudo apt upgrade -y
[ -e /var/run/reboot-required ] && sudo reboot

Pridať používateľa na správu klastra Kubernetes:

sudo useradd -s /bin/bash -m k8s-admin
sudo passwd k8s-admin
sudo usermod -aG sudo k8s-admin
echo "k8s-admin ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/k8s-admin

Ak uprednostňujete zadávanie hesla sudo pri spúšťaní príkazov sudo ako používateľ k8s-admin, potom posledný riadok môžete ignorovať. Môžete otestovať, či sa pri sudo nezobrazí výzva na zadanie hesla:

$ su - k8s-admin
k8s-admin@k8s-master:~$ sudo su -
root@k8s-master:~# exit

Všetko vyzerá dobre, poďme pokračovať inštaláciou Docker enginu.

Krok 3: Nainštalujte Containerd

Kubernetes vyžaduje engine pre beh kontajnerov na spúšťanie kontajnerov. V tomto článku použijeme Containerd ako engine kontajnerov.

Uistite sa, že Docker nie je nainštalovaný. Ak je, odinštalujte ho.

sudo apt remove docker docker-engine docker.io

Nainštalujte závislosti:

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common

Importujte GPG kľúč repozitára Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Nainštalujte Docker engine.

sudo apt update && sudo apt install containerd.io

Služba sa spúšťa automaticky.

$ systemctl status containerd.service
● containerd.service - containerd container runtime
   Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
   Active: active (running) since  Sun 2024-07-14 21:22:30 UTC; 34min ago
     Docs: https://containerd.io
  Process: 4265 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
 Main PID: 4270 (containerd)
    Tasks: 8
   CGroup: /system.slice/containerd.service
           └─4270 /usr/bin/containerd

Môžete si tiež skontrolovať nainštalovanú verziu:

containerd --version

Krok 4: Inštalácia komponentov Kubernetes

Nainštalujte závislé nástroje.

sudo apt install apt-transport-https ca-certificates curl gpg -y

Nastavte verziu Kubernetes, ktorú chcete nainštalovať.

k8s_ver=1.30

Stiahnite si verejný podpisový kľúč pre repozitáre balíkov Kubernetes

curl -fsSL https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/Release.key | \
 sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/k8s.gpg

Pridajte oficiálne APT úložisko Kubernetes.

echo "deb https://pkgs.k8s.io/core:/stable:/v${k8s_ver}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list

Aktualizujte index balíkov apt:

sudo apt update

Inštalovať komponenty Kubernetes

Nainštalujte kubectl, kubelet, kubernetes-cni a kubeadm, komponenty hlavného uzla Kubernetes:

sudo apt install kubectl kubelet kubeadm kubernetes-cni

Potvrďte, že všetky binárne súbory balíkov sú prítomné v súborovom systéme.

$ which kubelet
/usr/bin/kubelet

$ which kubeadm
/usr/bin/kubeadm

Ak je swap zapnutý, vypnite ho.

sudo swapoff -a
sudo sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

Načítajte požadované moduly.

sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

Na načítanie počas spustenia spustite:

sudo modprobe overlay
sudo modprobe br_netfilter

Tiež nastavte konfigurácie sysctl.

sudo tee /etc/sysctl.d/kubernetes.conf<<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

Načítajte konfigurácie.

sudo sysctl --system

Konfigurujte containerd a reštartujte službu

sudo mkdir -p /etc/containerd
sudo containerd config default|sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd

Povoliť službu kubelet

sudo systemctl enable kubelet

Krok 5: Spustenie k8s riadiacej roviny

Všetky príkazy, ktoré budú vykonané v tejto sekcii, sú určené na spustenie na hlavnom uzle. Neprehadzujte žiadne z príkazov na pracovných uzloch Kubernetes. Komponenty Master Kubernetes poskytujú riadiacu rovinu klastra – API Server, Scheduler, Controller Manager. Robia globálne rozhodnutia o klastri, napríklad plánovanie a detekciu a reakciu na udalosti klastra.

Overte, či containerd funguje, stiahnutím základných obrazov Kubernetes.

$ sudo kubeadm config images pull
[config/images] Pulled registry.k8s.io/kube-apiserver:v1.30.2
[config/images] Pulled registry.k8s.io/kube-controller-manager:v1.30.2
[config/images] Pulled registry.k8s.io/kube-scheduler:v1.30.2
[config/images] Pulled registry.k8s.io/kube-proxy:v1.30.2
[config/images] Pulled registry.k8s.io/coredns/coredns:v1.11.1
[config/images] Pulled registry.k8s.io/pause:3.9
[config/images] Pulled registry.k8s.io/etcd:3.5.12-0

Ak máte niekoľko CRI zásuviek, použite --cri-socket na výber jednej:

# Containerd
sudo kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock

# For CRI-O
sudo kubeadm config images pull --cri-socket unix:///var/run/crio/crio.sock

Bootstrap (jediný uzol riadiacej roviny) – bez zdieľaného koncového bodu

Ak chcete nastaviť cluster bez použitia DNS endpointu, spustite:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --cri-socket unix:///run/containerd/containerd.sock

Bootstrap s zdieľaným koncovým bodom (DNS názov pre API riadiacej roviny)

Toto je ideálne pre viacero uzlov riadiacej roviny.

Nastavte DNS názov koncového bodu clusteru alebo pridajte záznam do súboru /etc/hosts.

$ sudo vim /etc/hosts
172.29.20.5 k8s-cluster.computingforgeeks.com

Vytvoriť klaster:

sudo sysctl -p
sudo kubeadm init \
  --pod-network-cidr=172.24.0.0/16 \
  --upload-certs \
  --control-plane-endpoint=k8s-cluster.computingforgeeks.com

Kde :

  • k8s-cluster.computingforgeeks.com smeruje na IP adresu LB pre vaše uzly riadiacej roviny k8s.

Ak pôjde všetko dobre, mali by ste dostať úspešnú správu s pokynmi, čo robiť ďalej:

---
Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.2.2:6443 --token 9y4vc8.h7jdjle1xdovrd0z --discovery-token-ca-cert-hash sha256:cff9d1444a56b24b4a8839ff3330ab7177065c90753ef3e4e614566695db273c

Konfigurujte prístup pre používateľa k8s-admin na hlavným serveri

Prepnite na k8s-admin a skopírujte konfiguračný súbor Kubernetes s informáciami o klastri.

sudo su - k8s-admin
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Overte nasadenie kontrolou informácií o klastri.

$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.2:6443
CoreDNS is running at https://192.168.2.2:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Krok 6: Inštalácia CNI pluginu

V tomto návode budeme používať Calico. Môžete si vybrať akýkoľvek iný podporovaný sieťový plugin.

Stiahnite si súbory operátora a vlastných zdrojov. Pre najnovšiu verziu si pozrite stránku s verziami.

Získajte najnovšie vydanie:

VERSION=$(curl --silent "https://api.github.com/repos/projectcalico/calico/releases/latest" | grep '"tag_name"' | sed -E 's/.*"([^"]+)".*/\1/')

Stiahnite inštalačné zdroje.

curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/${VERSION}/manifests/custom-resources.yaml 

Najprv nainštalujte operátora na váš klaster.

k8s-admin@k8s-master:~$ kubectl create -f tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgpfilters.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/apiservers.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/imagesets.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/installations.operator.tigera.io created
customresourcedefinition.apiextensions.k8s.io/tigerastatuses.operator.tigera.io created
serviceaccount/tigera-operator created
clusterrole.rbac.authorization.k8s.io/tigera-operator created
clusterrolebinding.rbac.authorization.k8s.io/tigera-operator created
deployment.apps/tigera-operator created

Aktualizujme aj Calico IP pool.

sed -ie 's/192.168.0.0/172.24.0.0/g' custom-resources.yaml

Potom použite konfigurácie manifestu.

k8s-admin@k8s-master:~$  kubectl create -f custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

Počkajte, kým bude Calico Pod v stave spustenia.

k8s-admin@k8s-master:~$ kubectl get pods --all-namespaces
NAMESPACE          NAME                                             READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-5476c484c4-rmmts                1/1     Running   0          37s
calico-apiserver   calico-apiserver-5476c484c4-z9phf                1/1     Running   0          37s
calico-system      calico-kube-controllers-6945f87bd4-2xwx4         1/1     Running   0          80s
calico-system      calico-node-tkwtv                                1/1     Running   0          80s
calico-system      calico-typha-65f575c9fc-xx8m8                    1/1     Running   0          81s
calico-system      csi-node-driver-kngdn                            2/2     Running   0          80s
kube-system        coredns-5dd5756b68-77x77                         1/1     Running   0          11m
kube-system        coredns-5dd5756b68-plpd6                         1/1     Running   0          11m
kube-system        etcd-k8s-master.example.com                      1/1     Running   0          11m
kube-system        kube-apiserver-k8s-master.example.com            1/1     Running   0          11m
kube-system        kube-controller-manager-k8s-master.example.com   1/1     Running   0          11m
kube-system        kube-proxy-bxq4x                                 1/1     Running   0          11m
kube-system        kube-scheduler-k8s-master.example.com            1/1     Running   0          11m
tigera-operator    tigera-operator-94d7f7696-xls25                  1/1     Running   0          3m20s

Uzol by mal byť teraz pripravený.

k8s-admin@k8s-master:~$ kubectl get nodes
NAME                     STATUS   ROLES           AGE   VERSION
k8s-master.example.com   Ready    control-plane   20m   v1.30.2

Krok 7: Nastavenie pracovných uzlov

Keď je Kubernetes klaster inicializovaný a hlavným uzlom je online, začnite konfiguráciu pracovných uzlov. Uzol je pracovný stroj v Kubernetes, môže byť virtuálnym strojom alebo fyzickým počítačom. Každý uzol je spravovaný hlavným uzlom a má služby potrebné na spustenie podov – docker, kubelet, kube-proxy.

1) Uistite sa, že je nainštalovaný runtime Containerd (pokryté)

Použite kroky uvedené v tomto článku na inštaláciu containerd

2) Pridajte repozitár Kubernetes (prebrané)

Uistite sa, že repozitár pre balíky Kubernetes je pridaný do systému.

3) Nainštalujte komponenty Kubernetes (Krok 4)

Keď pridáte repozitár Kubernetes, nainštalujte komponenty pomocou:

sudo apt install kubelet kubeadm kubectl kubernetes-cni

4) Pripojte uzol ku klastru:

Použite príkaz join uvedený po inicializácii Kubernetes clustra. Príkazy môžete zobraziť pomocou:

kubeadm token create --print-join-command

Po dokončení skontrolujte stav uzlov na masteri:

k8s-admin@k8s-master:~$ kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION
k8s-master    Ready     master    35m       v1.30.2
k8s-node-01   Ready     <none>    2m        v1.30.2
k8s-node-02   Ready     <none>    1m        v1.30.2

Krok 8: Overenie nastavenia Kubernetes

Vytvorte testovací názvový priestor:

$ kubectl create namespace test
namespace/test created

Nasadiť testovaciu aplikáciu

kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080

Zobraziť existujúce nasadenia:

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           1m

Zobraziť bežiace pody

$ kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
hello-node-5f76cf6ccf-br9b5   1/1       Running   0          1m

Na vyčistenie zdrojov spustite:

kubectl delete deployment hello-node

Krok 9: Nakonfigurujte dokončovanie kubectl

Povoľte automatické dopĺňanie príkazov kubectl v shelle. Kubectl podporuje automatické dopĺňanie, čo môže ušetriť veľa písania! Na povolenie automatického dopĺňania pre aktuálnu reláciu spustite:

source <(kubectl completion bash)

Ak chcete pridať automatické dopĺňanie kubectl do svojho profilu, aby sa v budúcich shelloch načítavalo automaticky, spustite:

echo "source <(kubectl completion bash)" >> ~/.bashrc

Ak používate zsh, upravte súbor ~/.zshrc a pridajte nasledujúci kód na povolenie automatického dopĺňania kubectl:

if [ $commands[kubectl] ]; then
source <(kubectl completion zsh)
fi

Alebo pri používaní Oh-My-Zsh upravte súbor ~/.zshrc a aktualizujte riadok plugins= tak, aby obsahoval plugin kubectl.

source <(kubectl completion zsh)

Rovnako relevantný je príkaz Top pre metriky kontajnerov

Materiály na tréning ovládania Kubernetes:

  • Najlepšie knihy na štúdium Kubernetes

Záver

Úspešne sme nasadili 3-uzlový Kubernetes cluster na serveroch s Ubuntu LTS. Naše ďalšie návody budú pokrývať Kubernetes HA, monitorovanie Kubernetes, ako nakonfigurovať externé úložisko a ďalšie zaujímavé veci. Sledujte nás!