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/configYou 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
Vom rula ca user obișnuit următoarele comenzi (dăm comanda exit
pentru a ieși de sub userul root
):
[root@k8s-master ~]# exit
[bobses@k8s-master ~]$ mkdir -p $HOME/.kube
[bobses@k8s-master ~]$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[bobses@k8s-master ~]$ 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
[bobses@kube-master ~]$kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master NotReady master 1m v1.9.6 [bobses@kube-master ~]$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
[bobses@kube-master ~]$kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-master Ready master 3m v1.9.6 [bobses@kube-master ~]$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:
[bobses@kube-master ~]$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 [bobses@kube-master ~]$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
[bobses@kube-master ~]$
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! 🙂
[…] 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 […]