Kubernetes nədir?

Elnur Mammadli
PASHA Bank
Published in
7 min readJan 14, 2020

Kubernetes Google tərəfindən Go proqramlaşdırma dilində yazılmış container orkestrator platformasıdır. Hal-hazırda Cloud Native Computing Foundation (CNCF) tərəfindən dəstək alır. Sadə dildə desək, bir və ya daha çox serverdə container-ləri icra və idarə etmək üçün yaradılmış platformadır. Kubernetes (helmsman) yunan sözüdür, mənası “sükanı idarə edən dənizçi” deməkdir. Bəzi mənbələrdə Kubernetes-ə k8s də (k + 8 simvol + s) deyilir. Kubernetes açıq mənbə kodlu platformadır, hansı ki, Linux container-ləri üzərində əməliyyatlar aparır.

Bu məqaləni yazmaqda məqsədim Kubernetes haqqında çox az biliyi olan, amma Kubernetes öyrənmək istəyən oxuculara az da olsa, kömək etməkdir. Məqalənin Azərbaycan dilində olması mənim üçün çox önəmli idi. Düşündüm ki, İngilis dilini bilən oxucular üçün Kubernetes haqqında keyfiyyətli mənbələr çoxdur, amma Azərbaycan dilində demək olar ki, yox səviyyəsindədir. Mənim fikrimcə, məqalə yazmaq istəyən hər bir şəxs İngilis dili ilə yanaşı Azərbaycan dilində də resursların inkişafına öz töhfəsini verməlidir.

Kubernetes-in hansı problemi həll etdiyini detallı anlamaq üçün ilk öncə bir neçə texnologiya haqqında minimum biliyə sahib olmaq lazımdır.

Məqalənin mündəricatı aşağıdakı kimidir.

  1. Container nədir?
  2. Niyə Kubernetes-ə ehtiyac var?
  3. Kubernetes necə işləyir?

Container nədir?

Əgər siz proqramlaşdırma ilə məşğul olursunuzsa, çox güman, son dövrlərdə container, Docker, rkt, CRI-O və s. haqqında eşitmisiniz.

ContainerVM (Virtual Machine) texnologiyalarının təyinatı eynidir: bir proqram təminatını və onun asılılıqlarını hər yerdə işlədə biləcək vahid halına gətirmək. Bu iki yanaşma arasında ən böyük fərq arxitektural yanaşmadır.

VM texnologiyası bizim üçün avadanlıq(hardware) səviyyəsində virtualizasiya təmin edir. VM real kompüterlərin təqlididir, hansı ki, proqram təminatlarını real kompüter kimi icra edir. VM-lər bu virtualizasiyanı hypervisor istifadə edərək fiziki maşın üzərində yaradır. Aşağıdakı diaqramda VM texnologiyasının ümumi yanaşması təsvir olunmuşdur.

VM texnologiyasından fərqli olaraq container texnolgiyasında əməliyyat sistemi səviyyəsində virtualizasiya tətbiq olunur. Əməliyyat sistemi səviyyəsində virtualizasiya user space-lər vasitəsilə təmin olunur. Container-lər VM-lər ilə çoxlu bənzərliklərə sahibdir. Nümunə olaraq qeyd etmək olar ki, onların da gizli şəbəkə interfeysi (private network interface), İP ünvanı, verilən əmrləri root olaraq icra etmə imkanı və s. mövcuddur. Ən böyük fərq ondan ibarətdir ki, VM-lərdən fərqli olaraq container eyni host əməliyyat sisteminin kernel özəliklərini digər container-lərlə bölüşür.

Container VM-dən fərqli olaraq hypervisor yox, container mühərriki üzərində çalışır. Günümüzdə ən məşhur container mühərriki kimi Docker istifadə olunur.

Docker” Linux container əsaslı Go proqramlaşdırma dilində yazılmış açıq kodlu layihədir. Docker Linux əməliyyat sisteminə 2008-ci ildə əlavə olunan Linux Containers (LXC) üzərinə qurulmuş bir texnologiyadır. Eyni əməliyyat sistemində bir-birindən izolə edilmiş container-lər LXC vasitəsilə təmin edilir. Göründüyü kimi LXC əməliyyat sistemi səviyyəsində virtualizasiya təqdim edir. LXC “namespace” və “control groups” özəlliklərindən istifadə edərək əməliyyat sistemi üzərində container-lərin yaradılmasını təmin edir. Əslində Docker heç də yeni texnologiya deyildir, sadəcə olaraq o, LXC-nin təmin etdiyi özəllikləri miras alaraq istifadəçi yönümlü yanaşma təqdim edir.

Niyə Kubernetes-ə ehtiyac var?

İlk öncə mən mikroservis arxitekturası haqqında məlumat vermək istərdim. Mənim fikrimcə, container orkestratorların son zamanlarda sürətli inkişafına təkan verən əsas amillərdən biri də mikroservislərin günümüzün ayrılmaz hissəsinə çevrilməsidir.

Qısası mikroservis arxitektural yanaşmasında bir proqram təminatı kiçik və bir-birindən izolə olunmuş servislərə bölünür. Bu servislər, adətən, əlaqəni HTTP protokolu üzərindən Restful API vasitəsilə qurur. İndi təsəvvür edin mövcud layihənizdə 100-ə yaxın mikroservis vardır və hər biri ayrı-ayrılıqda bir container-dir. Bizə elə bir platforma lazımdır ki, biz 100 ədəd mikroservisi cluster adlandırdığımız node-lar çoxluğu üzərində səmərəli paylayıb icra edə bilək. Həmçinin həmin platformanın cluster-in resursları haqqında detallı məlumat verə bilmə, container-in icra müddəti zamanında nə qədər resurs istifadə etdiyi haqqında informasiya ilə təmin etmə bacarığı olmalıdır.

Servislərimizdən hər hansısa birinin üzərinə normadan artıq yük düşərsə, bizim həmin servisi miqyaslama(scale) kimi bir ehtiyacımız ortaya çıxır.

Bütün bu ehtiyacları qarşılayan platformaya container orkestrator və ya cluster idarəedici deyilir. Bunlardan biri də Kubernetes-dir.

Kubernetes necə işləyir?

Kubernetes-in arxitekturası haqqında danışmazdan əvvəl Kubernetes terminologiyasından söhbət açmaq istərdim.

Node

Bildiyimiz kimi, Kubernetes həm də cluster idarəedicidir. Çox zaman biz böyük bir fiziki və ya virtual server əvəzinə bir neçə kiçik serverə sahib oluruq. Bu kiçik serverlərə ayrı-ayrılıqda node deyilir. Node-ların ayrılıqda istifadəsi ən yayılmış üsuldur, amma bu Kubernetesvari yanaşma deyildir. Node-lar çoxluğu isə cluster adlanır. Cluster-in böyük bir server kimi idarə olunmasında Kubernetes-in əvəzsiz rolu vardır. Bu zaman biz sahib olduğumuz bütün node-ların resurslarından bir bütün kimi yararlana bilirik.

Pod

Kubernetes daxilində ən kiçik vahid olan Pod haqqında məlumat vermək istərdim. Digər sistemlərdən fərqli olaraq Kubernetes birbaşa container-ləri icra etmir; bunun əvəzinə Kubernetes-də bir və ya bir neçə container-i özündə ehtiva edən pod anlayışı vardır. Pod daxilindəki hər bir container eyni resursları və lokal şəbəkəni bir-birilə paylaşır. Container-lər pod daxilində əlaqəni localhost üzərindən qura bilir.

Kubernetes üçün miqyaslana bilən və schedule edilən obyekt pod-dur, container yox. Əgər sizin proqram təminatınızdan istifadə çoxalarsa və bu zaman 1 instans cari yükləməni qəbul edə bilməzsə, o zaman siz Kubernetes vasitəsilə həmin proqram təminatının bir neçə nüsxəsini cluster səviyyəsində icra edə bilərsiniz.

Pod öz daxilində birdən çox container saxlaya bilər. Kubernetes yanaşması ondan ibarətdir ki, əgər bir neçə container-in bir-birindən çoxlu asılılığı varsa, onda həmin container-lərin elə eyni pod daxilində olması daha məqsədə uyğundur. Təsəvvür edin ki, sizin bir Python-da yazılmış veb proqram təminatınız var, bu, adi veb sayt və ya RESTful API ola bilər. Siz bu proqram təminatını serverdə Docker container kimi icra edirsiniz. Və bununla yanaşı, sizə elə bir container lazımdır ki, həmin proqram təminatından müəyyən metrikaları toplasın. Kubernetes belə hallarda hər iki container-in eyni pod daxilində olmasını tövsiyə edir.

Hər bir pod-un ümumi cluster səviyyəsində unikal IP-si vardır. Və unutmayaq ki, pod-lar daimi deyil və bu o deməkdir ki, əgər bir pod “ölürsə” , onun əvəzinə yenidən yaranan pod digərindən fərqlidir və yeni bir unikal IP-yə sahibdir.

Digər Kubernetes obyektləri barədə növbəti məqalədə detallı söz açacağam.

Kubernetes cluster iki əsas hissədən ibarətdir:

  1. Master (Control Plane)
  2. Worker Nodes

Master node aşağıdakı elementlərdən ibarətdir.

  1. etcd paylanılmış açar-dəyər məlumat bazası
  2. API Server
  3. Controller manager
  4. Scheduler

Hər bir worker node-da aşağıdakı komponentlər mövcuddur.

  1. Kubelet
  2. Container Runtime Interface (Docker, rkt və.s)
  3. Kube-proxy

etcd

Etcd CoreOs tərəfindən yaradılmış açıq mənbə kodlu açar-dəyər (key-value store) məlumat bazasıdır. Kubernetes kimi etcd də hal-hazırda CNCF tərəfindən inkişaf etdirilir. Kubernetes bütün cluster məlumatlarını, metadata-ları, hansı k8s obyektinin yaradılmalı olduğunu və digər məlumatları etcd-də saxlayır.

API Server

K8s-də API Server digər obyektlər üçün mərkəzi yer hesab olunur. Heç bir komponentə birbaşa çıxış yoxdur, bütün sorğular API Server üzərindən təmin olunur. Etcd-də heçbir məlumat API Serverin yoxlamasından keçmədən saxlanılmır. Son istifadəçi API Server ilə kubectl və ya REST Api vasitəsilə əlaqə saxlayır.

Controller Manager

Controller Manager bütün cluster-in vəziyyətindən cavabdeh olan bir daemon sistemdir. Cluster-in cari vəziyyətini arzuolunan vəziyyətə gətirmək Controller Manager-in işidir. Controller Manager-in daxilində bir neçə controller mövcuddur, bunlara misal olaraq, DeploymentControllers, StatefulSet Controllers, Namespace Controllers, PersistentVolume Controllers və s. göstərmək olar.

Scheduler

Planlayıcının(Scheduler) əsas işi pod-un hansı uyğun node üzərində yaradılmasını təmin etməkdir. Tətbiq olunmuş alqoritmə əsasən planlayıcı hansı node-un resurslarının pod-a uyğun olduğunu və ya yalnız xüsusi işarələnmiş node(node affinity) üzərində pod-un icra olunmalı olduğunu təyin edir. Və əldə olunmuş məlumatı etcd-yə qeyd edir.

Kubelet

Kubelet agentdir, hansı ki, cluster daxilindəki hər bir worker node üzərində çalışır. Kubelete-in əsas vəzifəsi onun icra olunduğu node-da yaradılmalı olacaq pod-lar haqqında məlumatı API Server vasitəsilə etcd-dən əldə etmək və Container Runtime Interface vasitəsilə həmin pod-un yaradılmasını təmin etməkdir.

Kube-proxy hər bir worker node üzərində şəbəkə əlaqəsini təmin edir və təməl səviyyədə load balance etmə bacarığı vardır. Yaradılmış pod-a unikal IP təyin etmək də kube-proxy-nin cavabdehliyindədir.

Aşağıdakı diaqram əsasında Kubernetes-in necə işlədiyini izah etməyə çalışacağam.

Təsəvvür edək ki, biz öz terminalımızdan kubectl vasitəsilə aşağıdakı əmri icra edirik. Aşağıdakı sətrdə biz Kubernetes-dən 3 ədəd nginx pod-u qaldırmasını təvəqqe edirik.

kubectl run nginx --image=nginx --replicas=3

İlk öncə bizim sorğumuzun doğruluğu kubectl tərəfindən yoxlanacaqdır. Əgər sorğumuz tələb olunan qaydalara uyğundursa, məsələn, heç bir sintaksis səhv yoxdursa, doğru image qeyd olunubsa , düzgün Kubernetes obyektin yaradılması istənilirsə, ondan sonra kubectl tərəfindən Rest sorğu hazırlanır: 1. kube-api-server-ə göndərilir. kube-api-server-də müəyyən yoxlamalar məsələn: server side authentication və authorization aparıldıqdan sonra 2. məlumat etcd-də qeyd olunur, 3. kube-scheduler 3 ədəd pod yaradılmalı olduğu məlumatını alır və daxilində implementasiya olunmuş alqoritmə əsasən pod-lara uyğun node təyin olunur və bu məlumatı yenidən etcd-yə qeyd edir. 4. hər bir worker node üzərində olan kubelet agenti kube-api-server vasitəsilə etcd-də onun node-u üzərində pod yaradılmalı olduğunu öyrənir və 5. container runtime-a (Docker) həmin pod-u yaratmaq üçün sorğu göndərir. Pod-un yaradılmasından container runtime cavabdehdir. Kubelet ilə container runtime arasında rabitə protocol buffersgRPC API vasitəsilə qurulur. Pod yaradıldıqdan sonra həmin pod-a unikal IP təyin etməyi və dünyaya çıxışını kube-proxy təmin edir.

Kubernetes ilə daha yaxından tanışlıq və obyektləri haqqında praktik biliklər əldə etmək üçün yeni məqalə paylaşmağa çalışacağam.

--

--

Elnur Mammadli
PASHA Bank

I am Software Developer at PASHA Bank OJSC. I am autodidact.