Ubuntu 20.04 LTS Sunucusuna Kubernetes Kurulumu

Kubernetes Nedir?

Temel düzeyde, bir veya daha fazla makinede çalışan konteynerleri (docker, rkt) çalıştırmak ve yönetmek için Google tarafından tasarlanmış bir sistemdir. Öngörülebilirlik, ölçeklenebilirlik ve yüksek kullanılabilirlik sağlayan yöntemler kullanarak konteynerlerin yaşam döngüsünü yönetmek için kullanılır. Uygulamalarınızı yatay veya dikey ölçekleyebilir, sıfır kesinti ile güncelleyebilirsiniz.Daha sonrasında Open Source olarak herkesin kullanımına açılmıştır. Kubernetes kelimesi Yunanca kökenlidir ve dümenci veya pilot anlamına gelir. Kubernetes artık containerlar ve dağıtılmış uygulama için pazar lideri ve endüstri standartlarını düzenleme aracıdır.

 

2006 yılında Google ve Linux mühendislerinden oluşan bir ekip bu dezavantajı ortadan kaldırmak için Cgroups adında Linux çekirdeğini genişleten bir girişim başlattı. Konteyner olarak tanımlanan bu girişim, tüm işletim sistemini kurmak yerine uygulamanın ihtiyacı olan yapıları temelindeki işletim sisteminden çekiyor ve bu sayede çok küçük sanal makineler kurulmasına imkan tanıyordu.

Bu bilgiler ışığında kubernetes’in çözdüğü ve çözmeye aday olduğu noktalar ;

  • Tüm alt yapıyı tek bir bütün olarak görmemize/yönetmemize olanak sağlıyor.
  • Alt yapımızı daha iyi kullanmamıza olanak veriyor.
  • Containerlarda health check yaparak kontrollü çalışmasını sağlıyor.
  • Bir container herhangi bir sebepten fail duruma geçerse, yenisinin ayağa kaldırılmasını sağlıyor.
  • Maintenance yada failing durumlarında HA şeklinde bir node üzerindeki uygulamaları bir diğerine kesintisiz şekilde taşınmasını sağlıyor.
  • Conteinerların belirlenen kriterlerde auto-scale edilmesini sağlıyor ve aynı zamanda scale olan containerlere yük dağılımını da sağlıyor.
  • Yeni versiyonların herhangi bir kesinti olmadan deploy edilmesini sağlıyor.
  • Service discover gibi bir özellik ile ne-nerde bilmemize olanak sağlıyor.
  • Key/Value Store yani konfigürasyonları containerler dışında store edilmesini sağlıyor.
  • Containerlerin izole bir networkte haberleşmesini sağlıyor.

 

Kubernetes Terminoloji

Pod=Fiziksel makinelerin üzerinde VM kurmuştuk , bu VM lerin üzerine de Container konumlandırmıştık, şimdi bu 2 sinin arasına bir katman daha koyuyoruz buna da pod diyoruz.

Replica Set= Benim bir pod’um var, bundan ‘X’ kadar istiyorum durumunu sağlayan birimdir.Pod’un birisi öldüğünde bakıyor ve yeniden bir pod ayağa kaldırıyor ve IP atıyor.-Podların süpervizözrüdür.-Podların scale kontrolünün yapıldığı yerdir.

Services= Herşeyin ve herkesin birbirinden haberdar olmasını sağlayan birimdir.

Namespaces= Kubernetes de objeleri ayırmamıza/gruplamamıza yarar.

Kubectl=Kubernetes deki CLI’dır.

Kubeadm=Kubernetes clusterın yaratılmasını/upgrade edilmesini sağlar.

Kubelet=Kubernetes in tüm node larda bulunan agentı , tüm iletişim bu agent üzerinden sağlanıyor.

Kube-Proxy=Kubernetes networkudür.Podlara IP adresi proxy ile atanır.Kube-Proxy aynı zamanda bir servisin altındaki tüm podlara load balance özelliği kazandırır.

Kube-apiserver=İşlemler için gerekli istekleri kabul eder ve yönlendirir.

Kube-scheduler=Kimin nerde çalışması gerektiğine karar verir.

Kube-controller-manager=Uygulamayı izler ve istenilen duruma (desired state) getirilmesini sağlar.

Etcd=Dağıtık key/value stroe dur.Kubernetes in tek stateful bileşenidir.

Imperative Mode =C gibi java gibi istenilen durumların alt alta yazıldığı moddur.

Declarative Mode = Olmasını istediğimiz durumu belirttiğimiz moddur, replica sette belirttiğimiz durum,bundan ‘X’ kadar istiyorum şeklindedir.

 

Konuya teknik olarak yaklaştığımıza ise; hatırlarsanız container’lar linux namespace’leri sayesinde birbirlerinden ayrılmaktadır. Farklı namespace’deki process, network, storage v.s. birbirlerini göremeyecek, birbirlerinden izole olacaktır. Bu yaklaşımdan yola çıkarsak, Kubernetes’te network ve storage gibi kavramlar için bu soyutlama pod düzeyindedir. Bunun anlamı, aynı pod içerisindeki container’lar aynı storage’ı, network’ü paylaşırlar. Bir pod’daki container’ın açtığı bir sokete yine aynı pod’daki bir diğer container localhost (127.0.0.1) üzerinden ulaşabilir. Bunun yanında Pod içeresindeki container’lar birbirleriyle SystemV semaforları ve POSIX ortak hafızaları sayesinde iletişim kurabilirler. Öte yandan tabi ki pod içerisindeki container’lar için de farklı soyutlamalar söz konusudur. Bu esneklik sayesinde farklı container’ları bir araya getirerek kullanımımıza uygun doğru bileşenleri oluşturabilir, yatayda bu bilenleri kolayca çoğaltabiliriz.

Pod’ların bir diğer önemli sorumluluğunun da soyutlama olduğu rahatlıkla söyleyebilirim. Kubernetes’de en fazla tercih edilen container runtime’ı Docker olmakla birlikte alternatifleri de olduğunu unutmamak gerekir. Bu noktada Pod kavramı Kubernetes için aynı zamanda Docker container kavramında bir soyutlama anlamına da gelmektedir. Kubernetes, container’ları değil pod’ları yönetmektedir.

Pod’ların doğası gereği birden fazla container’ı desteklemesi init container, app containers, side car v.b. mantıkların gelişmesine de olanak sunarak container’lardan bağımsız olarak biz geliştiricilere önemli esneklikler de kazandırmıştır. Örneğin; nginx container’ı ile belirli bir dizindeki dosyaları sunan bir pod’un ayağa kalkarken init container’ında sunulacak bu dosyaların hazırlanması sağlanabilir.

Bu esneklikte beraberinde bir sorumlulukta getirmektedir. Pod içerisindeki container’ların aynı kavnakları kullanmaları nedeniyle kaynak yönetimine dikkat edilmelidir. Örneğin; pod içeriside birden fazla container’ın aynı network portunu kullanmak istemesi hataya neden olacaktır.

Pod’larda dikkat edilmesi gereken bir diğer konu da Kubernetes’in pod’lara olan yaklaşımıdır. Kubernetes bakış açısıyla pod’lar fanidir. Herhangi bir zamanda Kubernetes tarafından çalışmaları sonlandırılabilir. Çalışmalarının sonlanması ile birlikte varsayılan olarak verileri de kaybolacaktır. Dolayısıyla Kubernetes’te geliştirilen uygulamaların saklamaları gereken verileri varsa ram ya da yerel disk alanından farklı yerlerde saklamaları tavsiye edilmektedir. Bu alan, uzaktaki bir veritabanı olabileceği gibi dosya sistemine bağlanmış bulut depolama alanları da olabilir.

Kubernetes’in pod’lara fani olarak yaklaşması, beraberinde pod’lar üzerinde koşan uygulamalarımızı yönetmek için bir soyutlama ihtiyacı doğurmaktadır. Bu noktada sahneye çıkan Controller’lar pod’ların doğrudan yönetilmesi yerine daha soyut olarak yönetilmesine olanak sunmaktadır. Bu durumda yönetimde ek bir kolaylığı beraberinde getirmektedir.

 

Anlatmaya çalışacağım Kubernets cluster yapısı 1 master node, iki 2 worker node şeklinde bir yapı olacak. Master node’da en az 2 CPU ve 4 GB RAM olması önerilir. Kurulum sırasında repository lerden paketler indireceğimiz için tüm nodelarda internet bağlantısı gerekli, sanallaştırma ortamını buna uygun ayarlamamız gerekir. Tahmin edeceğiniz gibi kubernetes container runtime olarak docker kullanacağız.

 

  • Master Node : 10.128.0.2
  • Worker Node 1 : 10.128.0.3
  • Worker Node 2 : 10.128.0.4

Kurulum aşamasının daha kolay anlaşabilmesi adına kurulumu 3 aşamaya böldüm. Bu aşamalardan birincisi sanal ortamda kurulum yaptığım için Sanal Makinele Network Yapılandırılması ikinci aşama master node konfigurasyonu ve üçüncü aşama worker node konfigurasyonu.

Ben bu eğitimi Google Cloud Platformunda gerçekleştirdim.Kendi gmail hesabınızla 1750 $ Dolar tutarına kadar 365 gün süreyle kullanabilme  imkanı sunuyor.Bu platform bana gereksiz iş yükünden kurtulmamı sağladı( Tek tek isoları indirmek daha sonra vmware workstation üzerinden kurulum …vs işler) Burada kendime bir tane manage olarak kullanacağım olan master node ve her iki sunucu da koşturacağım olan worker-node olmak üzere toplamda üç tane sunucu hazırladım.Üç sunucu da işletim sistemi olarak Ubuntu 20.04 LTS versiyonu kuruldu.

 

 

Gerekli kurumları tamamladıktan sonra manage sunucumuz olan ana sunucuda gerekli kurulumları sırasıyla kurmaya başlayabiliriz.

Docker ve Kubernetes depolarını ayarlayın:

Liman işçisi için GPG anahtarını indirin.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

Docker deposunu ekleyin.

# Docker, Ubuntu 20.04 Focal LTS için veri havuzunu yayınladı. 
# https://docs.docker.com adresinden en son sürümleri alabiliriz

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

Kubernetes için GPG anahtarını ekleyin.

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

 

Kubernetes deposunu ekleyin.

cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

 

Depoyu güncelleyin.

sudo apt-get update

 

Docker ve Kubernetes paketlerini kurun.

# Kurulumla ilgili sorunları önlemek için aynı sürümleri kullanın. 
sudo apt-get install -y docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs) kubelet=1.18.2-00 kubeadm=1.18.2-00 kubectl=1.18.2-00

 

Sürümleri yanlışlıkla yükseltilecek şekilde tutmak için.

sudo apt-mark hold docker-ce kubelet kubeadm kubectl
İptables bridge ‘i  etkinleştir.
# Tüm sunucularda Kubernetes için uygun ağ ayarlarına izin vermek için sysctl dosyasında bir değer ayarlayın. 
echo "net.bridge.bridge-nf-call-iptables=1" | sudo tee -a /etc/sysctl.conf

# Iptables için anında etkili olması için değişiklik yapmak
sudo sysctl -p 

 

Bu kısma kadar ki olan kodları diğer iki sunucuda tek tek çalıştırmamız gerekmektedir. Çalıştırdıktan sonra aşağıdaki kod adımlarını sırasıyla çalıştıralım.

 

Cidr değerini ileterek kümeyi başlatın; değer, seçtiğiniz ağ CLI türüne bağlı olacaktır.

# Calico ağı için 
# join komutunu kopyaladığınızdan emin olun
sudo kubeadm init --pod-network-cidr=192.168.0.0/16

Yukarıdaki kubeadm init komutunu çalıştırdıktan sonra en sonda aşağıdaki örnek şekilde bir kubeadm init çıkacak onu bir yerde tutalım çünkü o bizim ilerde lazım olacak.

Örnek=

kubeadm birleştirme 10.128.0.2:6443 --token swi0ci.jq9l75eg8lvpxz6g --discovery-token-ca-cert-hash sha256: 2c3cdfa898334b0dfc0f73bbccb998d03f61252ee50f0405c85b85b85

Yukarıdaki kubeadm init komutunun çıktısında yer alan aşağıdaki komutları manage sunucuda çalıştırılması gerekiyor.

 

Kümeyi geçerli kullanıcıyla kullanmaya başlamak için.

mkdir -p $ HOME /.kube
sudo cp -i /etc/kubernetes/admin.conf $ HOME /.kube/config
sudo chown $ ( id -u ) : $ ( id -g )  $ HOME /.kube/config

 

# Kümeyi Calico ağ eklentisi ile başlattıysanız bunu kullanın.

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Pod’ları kontrol edin.Bu komutu manage sunucu da çalıştırınız.

kubectl get nodes

 

Yukarıdaki komutu çalıştırdığımız da sadece manager sunucu da çalıştırdığımız da sadece bir Pod gözükecektir. Yine kubeadm init çıktısında en sonda yer alan kısmı hem worker-1 hem de worker-2 de çalıştırmamız gerkiyor. Çalıştırdıktan sonra yine kubectl get nodes komutunu tekrar çalıştırdığımızda üç sunucu gözükecektir ve böylece üç sunucu da birbiri ile haberleşecektir.

 

Not = Eğer kubeadm komutunu unutursak aşağıdaki komutu manage sunucu da çalıştırırsak o çıktıya yeniden ulaşabiliriz.

kubeadm token create --print-join-command

 

Kubernetes bu sıralar baya bir popüler, herkes uygulamalarını mikroservis mimarisinde yazıp, ölçeklemek istiyor. Doğal olarak bulut üzerinden hizmet alma imkanı yoksa, kurmayı da bilmek gerekiyor. Faydalı olması dileğiyle.

Yazı ile ilgili eleştirilerinizi yorum olarak geri bildirimde bulunabilirsiniz.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir