Sa punem chihuahua-urile (cele 3 lenovo M710q si M715q) la munca. Pe langa plex, qbittorrent, NFS si ce mai hosteaza ei pentru “home” vreau sa continui cu “learning path-ul”. Vor trebui sa hosteze un cluster de Kubernetes 1.32 pe care sa-mi fac eu mendrele. As vrea sa fac o copie a blogului asta… si sa o hostez acolo, in paralel cu asta. Pana acolo-i mult de munca asa ca incep cu ISO-ul cel mai recent de debian si fac 3VM-uri.
Am ajuns la momentul mult așteptat (de mine): avem un cluster de 3 servere Linux, bazate pe Debian. Dacă sunteți aici, presupun că știți deja să instalați un sistem de operare, așa că să trecem direct la configurație.
Configurație de bază
Am alocat resursele următoare pentru fiecare nod, iar rețeaua este configurată în 10.0.0.0/24. DHCP-ul a fost generos și a oferit următoarele IP-uri:
- k8s-control: 4vCPU, 8GB RAM, 20GB stocare (IP:
10.0.0.27
) - k8s-worker1: 4vCPU, 8GB RAM, 20GB stocare (IP:
10.0.0.28
) - k8s-worker2: 4vCPU, 8GB RAM, 20GB stocare (IP:
10.0.0.29
)
Teoretic, resursele pot fi reduse (de exemplu, 2vCPU și 4GB RAM), dar recomand să alocați mai mult pentru a evita problemele legate de pod-uri care nu pornesc din lipsă de resurse.
Editarea fișierului /etc/hosts
Pe toate nodurile, adăugăm următoarele intrări pentru a asigura rezolvarea corectă a numelor:
10.0.0.27 k8s-control.ill.lan k8s-control
10.0.0.28 k8s-worker1.ill.lan k8s-worker1
10.0.0.29 k8s-worker2.ill.lan k8s-worker2
Dezactivăm Swap
Pentru că kubelet
și swap-ul nu sunt prieteni:
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#/g' /etc/fstab
Configurăm kernel-ul pentru Kubernetes
Asigurăm că modulul kernel-ului este pregătit:
cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
$ modprobe overlay
$ modprobe br_netfilter
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
$ sysctl --system
Instalarea containerd
$ apt update
$ apt -y install containerd
Modificăm configurația pentru a activa SystemdCgroup:
$ containerd config default | tee /etc/containerd/config.toml >/dev/null 2>&1
nano /etc/containerd/config.toml
Căutați secțiunea [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
și schimbați SystemdCgroup = false
în SystemdCgroup = true
.
Repornim serviciul:
$ systemctl restart containerd && systemctl enable containerd
Adăugăm repo-ul Kubernetes
$ echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
Instalăm uneltele Kubernetes
$ apt update
$ apt install kubelet kubeadm kubectl -y
$ apt-mark hold kubelet kubeadm kubectl
Inițializarea cluster-ului Kubernetes
Ultimul pas important, parerea mea, boot-strap-on clusterului. Incepem usor si creăm un fișier kubelet.yaml
:
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: "1.32.0"
controlPlaneEndpoint: "k8s-control"
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
Rulăm comanda:
kubeadm init --config kubelet.yaml
Configurăm accesul pentru utilizatorul non-root (se ruleaza din userul din care planuiti sa folositi kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Testăm cluster-ul (din root sau userul non-root):
kubectl get nodes
kubectl cluster-info
Ar trebui să vedem control plane-ul activ. Pentru a adăuga noduri, folosim comanda kubeadm join
generată automat la finalul output-ului lui kubeadm init:
kubeadm join k8s-control:6443 --token TOKEN --discovery-token-ca-cert-hash SHA256
Alegerea și instalarea unui CNI
Kubernetes nu instalează by default niciun CNI (Container Network Interface) deoarece este compatibil cu prea multe opțiuni și lasă alegerea la latitudinea utilizatorului. Alegerea unui CNI depinde de nevoile rețelelor și de experiența utilizatorului.
Opțiuni populare pentru CNI și nivelul de dificultate:
- Flannel (ușor): Simplu de instalat și configurat, perfect pentru homelab-uri. Are performanțe decente pentru rețele simple.
Instrucțiuni de instalare - Calico (mediu): Ideal pentru cei care vor funcționalități suplimentare precum Network Policies. Este ușor de folosit în homelab-uri cu nevoi moderate.
Instrucțiuni de instalare - Cilium (avansat): Alegerea potrivită pentru cei care doresc performanță ridicată, securitate avansată și integrare cu eBPF. Recomandat pentru homelab-uri avansate.
Instrucțiuni de instalare
Exemplu de instalare Cilium:
Pare complex?
helm repo add cilium https://helm.cilium.io/
helm repo update
helm install cilium cilium/cilium --version 1.14.0 \
--namespace kube-system \
--set kubeProxyReplacement=partial \
--set k8sServiceHost=k8s-control \
--set k8sServicePort=6443
Ce am instalat eu? Calico. Pentru ca imi plac pisicile. Nu am avut alt motiv… e mediu de complex si ca e simplu de instalat.
Exemplu de instalare Calico.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
Proxmox din titlu este inutil. Putea fi foarte bine si HyperV, Vmware Workstation… Probabil pentru scopul de a invata as fi putut sa aleg si ceva mai usor, k3s, minikube… etc. Acum ca am un cluster de Kubernetes va trebui sa invat sa il folosesc, ca e ca acu 25 de ani cand am instalat primul meu linux… si acum ce fac? :))
Am calico, am toate componentele
Tema finala e wordpress in kubernetz… cu toate ca am impresia ca nu e nevoie sa complici atat un wordpress si ca ar fi chiar useless. Scopul de a pune asta pe blog este ca-s batran si imi notez ce fac :))
Pentru moment o sa ma multumesc sa testez un singur serviciu, un nginx.
$ kubectl create deployment nginx-app --image=nginx --replicas 2
$ kubectl expose deployment nginx-app --name=nginx-web-svc --type NodePort --port 80 --target-port 80
$ kubectl describe svc nginx-web-svc
Ar trebui ca din decscribe sa vad ce port am:
Nginx pe portul 32433 si ip-ul nodului (oricare din ele ca-s 2 replici, deci 2 ngincsi…)
Voilla, atatea comenzi pentru un nginx gol? Oare cat mai e pana la un wordpress functional?