What is Kubernetes?

Kubernetes, hem bildirime dayalı yapılandırmayı hem de otomasyonu kolaylaştıran, kapsayıcılı iş yüklerini ve hizmetleri yönetmek için taşınabilir, genişletilebilir, açık kaynaklı bir platformdur. Büyük, hızla büyüyen bir ekosisteme sahiptir. Kubernetes hizmetleri, desteği ve araçları geniş çapta mevcuttur.

Kubernetes adı, dümenci veya pilot anlamına gelen Yunanca kökenlidir. Kısaltma olarak K8s, "K" ve "s" arasındaki sekiz harfin sayılmasından kaynaklanır. Google, 2014 yılında Kubernetes projesini açık kaynaklı hale getirdi. Kubernetes, Google'ın 15 yılı aşkın ölçekte üretim iş yüklerini yürütme deneyimini topluluktan gelen türünün en iyisi fikirler ve uygulamalarla birleştiriyor.

  • Yerel bir makinede, bulutta veya kendi veri merkeziniz için bir Kubernetes kümesi dağıtmak üzere Kubernetes'i kullanabilirsiniz.
  • Kubernetes, kontrol düzleminin Linux üzerinde çalışması için tasarlanmıştır. Kümenizde uygulamaları Linux veya Windows dahil diğer işletim sistemlerinde çalıştırabilirsiniz.

Geleneksel dağıtım dönemi: İlk zamanlarda, kuruluşlar uygulamaları fiziksel sunucularda çalıştırıyordu. Fiziksel bir sunucudaki uygulamalar için kaynak sınırlarını tanımlamanın bir yolu yoktu ve bu, kaynak ayırma sorunlarına neden oluyordu. Örneğin, fiziksel bir sunucuda birden fazla uygulama çalışıyorsa, bir uygulamanın kaynakların çoğunu kullandığı ve bunun sonucunda diğer uygulamaların düşük performans gösterdiği durumlar olabilir. Bunun için bir çözüm, her uygulamayı farklı bir fiziksel sunucuda çalıştırmak olacaktır. Ancak kaynaklar yetersiz kullanıldığından ve kuruluşların birçok fiziksel sunucuyu sürdürmesi pahalı olduğundan bu ölçeklenmedi.

Sanallaştırılmış dağıtım dönemi: Çözüm olarak sanallaştırma tanıtıldı. Tek bir fiziksel sunucunun CPU'sunda birden fazla Sanal Makine (VM) çalıştırmanıza olanak tanır. Sanallaştırma, uygulamaların VM'ler arasında izole edilmesini sağlar ve bir uygulamanın bilgilerine başka bir uygulama tarafından serbestçe erişilemeyeceği için bir güvenlik düzeyi sağlar.

Sanallaştırma, fiziksel bir sunucudaki kaynakların daha iyi kullanılmasına olanak tanır ve bir uygulamanın kolayca eklenebilmesi veya güncellenebilmesi, donanım maliyetlerini düşürmesi ve çok daha fazlası nedeniyle daha iyi ölçeklenebilirlik sağlar. Sanallaştırma ile bir dizi fiziksel kaynağı tek kullanımlık sanal makineler kümesi olarak sunabilirsiniz. Her VM, sanallaştırılmış donanımın üzerinde kendi işletim sistemi de dahil olmak üzere tüm bileşenleri çalıştıran tam bir makinedir.

Konteyner dağıtım dönemi: Konteynerler VM'lere benzer, ancak İşletim Sistemini (OS) uygulamalar arasında paylaşmak için rahat yalıtım özelliklerine sahiptirler. Bu nedenle, kaplar hafif kabul edilir. VM'ye benzer şekilde, bir kapsayıcının kendi dosya sistemi, CPU paylaşımı, bellek, işlem alanı ve daha fazlası vardır. Temel altyapıdan ayrıldıkları için bulutlar ve işletim sistemi dağıtımları arasında taşınabilirler.

Konteynerler, aşağıdakiler gibi ekstra faydalar sağladıkları için popüler hale geldi:

  • Çevik uygulama oluşturma ve devreye alma: VM görüntüsü kullanımına kıyasla kapsayıcı görüntüsü oluşturmanın artan kolaylığı ve verimliliği.
  • Sürekli geliştirme, entegrasyon ve devreye alma: Hızlı ve verimli geri almalarla (görüntünün değişmezliği nedeniyle) güvenilir ve sık kapsayıcı görüntüsü oluşturma ve devreye alma sağlar.
  • Dev ve Ops endişe ayrımı: Uygulama kapsayıcısı görüntülerini dağıtım zamanından ziyade oluşturma/yayınlama zamanında oluşturun, böylece uygulamaları altyapıdan ayırın.
  • Gözlemlenebilirlik: Yalnızca işletim sistemi seviyesindeki bilgileri ve ölçümleri değil, aynı zamanda uygulama durumunu ve diğer sinyalleri de ortaya çıkarır.
  • Geliştirme, test ve üretim genelinde çevresel tutarlılık: Bir dizüstü bilgisayarda bulutta olduğu gibi çalışır.
  • Bulut ve işletim sistemi dağıtım taşınabilirliği: Ubuntu, RHEL, CoreOS üzerinde, şirket içinde, büyük genel bulutlarda ve başka herhangi bir yerde çalışır.
  • Uygulama merkezli yönetim: Sanal donanım üzerinde bir işletim sistemi çalıştırmaktan mantıksal kaynakları kullanarak bir işletim sistemi üzerinde bir uygulama çalıştırmaya soyutlama düzeyini yükseltir.
  • Gevşek bir şekilde birleştirilmiş, dağıtılmış, esnek, serbest bırakılmış mikro hizmetler: Uygulamalar daha küçük, bağımsız parçalara bölünür ve dinamik olarak dağıtılabilir ve yönetilebilir - tek bir büyük tek amaçlı makinede çalışan yekpare bir yığın değil.
  • Kaynak izolasyonu: Öngörülebilir uygulama performansı.
  • Kaynak kullanımı: Yüksek verimlilik ve yoğunluk.

Kubernetes Bileşenleri ve Görevleri

Kubernetes, konteynerleştirilmiş uygulamaları otomatik olarak dağıtmak, ölçeklemek ve yönetmek için kullanılan açık kaynaklı bir orkestrasyon platformudur. Temel olarak Control Plane ve Worker Node başta olmak üzere iki ana bölümden oluşur.

Aşağıda Kubernetes’in temel bileşenleri ve görevleri madde madde açıklanmıştır.

Control Plane, kümenin (cluster) beynidir. Tüm yönetim ve karar mekanizmaları burada çalışır.

  • kube-apiserver → Kubernetes kümesinin giriş kapısıdır.Tüm komutlar (kubectl, API çağrıları, CI/CD araçları vb.) buradan geçer ve REST API üzerinden çalışır. Kimlik doğrulama (authentication) ve yetkilendirme (authorization) işlemlerini yapar. Cluster’daki tüm bileşenler birbirleriyle bu servis üzerinden haberleşir.
  • etcd → Dağıtık ve tutarlı (distributed key-value) veri tabanıdır. Küme konfigürasyonu ve mevcut durum bilgisi burada saklanır. Pod’lar, servisler, node bilgileri gibi tüm metadata burada tutulur ve yedeklenmesi kritik öneme sahiptir.
  • kube-scheduler → Yeni oluşturulan Pod’ların hangi Node üzerinde çalışacağını belirler. Karar verirken CPU / RAM kaynak durumu, Node affinity / anti-affinity, Taint & toleration kuralları, QoS politikaları kriterlerini değerlendirir ve en uygun Node’a Pod’u atar.
  • kube-controller-manager → Kubernetes kontrol döngülerini çalıştırır. Sistem durumunu sürekli izler ve istenen durumla karşılaştırır. Önemli controller’lar ise, Node Controller, ReplicaSet Controller, Deployment Controller, Endpoint Controller üzerinden oluşur.
  • cloud-controller-manager → Bulut sağlayıcılarıyla entegrasyonu sağlar. AWS, Azure, GCP gibi platformlarla iletişim kurar.

Worker Node, uygulamaların gerçekten çalıştığı makinedir.

  • kubelet → Node üzerindeki ana ajandır. Control Plane’den gelen Pod tanımlarını alır. Container’ların çalıştığını kontrol eder ve Health check işlemlerini yürütür. Container runtime ile iletişim kurar.
  • kube-proxy → Ağ iletişimini yönetir ve service objelerinin çalışmasını sağlar. Pod’lar arası ve dış dünya ile network yönlendirmesini yapar. IP tables veya IPVS kullanabilir.
  • Container Runtime → Container’ları gerçekten çalıştıran bileşendir. Örnek runtime’lar: containerd ve CRI-O kullanabilirsiniz.
  • Pod → Kubernetes’in en küçük deploy edilebilir birimidir. Bir veya birden fazla container içerebilir. Aynı IP ve network namespace’i paylaşırlar ve genellikle tek container içerir.
  • Deployment → Pod’ların yönetilebilir versiyonudur ve Rolling update sağlar. Replica sayısını kontrol eder ve versiyon geçişlerinde sıfır kesinti hedefler.
  • ReplicaSet → Belirtilen sayıda Pod’un her zaman çalışmasını garanti eder ve deployment tarafından yönetilir.
  • Service → Pod’lara sabit bir erişim noktası sağlar ve Pod IP’leri değişse bile servis IP’si sabittir.
  • ConfigMap → Uygulama konfigürasyonlarını dışarıdan yönetmeyi sağlar. Ortam değişkeni veya dosya olarak mount edilebilir.
  • Secret → Hassas bilgileri (şifre, token, sertifika) saklar. Base64 encode edilmiş şekilde tutulur. RBAC ile korunmalıdır.
  • Ingress → HTTP/HTTPS trafiğini cluster içine yönlendirir. Domain bazlı routing sağlar. SSL termination yapılabilir.

Kubernetes Install

K8s yüklemeden önce aşağıdaki gereksinimlerin karşılanması gerekmektedir.

  • Uyumlu bir Linux ana bilgisayarı. Kubernetes projesi, Debian ve Red Hat tabanlı Linux dağıtımları ve paket yöneticisi olmayan dağıtımlar için genel talimatlar sağlar.
  • Makine başına 2 GB veya daha fazla RAM (daha azı, uygulamalarınız için çok az yer bırakır).
  • 2 CPU veya daha fazlası. (Aksi halde kurulum devam etmeyecektir.)
  • Kümedeki tüm makineler arasında tam ağ bağlantısı (genel veya özel ağ uygundur).
  • Her düğüm için benzersiz ana bilgisayar adı, MAC adresi ve product_uuid. Daha fazla ayrıntı için bakınız. https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#verify-mac-address
  • Makinelerinizde belirli portlar açık. Daha fazla ayrıntı için bakınız. https://kubernetes.io/docs/reference/ports-and-protocols/
  • Kubelet'in düzgün çalışması için takası (swap) devre dışı bırakmanız GEREKİR.

Bu kılavuzda, kurulumu iki adımda tamamlanacaktır. İlk olarak ön gereksinimler tamamlanmasının akabinde, ikinci kısımda container runtime ve kubernetes kurulacaktır.

  • Kurulum Ubuntu 20.04 LTS üzerinde gerçekleştirilecektir.
  • Kılavuzda kubernetes kısaltması olan k8s kullanılacaktır.

Step 1 | Genel Ayarlar

HostName MAC adresinin ve Product_uuid'nin Benzersiz Olması

Hostname isimleri iki node içinde benzersiz olmalıdır. Aşağıdaki komut satırını kullanarak makina isimlerini değiştirebilirsiniz. (Makinalarda isim değiştirdikten sonra yeniden başlatın.)

sudo vim /etc/hostname 

ip link komutunu kullanarak ağ arayüzlerinin MAC adreslerinin benzersiz olduğunu doğrulamalısınız.

ip link 

product_uuid benzersiz olduğunu aşağıdaki komutu kullanılarak  doğrulamalısınız.

sudo cat /sys/class/dmi/id/product_uuid 

Bazı sanal makineler aynı değerlere sahip olabilse de, donanım aygıtlarının benzersiz adreslere sahip olma olasılığı çok yüksektir. Kubernetes, kümedeki düğümleri benzersiz şekilde tanımlamak için bu değerleri kullanır. Bu değerler her düğüm için benzersiz değilse yükleme işlemi başarısız olabilir.

Birden fazla ağ bağdaştırıcınız varsa ve Kubernetes bileşenlerinize varsayılan yoldan erişilemiyorsa, Kubernetes küme adreslerinin uygun bağdaştırıcı üzerinden gitmesi için IP yolları eklemenizi öneririz.

Bağlantı Noktalarını Kontrol Edilmesi 

Fiziksel ağ güvenlik duvarlarına sahip şirket içi veri merkezi veya Genel Buluttaki Sanal Ağlar gibi katı ağ sınırlarına sahip bir ortamda Kubernetes çalıştırırken, Kubernetes bileşenleri tarafından kullanılan bağlantı noktalarının ve protokollerin farkında olmak yararlıdır. Kubernetes bileşenlerinin birbiriyle iletişim kurabilmesi için aşağıdaki gerekli bağlantı noktalarının açık olması gerekir. 

Control plane

Protocol Direction Port Range Purpose Used By
TCP Inbound 6443 Kubernetes API server All
TCP Inbound 2379-2380 etcd server client API kube-apiserver, etcd
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 10259 kube-scheduler Self
TCP Inbound 10257 kube-controller-manager Self

Kontrol düzlemi bölümünde etcd portları yer alsa da, kendi etcd kümenizi harici olarak veya özel portlarda da barındırabilirsiniz.

Worker node(s)

Protocol Direction Port Range Purpose Used By
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services† All

Bir portun açık olup olmadığını kontrol etmek için netcat gibi araçları kullanabilirsiniz. Örneğin:

nc 127.0.0.1 6443

Tüm varsayılan bağlantı noktası numaraları geçersiz kılınabilir. Özel bağlantı noktaları kullanıldığında, burada belirtilen varsayılanlar yerine bu bağlantı noktalarının açık olması gerekir.

Yaygın bir örnek, bazen 443 olarak değiştirilen API sunucusu bağlantı noktasıdır. Alternatif olarak, varsayılan bağlantı noktası olduğu gibi tutulur ve API sunucusu, 443'ü dinleyen ve istekleri varsayılan bağlantı noktasındaki API sunucusuna yönlendiren bir yük dengeleyicinin arkasına yerleştirilir.

Kurulum adımında geçici olarak, güvenlik duvarı kapalı şekilde devam edilecektir.

Swap Kapatılması ve Sistemin Güncellenmesi

Tüm node'larda swap'ı off duruma alıp kalıcı hale getirelim. Kubelet üzerinde çalıştığı Node'un bilgilerini anlık olarak controlplane'a iletebilmesi için swap kapatılmaktadır.

/swap.img satırını #/swap.img şeklinde değiştirip kaydederek swap kalıcı olarak disable etmiş oluyoruz.

sudo nano /etc/fstab 

Kubernetes kurulumuna başlamadan önce, tüm sunucuları update ve upgrade etmeliyiz.

sudo apt update && sudo apt upgrade -y && sudo reboot now

Step 2 | Container Runtime (Containerd) ve Kubernetes Kurulumu

Container pods çalıştırmak için Kubernetes bir container runtime kullanır. Varsayılan olarak Kubernetes, seçtiğiniz kapsayıcı çalışma zamanı ile arabirim oluşturmak için Kapsayıcı Çalışma Zamanı Arabirimini (CRI) kullanır. Bir çalışma zamanı belirtmezseniz, kubeadm, bilinen uç noktaların listesini tarayarak yüklü bir kapsayıcı çalışma zamanını otomatik olarak algılamaya çalışır. Birden çok veya hiç kapsayıcı çalışma zamanı algılanmazsa kubeadm bir hata atar ve hangisini kullanmak istediğinizi belirtmenizi ister.

 Aşağıda Kubernetes ile çalışan birkaç yaygın container runtime görebilirsiniz. Bu kısımda biz containerd kullanacağız.

  • containerd
  • CRI-O
  • Docker Engine
  • Mirantis Container Runtime

Daha fazla bilgi için bakınız.

https://kubernetes.io/docs/setup/production-environment/container-runtimes/

Not: v1.24'ten önceki Kubernetes sürümleri, dockershim adlı bir bileşen kullanılarak Docker Engine ile doğrudan entegrasyon içeriyordu . Bu özel doğrudan entegrasyon artık Kubernetes'in bir parçası değildir (bu kaldırma v1.20 sürümünün bir parçası olarak duyurulmuştur ). Bu kaldırma işleminin sizi nasıl etkileyebileceğini anlamak için Dockershim kaldırma işleminin sizi etkileyip etkilemediğini kontrol edin bölümünü okuyabilirsiniz.

Kurulum adımlarının tamamını tüm Node'larda uygulayacağız. Bu kılavuzda 1 Master node 1 Worker üzerinden devam edilecektir. Worker node isteğe bağlı arttırılabilir.

APT’den güvenli HTTPS protokokülü kullanarak indirmeleri gerçekleştirmek için transport paketini yükleyelim.

sudo apt-get install -y apt-transport-https ca-certificates curl 

Google’ın gpg anahtarını makinamıza ekleyelim.

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

Sunucu apt listesine Kubernetes apt deposunu ekleyelim.

echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list 

Apt paket listesini güncelleyelim, akabinde  Kubernetes kubeadm, kubelet, kubectl ve Containerd paketlerini yükleyelim.

sudo apt update && sudo apt install kubelet kubeadm kubectl containerd -y 

Sunucu güncellemesinde, Kubernetes'in ve Containerd'nin yükseltme işlemini gerçekleştirmemesi için apt-hold komutunu kullarak bu paketlerin güncelleme işlemini durduralım.

sudo apt-mark hold kubelet kubeadm kubectl containerd 

Cluster'ın overlay trafiği oluşturabilmesi, IP tables'in bridge trafiğini görebilmesi için kernel modüllerini etkin hale getirelim.

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter 

Sistemlerin reboot olduğunda, mevcut parametreleri korumaları için ayarları set ediyoruz.

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

Sunucuları yeniden başlatmadan sistem parametrelerini etkin hale getirelim.

sudo sysctl --system 

Containerd konfigurasyonu için klasör oluşturup, varsayılan konfigürasyonu uygulayalım.

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd 

Master Node Kurulumu

Kubeadm kurulumun başlatabiliriz, bu adımı Master Node üzerinde gerçekleştirmekteyiz. Komutu çalıştırdıktan sonra, bize aşağıdaki gibi hangi işlemleri yapmamız gerektiğini söyleyecektir. Ek olarak, Kubeadm'in kurulumunun tamamlanmasının ardından, kubeadm join sunucuip:port --token --discovery-token-ca-cert-hash sha256: satırı ile node'ları cluster'a dahil edeceğimiz için tamamını bir yere kopyalamamız gerekmektedir.

sudo kubeadm init 

kubectl'ın root olmayan kullanıcılarda çalışabilmesi için, aşağda ki komutları çalıştırıyoruz.

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

Alternatif olarak, root kullanıcısı olarak kullanmak isterseniz, aşağda ki komutu kullanabilirsiniz.

export KUBECONFIG=/etc/kubernetes/admin.conf

Pod Networkü Oluşturma

Cluster'da bir pod ağı oluşturmamız gerekmekte, K8s için bir çok alternatifi vardır, çoğunlukla Calico ağı kullanılmaktadır.

 Calico'nun en çok tercih edilmesinin nedeni pod bazında network policy oluşturulabiliyor olması.

Calico'yu kurmak için master node üzerinde komutları sırasıyla çalıştırılması gerekmektedir.

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

Worker Node'ları Cluster'a Dahil Etme

Worker node’ların cluster’a katılımlarını gerçekleştirmek için, kubernetes kurulum işleminin tamamlanmasının ardından son satırda belirttiği kubeadm join ile başlayan komutu worker node’lara uygulayarak, tümünü kubernetes cluster’ine dahil edilebilir.

sudo kubeadm join sunucuIPadresi:port --token w0srnb.pabg89t9tjzy4tbz
--discovery-token-ca-cert-hash sha256: xxxxx 

Master Node üzerinde, Kubernetes Cluster için mevcut node'ları listeleyip kontrol edin.

Eğer did you specify the right host or port ile ilgili bir hata alırsanız aşağıdaki komut satırını çalıştırın.

export KUBECONFIG=/home/$(whoami)/.kube/config

 

kubectl get nodes 

Kubernetes Cluster Çalıştığını Doğrulayın

 

 

 

 

 

 

 

 

 

 

 

kubectl delete service hello-node
kubectl delete deployment hello-node

 

 

 

Pod oluşturun.

kubectl run merhaba-dunya --image=techakademi/merhabadunya:1 --port=3000

Pod'a dışarıdan erişmek için, Node Port Servisi oluşturun.

kubectl expose pod merhaba-dunya --name=merhaba-service --port=3000 --type=NodePort

Servisimizin çalıştığını teyit etmek için kubectl get service komutunu kullanacağız.

kubectl get service merhaba-service

Servisimizin pod'unun hangi Node üzerinde çalıştığını tespit etmek için, kubectl get pods "pod-adı" -o wide komutunu kullanacağız.

kubectl get pods merhaba-dunya -o wide

Pod listeleme komutun çıktısı aşağıda ki şekilde olacaktır.

NAME            READY   STATUS    RESTARTS   AGE     IP            NODE          NOMINATED NODE   READINESS GATES
merhaba-dunya   1/1     Running   0          9m40s   172.16.90.3   kubeworker1   <none>           <none>

Pod'umuzun çalıştığı Node'u tablodaki NODE kolonunda görebilmekteyiz, bu örneğimizde kubeworker1 isimli node'umuzda çalışmakta, bu Node'un IP adresi (en üst listede mevcut) 192.168.1.74 idi.

Merhaba-service'ine erişmek için curl komutu ile http://NODE_ADI:PORT (Node adını kullanmak için, sunucuların /etc/hosts belgesine tüm node'ların adlarını ve IP adreslerini kaydetmiş olmanız gerkir.) veya http://NODE_IP:PORT kullanabiliriz, bunun haricinde doğrudan herhangi bir explorer üzerinden, cluster’ın herhangi bir sunucu ip adresini kullanrak http://suncuipadresi:port şeklinde de erişebiliriz.

curl http://192.168.1.75:32683

<!DOCTYPE html> <html lang="en" > <head>  <meta charset="UTF-8">  <title>Merhaba Kubernetes</title>  <meta name="viewport" content="width=device-width, initial-scale=1"><link rel="stylesheet" href="./style.css"> </head> <body>

Herhangi bir Explorer ile http://192.168.1.75:32683 adresini ziyaret ettiğimizde Merhaba Kubernetes web uygulamasını görebiliriz.

 

 

Blog'a Dön