Despre Linux

  • Facebook
  • Twitter
  • LinkedIn
  • Acasă
  • Linux
    • Comenzi Linux
    • Tutoriale
  • Kubernetes
  • RHCSA
    • Exerciții RHCSA
    • SELinux
    • Permisiuni
  • General
    • Open source
  • Contact

Construirea unui cluster Kubernetes (K8s) pe CentOS 7 în KVM

24 martie 2018 By Bobses 6 comentarii

Kubernetes este un instrument open source de gestionare și orchestrare a containerelor docker într-un cluster de servere. Kubernetes (prescurtat k8s) a fost dezvoltat de Google și donat către Cloud Native Computing Foundation. Kubernetes realizează o separare între serverele pe care este instalată distribuția Linux și aplicațiile care rulează pe aceste servere. Nu voi insista mai mult pe ceea ce este și ce poate face Kubernetes - din moment ce citiți acest articol înseamnă că aveți idee despre subiect.

Setarea unui cluster Kubernetes presupune existența unui master și a mai multor noduri, cunoscute și ca noduri worker. Din nodul master se gestionează clusterul și nodurile sale, folosind comenzile kubeadm și kubectl.

În articol voi prezenta instalarea ultimei versiuni Kubernetes 1.9.6 pe CentOS 7, cu ajutorul utilitarului kubeadm, pe un sistem de virtualizare KVM (nativ Red Hat). Am construit 3 mașini virtuale cu CentOS 7 minimal installation. Un server va fi master, iar celelalte două vor fi nodurile worker.

Pe nodul master vor fi instalate următoarele componente:

  • API Server - furnizează API-ul kubernetes folosind fișiere json/yaml
  • scheduler - realizează programarea taskurilor, cum ar fi lansarea containerelor pe nodurile worker, în funcție de disponibilitatea resurselor
  • controller manager - principala sa sarcină este să monitorizeze și să regleze starea sistemului, din cea actuală în cea dorită, prin lansarea de poduri
  • etcd - este o bază de date de tipul cheie - valoare; stochează configurația clusterului și starea sa
  • utilitarul kubectl - este un utilitar în linia de comandă cu ajutorul căruia ne putem conecta la API server pe portul 6443; se folosește de administratorul sistemului pentru a crea poduri, servicii, etc.

Pe nodurile worker vor fi instalate următoarele componente:

  • kubelet - este un agent care rulează pe fiecare nod worker, se conectează la docker și are în grijă crearea, lansarea, ștergerea containerelor
  • kube-proxy - rutează traficul către containerul potrivit în funcție de adresa IP și numărul portului al cererii de intrare
  • pod - podul este definit ca un grup de containere care lansat pe un singur nod worker

Pregătirea infrastructurii

Avem nevoie, după cum am spus, de 3 mașini virtuale cu CentOS 7 minimal. Nu insist asupra instalării lor în KVM, dar trebuie să precizez că fiecare din cele 3 servere trebuie să aibă câte un IP static; pentru asta, în momentul instalării, din panoul de instalare vom merge la Network&Hostname --> Configure; în tabul IPv4 Settings selectăm pe Manual, click pe Add și introducem IP-ul dorit din clasa furnizată de rețeaua virtuală virbr0 a KVM (192.168.122.0/24), având grijă să completăm și valorile pentru Gateway și DNS Server. Tot aici se poate stabili și hostname-ul mașinii respective (dacă nu se setează aici, poate fi stabilit ulterior, cu ajutorul comenzii hostnamectl):


Presupunem că am stabilit IP-urile interne astfel:

  • 192.168.122.200 - master
  • 192.168.122.201 - worker1
  • 192.168.122.202 - worker2

După ce am lansat cele 3 mașini virtuale, urmăm pașii de mai jos pentru MASTER și nodurile WORKER. Pentru ușurință (putem copia ușor comenzile cu copy/paste), recomand conectarea prin ssh la fiecare din cele 3 mașini.

Pași care trebuie realizați pe nodul MASTER

1. Dezactivare swap și SELinux

După ce ne conectăm la instanța aleasă ca master, trebuie să dezactivăm swap-ul și SELinux:

# swapoff -a

Comentăm linia corespunzătoare swap-ului din fișierul /etc/fstab, ca să nu mai fie montat la următorul reboot:

# vi /etc/fstab

#UUID=7d054795-97bb-450d-b0f6-0f2c8e4a73f5 swap swap defaults 0 0

Pentru început, setăm SELinux ca permisiv, după care vom edita fișierul /etc/selinux/config:

# setenforce 0
# vi /etc/selinux/config

Schimbăm valoarea corespunzătoare din enforced în disabled:

SELINUX=disabled

Stabilim hostname-ul mașinii și verificăm:

# hostnamectl set-hostname kube-master
# bash
# cat /etc/hostname

2. Firewall

Stabilim regulile firewall-ului și încărcăm modulul br_netfilter în kernel:

# firewall-cmd --permanent --add-port=6443/tcp
# firewall-cmd --permanent --add-port=2379-2380/tcp
# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10251/tcp
# firewall-cmd --permanent --add-port=10252/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --reload
# modprobe br_netfilter
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

Vom edita fișierul /etc/hosts unde vom adăuga cele 3 linii de mai jos (vom edita acest fișier atât pentru master, cât și pentru fiecare nod în parte):

# vi /etc/hosts

192.168.122.200 kube-master
192.168.122.201 kube-worker1
192.168.122.202 kube-worker2

3. Configurarea repository Kubernetes

Pachetele necesare instalării k8s nu sunt disponibile în depozitele CentOS 7 sau RHEL, de aceea este necesar să adăugam manual acest repo pe fiecare mașină din cluster:

# vi /etc/yum.repos.d/kubernetes.repo

[kubernetes] name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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

4. Instalare Kubeadm și Docker

După ce am configurat depositul K8s, vom rula următoarea comandă pentru a instala kubeadm și docker:

# yum install kubeadm docker -y

Lansăm serviciile kubelet și docker, după care le activăm ca să pornească după reboot:

# systemctl restart docker && systemctl enable docker
​# systemctl restart kubelet && systemctl enable kubelet

5. Inițializarea serverului Master K8s

Rulăm următoarea comandă:

# kubeadm init

Exemplu de ieșire:

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 --token f98fd5.199d89c073002918 192.168.122.200:6443 --discovery-token-ca-cert-hash sha256: 4ffb6b1fa77283b4ea1d37bfac7c83 33339b29e6a216a40f41346150aabe 691e

Output kubeadm init

Vom rula ca user obișnuit următoarele comenzi (dăm comanda exit pentru a ieși de sub userul root):

[[email protected] ~]# exit
[[email protected] ~]$ mkdir -p $HOME/.kube
[[email protected] ~]$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]$ chown $(id -u):$(id -g) $HOME/.kube/config

Copiați și salvați într-un fișier linia care va face join-ul viitoarelor noduri worker în cluster; exemplu:

  kubeadm join --token f98fd5.199d89c073002918 192.168.122.200:6443 --discovery-token-ca-cert-hash sha256: 4ffb6b1fa77283b4ea1d37bfac7c83 33339b29e6a216a40f41346150aabe 691e

6. Lansarea rețelei în cluster

Pentru a vizualiza starea actuală a clusterului:

$ kubectl get nodes
$ kubectl get pods --all-namespaces

[[email protected] ~]$ kubectl get nodes
NAME          STATUS     ROLES     AGE       VERSION
kube-master   NotReady   master    1m        v1.9.6

[[email protected] ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                         READY     STATUS    RESTARTS   AGE
kube-system   etcd-kube-master             1/1       Running   0          12s
kube-system   kube-dns-6f4fd4bdf-72pwr     0/3       Pending   0          58s
kube-system   kube-proxy-j2mks             1/1       Running   0          58s
kube-system   kube-scheduler-kube-master   0/1       Pending   0          3s

După cum se observă, clusterul este format, în acest moment, doar din MASTER, dar care nu este încă în starea Ready. Pentru aceasta, este necesar să lansăm podul de network, în așa fel încât toate containerele și toate podurile, indiferent pe ce nod se află, să se vadă și să poată comunica între ele. Kubernetes poate folosi mai multe add-on-uri pentru acest lucru (flannel, weave, calico, romana...). Noi vom instala weave.

Comenzile de mai jos se execută ca user obișnuit:

$ export kubever=$(kubectl version | base64 | tr -d '\n')
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"

serviceaccount "weave-net" created
clusterrole "weave-net" created
clusterrolebinding "weave-net" created
daemonset "weave-net" created

$

Rulăm, din nou, comenzile de mai jos pentru verificarea statusului:

$ kubectl get nodes
$ kubectl get pods --all-namespaces

[[email protected] ~]$ kubectl get nodes
NAME          STATUS    ROLES     AGE       VERSION
kube-master   Ready     master    3m        v1.9.6

[[email protected] ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                   READY     STATUS    RESTARTS   AGE
kube-system   etcd-kube-master                       1/1       Running   0          2m
kube-system   kube-apiserver-kube-master             1/1       Running   0          2m
kube-system   kube-controller-manager-kube-master   1/1       Running   0          1m
kube-system   kube-dns-6f4fd4bdf-72pwr               3/3       Running   0          2m
kube-system   kube-proxy-j2mks                       1/1       Running   0          2m
kube-system   kube-scheduler-kube-master             1/1       Running   0          2m
kube-system   weave-net-wxldc                        2/2       Running   0          46s

MASTER-ul fiind configurat, este timpul să trecem la setarea celor două noduri worker.

Pași care trebuie realizați pe fiecare nod WORKER

1. Dezactivare swap și SELinux

Pentru fiecare worker se urmează pașii descriși mai sus pentru MASTER - click aici.

Setați hostname-ul fiecărei mașini (asta dacă n-ați făcut-o la instalrea CentOS):

# hostnamectl set-hostname kube-worker1
# hostnamectl set-hostname kube-worker2

2. Firewall

Pentru fiecare worker se configurează următoarele reguli pentru firewall, după care încărcăm modulul br_netfiler:

# firewall-cmd --permanent --add-port=10250/tcp
# firewall-cmd --permanent --add-port=10255/tcp
# firewall-cmd --permanent --add-port=30000-32767/tcp
# firewall-cmd --permanent --add-port=6783/tcp
# firewall-cmd  --reload
# modprobe br_netfilter
# echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables

3. Configurare repository Kubernetes

Pe fiecare nod se creează fișierul repo pentru K8S:

# vi /etc/yum.repos.d/kubernetes.repo

În interiorul noului fișier se scriu următoarele:

[kubernetes] name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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

4. Instalare kubeadm și docker

Pe ambele mașini worker se rulează comenzile:

# yum install kubeadm docker -y

Lansăm serviciile kubelet și docker, după care le activăm ca să pornească după reboot:

# systemctl restart docker && systemctl enable docker
# systemctl restart kubelet && systemctl enable kubelet

5. Introducerea nodurile worker în cluster

Pe fiecare server destinat introducerii în cluster trebuie să rulăm comanda copiată mai sus, după ce am rulat kubeadm init pe MASTER:

# kubeadm join --token f98fd5.199d89c073002918 192.168.122.200:6443 --discovery-token-ca-cert-hash sha256: 4ffb6b1fa77283b4ea1d37bfac7c83 33339b29e6a216a40f41346150aabe 691e

Vom primi un mesaj asemănător cu cel de mai jos, care confirmă că join-ul s-a făcut cu succes:

Node join complete
Run 'kubectl get nodes' on the master to see this machine join

Verificare după finalizarea clusterului

Cam asta e tot. Nu mai rămâne decât să verificăm statusul noilor noduri introduse în cluster. Pentru aceasta, vom rula comenzile de mai jos pe MASTER:

[[email protected] ~]$ kubectl get nodes
NAME           STATUS    ROLES     AGE       VERSION
kube-master    Ready     master    9m        v1.9.6
kube-worker1   Ready     <none>    1m        v1.9.6
kube-worker2   Ready     <none>    1m        v1.9.6

[[email protected] ~]$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                   READY     STATUS    RESTARTS   AGE
kube-system   etcd-kube-master                       1/1       Running   0          8m
kube-system   kube-apiserver-kube-master             1/1       Running   0          8m
kube-system   kube-controller-manager-kube- master   1/1       Running   0          8m
kube-system   kube-dns-6f4fd4bdf-72pwr               3/3       Running   0          9m
kube-system   kube-proxy-4kxm2                       1/1       Running   0          1m
kube-system   kube-proxy-j2mks                       1/1       Running   0          9m
kube-system   kube-proxy-zvclm                       1/1       Running   0          1m
kube-system   kube-scheduler-kube-master             1/1       Running   0          8m
kube-system   weave-net-blwgg                        2/2       Running   0          1m
kube-system   weave-net-rqpr2                        2/2       Running   0          1m
kube-system   weave-net-wxldc                        2/2       Running   0          7m
[[email protected] ~]$

Cluster Kubernetes format dintr-un master și 2 workeri

Se observă că cele două noduri worker au statusul Ready.

Am instalat cu succes Kubernetes 1.9.6 și am făcut și join în cluster la 2 workeri; toată munca nu a durat mai mult de 1 oră. Puteți adăuga câte noduri worker doriți - principiul este același.


În mod asemănător se poate instala Kubernetes în VirtualBox; de asemenea, aceiași pași pot fi urmați și la instalarea unui cluster k8s în cloud.

Lumea vă stă la dispoziție: kubernetes.io conține tot ceea ce doriți să aflați despre Kubernetes. Mai adaug un singur link: kubectl cheat sheet.

Distrați-vă cu Linux și Kubernetes! 🙂

Partajează asta:

  • Dă clic pentru a partaja pe Facebook(Se deschide într-o fereastră nouă)
  • Dă clic pentru a partaja pe LinkedIn(Se deschide într-o fereastră nouă)
  • Dă clic pentru a partaja pe Twitter(Se deschide într-o fereastră nouă)

Similare

Din categoria: Tutoriale Etichete: CentOS 7, containere, docker, k8s, kubernetes, KVM

Trackbacks

  1. Role-based access control (RBAC) în Kubernetes | Despre Linux spune:
    26 iulie 2021 la 10:23

    […] de azi, poate fi folosit atât clusterul Kubernetes făcut cu k3s din Oracle Cloud, cât și un alt cluster k8s instalat local în KVM sau […]

    Răspunde
  2. Certified Kubernetes Administrator (CKA) - cum să treci examenul din prima încercare | Despre Linux spune:
    12 februarie 2020 la 22:19

    […] nu vă bazați numai pe aceste platforme online: construiți-vă singuri mai multe clustere locale în KVM sau Virtualbox cu kubeadm și exersați (folosiți Ubuntu ca OS pentru noduri, căci asta este […]

    Răspunde
  3. Prometheus Operator: administrare Prometheus, Alertmanager și Grafana în Kubernetes | Despre Linux spune:
    26 ianuarie 2019 la 13:23

    […] Cluster Kubernetes bazat pe kubeadm și docker-in-docker | Despre Linux la Construirea unui cluster Kubernetes (K8s) pe CentOS 7 în KVM […]

    Răspunde
  4. Cluster Kubernetes bazat pe kubeadm și docker-in-docker | Despre Linux spune:
    17 ianuarie 2019 la 22:07

    […] indicat să lucrăm cu el dacă vrem să ne păstrăm munca pentru mai mult timp - pentru asta, clusterul ridicat cu mașini virtuale este ideal (dar durează mult mai mult configurarea […]

    Răspunde
  5. Minikube, cel mai simplu mod de a rula local Kubernetes | Despre Linux spune:
    30 iunie 2018 la 15:24

    […] articol anterior am instalat local un întreg cluster Kubernetes: un master și cel puțin 2 noduri. Această […]

    Răspunde
  6. Cum se folosește Helm în Kubernetes | Despre Linux spune:
    29 aprilie 2018 la 18:48

    […] ce am construit propriul cluster Kubernetes, a venit timpul să lansăm containere cu aplicații. Pe lângă modalitatea clasică de a lansa un […]

    Răspunde

Lasă un răspuns Anulează răspunsul

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Copyright © 2023 · Bobses

Administrează consimțămintele pentru cookie-uri
Pentru a oferi cea mai bună experiență, folosim tehnologii, cum ar fi cookie-uri, pentru a stoca și/sau accesa informațiile despre dispozitive. Consimțământul pentru aceste tehnologii ne permite să procesăm date, cum ar fi comportamentul de navigare sau ID-uri unice pe acest site. Dacă nu îți dai consimțământul sau îți retragi consimțământul dat poate avea afecte negative asupra unor anumite funcționalități și funcții.
Funcționale Mereu activ
Stocarea tehnică sau accesul sunt strict necesare în scopul legitim de a permite utilizarea unui anumit serviciu cerut în mod explicit de către un abonat sau un utilizator sau în scopul exclusiv de a executa transmiterea unei comunicări printr-o rețea de comunicații electronice.
Preferințe
Stocarea tehnică sau accesul este necesară în scop legitim pentru stocarea preferințelor care nu sunt cerute de abonat sau utilizator.
Statistici
Stocarea tehnică sau accesul care sunt utilizate exclusiv în scopuri statistice. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
Stocarea tehnică sau accesul sunt necesare pentru a crea profiluri de utilizator pentru a trimite publicitate sau pentru a urmări utilizatorul pe un site web sau pe mai multe site-uri web în scopuri de marketing similare.
Administrează opțiunile Administrează serviciile Administrează vânzătorii Citește mai multe despre aceste scopuri
Vizualizează preferințele
{title} {title} {title}