Bok! Zovem se Sergej, ja sam DevOps u Surf-u. DevOps odjel u Surf-u ima zadatak ne samo da uspostavi suradnju među stručnjacima i integrira radne procese, već i da aktivno istražuje i implementira aktualne tehnologije u vlastitu infrastrukturu, kao i u infrastrukturu klijentâ.
U nastavku ću malo govoriti o promjenama u tehnološkom stogu za kontejnere s kojima smo se susreli prilikom proučavanja distribucije. CentOS 8 i o tome što je CRI-O i kako brzo postaviti izvršno okruženje uz njegovu pomoć za Kubernetes.

Zašto Docker nedostaje u standardnoj isporuci CentOS 8.
Nakon instalacije najnovijih glavnih izdanja RHEL 8 ili CentOS 8 ne može se ne primijetiti: u ovim distribucijama i službenim repozitorijima nedostaje aplikacija Docker, koje ideološki i funkcionalno zamjenjuju pakete Podman, Buildah (prisutan je u distribuciji prema zadanim postavkama) i CRI-O. To je povezano s praktičnom implementacijom standarda koje razvija, između ostalog, i tvrtka Red Hat u okviru projekta Open Container Initiative (OCI).
Cilj OCI, koji je dio The Linux Foundation, je stvaranje otvorenih industrijskih standarda za formate i izvršna okruženja kontejnera koji bi rješavali nekoliko zadataka. Prvo, ne bi smjeli biti u suprotnosti s filozofijom Linux-a (na primjer, u tom dijelu, da svaka aplikacija treba obavljati neku jednu radnju, dok Docker predstavlja svojevrsni kombajn za sve-u-jednom). U drugo, trebali bi ukloniti sve postojeće nedostatke u softveru. DockerTreće, trebali bi biti potpuno kompatibilni s poslovnim zahtjevima koje postavljaju vodeće komercijalne platforme za implementaciju, upravljanje i održavanje kontejneriziranih aplikacija (na primjer, Red Hat OpenShift).
Nedostaci Docker i prednosti novog softvera već su prilično detaljno opisane u , a detaljan opis svega što se nudi u okviru projekta OCI softverskog stoga i njegovih arhitektonskih značajki može se pronaći u službenoj dokumentaciji i člancima kako od samog Red Hat-a (dobar u Red Hat blogu), tako i u vanjskim .
Važno je napomenuti koju funkcionalnost imaju komponente predloženog stoga:
- Podman — izravna interakcija s kontejnerima i pohranom slika putem procesa runC;
- Buildah — sastavljanje i učitavanje slika u registar;
- CRI-O — izvršno okruženje za sustave orkestracije kontejnera (npr. Kubernetes).
Mislim da je za razumijevanje opće sheme interakcije između komponenti stoga korisno navesti ovdje shemu povezanosti Kubernetes c runC i nisko-nivojske biblioteke koristeći CRI-O:

CRI-O i Kubernetes pridržavaju se istog ciklusa izdanja i podrške (matrica kompatibilnosti je vrlo jednostavna: glavni verzije Kubernetes i CRI-O se podudaraju), a to, uz obzirom na usmjerenje na potpuno i sveobuhvatno testiranje rada ovog stoga od strane developera, daje nam pravo da očekujemo maksimalnu stabilnost u radu u svim scenarijima korištenja (ovdje pomaže i relativna lakoća CRI-O u usporedbi s Docker zbog usmjerenog ograničenja funkcionalnosti).
Prilikom instalacije Kubernetes na „pravi način“ (prema OCI-u, naravno) koristeći CRI-O na CentOS 8 nateknuli smo na male poteškoće, koje smo, međutim, uspješno prevazišli. Bit ću zadovoljan podijeliti s vama upute za instalaciju i konfiguraciju, koje će u zbiru trajati najviše 10 minuta.
Kako postaviti Kubernetes na CentOS 8 koristeći CRI-O okruženje
Preduslovi: minimalno jedan poslužitelj (2 jezgre, 4 GB RAM, pohrana ne manja od 15 GB) s instaliranim CentOS 8 (preporučuje se profil instalacije „Server“), kao i zapis za njega u lokalnom DNS-u (u najgorem slučaju, može se proći i sa zapisom u /etc/hosts). I ne zaboravite .
Sve operacije na poslužitelju obavljaju se pod korisnikom root, budite oprezni.
- U prvom koraku ćemo postaviti OS, instalirati i konfigurirati prethodne zavisnosti za CRI-O.
- Ažuriraćemo OS:
dnf -y update
- Nakon toga treba postaviti firewall i SELinux. Ovdje se sve oslanja na okruženje u kojem će raditi naš poslužitelj ili poslužitelji. Možete ili postaviti firewall prema preporukama iz , ili ako ste u pouzdanoj mreži ili koristite vanjski firewall, promijeniti zadanu zonu na pouzdanu ili isključiti firewall:
firewall-cmd --set-default-zone trusted firewall-cmd --reloadDa biste isključili firewall, možete koristiti sljedeću komandu:
systemctl disable --now firewalldSELinux treba isključiti ili prebaciti u „permissive“ režim:
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- učitaćemo potrebne module jezgra i pakete, postaviti automatsko učitavanje modula „br_netfilter“ pri pokretanju sistema:
modprobe overlay modprobe br_netfilter echo "br_netfilter" >> /etc/modules-load.d/br_netfilter.conf dnf -y install iproute-tc
- Kako bismo aktivirali preusmjeravanje paketa i ispravno obradili promet, postavit ćemo odgovarajuće postavke:
cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOFPrimijenit ćemo napravljene postavke:
sysctl --system
- Postavit ćemo potrebnu verziju CRI-O (glavna verzija CRI-O, kao što je već spomenuto, podudaraju se s potrebnom verzijom Kubernetes), budući da je posljednja stabilna verzija Kubernetes trenutačno 1.18:
export REQUIRED_VERSION=1.18Dodajmo potrebne repozitorije:
dnf -y install 'dnf-command(copr)' dnf -y copr enable rhcontainerbot/container-selinux curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo
- Sada možemo instalirati CRI-O:
dnf -y install cri-oObratite pažnju na prvi detalj koji srećemo tijekom instalacije: potrebno je urediti konfiguraciju CRI-O prije pokretanja servisa, budući da traženi komponenta conmon ima drugačiju lokaciju od navedene:
sed -i 's//usr/libexec/crio/conmon//usr/bin/conmon/' /etc/crio/crio.confSada možemo aktivirati i pokrenuti demon CRI-O:
systemctl enable --now crioMožete provjeriti status demona:
systemctl status crio
- Ažuriraćemo OS:
- Instalacija i aktivacija Kubernetes.
- Dodajmo potrebni repozitorij:
cat < /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOFSada možemo instalirati Kubernetes (verzije 1.18, kako je već navedeno):
dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
- Drugi važan detalj: budući da ne koristimo demona Docker, već koristimo demona CRI-O, prije pokretanja i inicijalizacije Kubernetes potrebno je unijeti odgovarajuće postavke u konfiguracijski datoteka /var/lib/kubelet/config.yaml, unaprijed stvarajući potrebni direktorij:
mkdir /var/lib/kubelet cat < /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd EOF
- Treći važan detalj s kojim se susrećemo tijekom instalacije: iako smo naveli korišteni vozač cgroup, njegovo postavljanje putem argumenata koji se predaju kubelet je zastarjelo (na što se izravno ukazuje u dokumentaciji), potrebno je dodati argumente u datoteku, inače se naš klaster neće inicijalizirati:
cat /dev/null > /etc/sysconfig/kubelet cat < /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' EOF
- Sada možemo aktivirati demon kubelet:
sudo systemctl enable --now kubeletKako postaviti control-plane ili worker čvorove u nekoliko minuta, možete iskoristiti .
- Dodajmo potrebni repozitorij:
- Vrijeme je da inicijaliziramo naš klaster.
- Za inicijalizaciju klastera izvršite komandu:
kubeadm init --pod-network-cidr=10.244.0.0/16Obavezno zapišite komandu za pridruživanje klasteru 'kubeadm join ...', koja će biti ponuđena na kraju izlaza, ili barem navedene tokene.
- Instalirajmo CNI plugin za rad s Pod mrežom. Preporučujem korištenje Calico. Možda popularniji Flannel ima problema s kompatibilnošću s nftables, a i Calico je jedina CNI implementacija preporučena i potpuno testirana od strane projekta Kubernetes:
kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml
- Za povezivanje worker čvora s našim klasterom potrebno je konfigurirati ga prema uputama 1 i 2, ili iskoristiti , zatim izvršiti komandu iz izlaza 'kubeadm init ...', koju smo zabilježili u prethodnom koraku:
kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN --discovery-token-ca-cert-hash $TOKEN_HASH
- Provjerimo je li naš klaster inicijaliziran i počeo raditi:
kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
Gotovo! Već možete postavljati korisne terete na vašem K8s klasteru.
- Za inicijalizaciju klastera izvršite komandu:
Što nas čeka naprijed
Nadam se da su vam gornje upute pomogle da uštedite nešto vremena i živaca.
Ishod procesa unutar industrije često ovisi o tome kako ih prihvata većina krajnjih korisnika i developera drugog softvera u odgovarajućoj niši. Dok nije sasvim jasno kakvom će ishodu inicijative OCI dovesti kroz nekoliko godina, rado ćemo to pratiti. Svoje mišljenje možete podijeliti odmah u komentarima.
Ostanite s nama!
Ovaj članak je nastao zahvaljujući sljedećim izvorima:
- Odjeljku o Container runtimes u
- projekta CRI-O na internetu
- Članicama na blogovima Red Hat: , i mnogim drugima
Izvor: habr.com
