Kubeadm ile Kubernetes Cluster’ı Kurulumu

Ecren Nur Esen
TurkNet Technology
Published in
5 min readOct 31, 2023

Herkese Merhaba Cloud Infrastructure Intern sürecimde deneyimlediğim Kubernetes Cluster’ı kurulumunu ve kurulum adımlarının ne işe yaradıklarını kendimce anlatmaya çalışacağım. İyi okumalar..

Tüm Worker ve Master’larda yapılması gerekenler;

/etc/hosts altına tüm makinelerin ip’lerini ve hostname’lerini girerek başlıyoruz.

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

Yukarıdaki komut /etc/modules-load.d/containerd.conf adında bir dosya oluşturur ve bu dosyanın içine "overlay" ve "br_netfilter" gibi çekirdek modüllerini yüklemeyi talep eder.

overlay Modülü : Containerd ve Kubernetes tarafından kullanılan bir dosya sistemini etkinleştirir. Overlay dosya sistemi, konteynerlerin kök dosya sistemlerini katmanlar halinde bir araya getirerek izolasyonu ve hızlı başlatmayı sağlar. Bu, konteynerlerin hızlıca oluşturulmasını ve çalıştırılmasını sağlar.

br_netfilter modülü: Bu modül, ağ paketlerini düzgün bir şekilde yönlendirmek ve ağ düğümleri arasında iletişimi sağlamak için kullanılır. Kubernetes cluster’ı içindeki ağ iletişimi için bu modül gereklidir. Ayrıca, ağ politikalarının ve güvenlik kurallarının uygulanmasına yardımcı olur.

Özetle, bu işlem, Containerd tabanlı Kubernetes cluster’ınızın gereksinimlerini karşılamak için gereken çekirdek modüllerini yüklemeyi amaçlar.

sudo modprobe overlay
modprobe br_netfilter

modprobe komutu, çekirdek modüllerini yüklemek veya etkinleştirmek için kullanılır, overlay dosya sistemi modülü ve br_netfilter modülü yukarıda etkinleştirilmiştir.

cat <<EOF | 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

Bu komut, bir Linux sisteminde, /etc/sysctl.d/99-kubernetes-cri.conf adında bir konfigürasyon dosyası oluşturur ve bu dosyanın içine üç adet kernel (çekirdek) parametresi ekler. Bu parametreler, Kubernetes ve Containerd (Container Runtime Interface - CRI) gibi konteyner teknolojilerinin düzgün çalışabilmesi için gereklidir.

net.bridge.bridge-nf-call-iptables = 1: Bu parametre, IP tablolarına erişmeden önce ağ paketlerini kontrol etmek için kernel modülü tarafından kullanılır. Bu ayarın değeri "1" olarak ayarlandığında, kernel, ağ paketlerini işlerken IP tablolarını kullanır. Kubernetes, ağ politikalarını uygularken bu parametreye ihtiyaç duyar.
net.ipv4.ip_forward = 1: Bu parametre, IPv4 yönlendirmeyi etkinleştirmek için kullanılır. Linux sisteminin ağ trafiğini yönlendirebilmesi ve konteynerler arasında iletişim sağlayabilmesi için gereklidir.
net.bridge.bridge-nf-call-ip6tables = 1: Bu parametre, IPv6 için net.bridge.bridge-nf-call-iptables benzeri bir işlevi yerine getirir. Bu, IPv6 trafiği için kernel tarafından aynı işlevi sağlar.

Neden Yapıyoruz?

Bu ayarlar, Kubernetes cluster’ının düzgün çalışabilmesi için gerekli olan çekirdek parametrelerini etkinleştirir. Kubernetes, ağ politikalarını uygulamak, iç iletişimi sağlamak ve pod’lar arasında trafik yönlendirmesi yapmak gibi işlevselliğe sahiptir.
/etc/sysctl.d/99-kubernetes-cri.conf gibi bir konfigürasyon dosyası, bu ayarların kalıcı olmasını sağlar, yani her sistem yeniden başlatıldığında tekrar yapılandırmaya gerek kalmaz.

sudo sysctl --system

yukarıdaki komut ise çekirdek parametrelerini geçici olarak etkinleştirme yerine kalıcı hale getirir. Bu, her sistem yeniden başlatıldığında parametrelerin tekrar elle yapılandırılmasını gerektirmez. Yani, sistemin ayarları otomatik olarak başlangıçta yüklenir.

sudo apt-get update && sudo apt-get install -y containerd

yukarıda containerd kurulumunu gerçekleştirdik. Containerd, konteyner tabanlı uygulamaların çalıştırılması ve yönetilmesi için kullanılan bir konteyner çalıştırma motorudur.

sudo mkdir  -p /etc/containerd

containerd dizinini oluşturduk.

containerd config default | sudo tee /etc/containerdconfig.toml

containerd config default komutunun çıktısını /etc/containerdconfig.toml dosyasına yönlendirerek, Containerd'ı belirli bir yapılandırmayla başlatmak için kullanabileceğiniz bir yapılandırma dosyası oluşturmuş oluruz.

systemctl restart containerd
swapoff -a

swapoff -a komutu, Linux işletim sistemindeki tüm swap alanlarını kapatır veya devre dışı bırakır. Swap, sistem belleğinin bir uzantısı olarak kullanılan bir disk alanı türüdür. Swap, fiziksel bellek (RAM) tamamen dolu olduğunda veya sistem gereksinimlerini karşılayamayacak kadar fazla bellek tüketildiğinde kullanılır. Fakat kubernetes sistemlerinde Swap’a düşmek doğru kullanım değildir düşmemek için tamamıyla kapatılır. Peki Ram yetersiz kalırsa ne yapacağız sonuçta Swap alanı bizim sistemimizin performansını korumaya çalışıyor.. Ram’in yetersiz kaldığı durumlarda Node eklenmelidir.

sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release apt-transport-https

Bu komut dizini, özellikle bir Linux sistemine güvenlik sertifikaları, güncel paketler ve gerekli araçları yükleyerek, güncel ve güvenli bir sistem oluşturmayı hedefler.

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

Bu komutun amacı, Google’ın APT depoları ile ilgili GPG anahtarını sistemde tanıtmaktır. GPG anahtarları, paketlerin güvenilirliğini ve bütünlüğünü doğrulamak için kullanılır. Bu işlem, sistemde güvenlik açısından güvenilir bir şekilde Google’ın depolarından paketler indirilebilmesini sağlar.

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

bu komut, Kubernetes paketlerini kolayca yüklemek için gereken depo bilgilerini sağlar. Bu, Kubernetes’ı sistemimize kurmak ve güncellemek için kullanabileceğiniz bir adımdır.

apt-get update
sudo apt-get update && sudo apt-get install -y kubelet=1.27.0-00 kubeadm=1.27.0-00 kubectl=1.27.0-00

Kubernetes bileşenlerini (kubelet, kubeadm ve kubectl) yüklemek için kullanılır.

  • kubeadm, yeni bir Kubernetes kümesi oluşturmak ve kümesi yükseltmek için kullanılan bir araçtır.
  • kubectl, Kubernetes kümesi ile iletişim kurmak ve yönetim görevlerini gerçekleştirmek için kullanılır.
  • kubelet işletim sistemine kurulan Kubernetes düğümünde çalışır ve v konteynerlerin çalıştırılmasını, izlenmesini ve yönetilmesini sağlar.
sudo apt-mark hold kubelet kubeadm kubectl

Bu komut, bu belirli paketlerin sürümünün sabitlenmesini ve güncelleme işlemlerinden etkilenmemesini sağlar.

Sadece Control Plane’de yapılması gerekenler;

sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version 1.27.0

Kubernetes kümesini başlatmak veya yeni bir Kubernetes Master düğümünü başlatmak için kullanılan kubeadm komutunu çalıştırır.

Bu komutun ardından terminalde çıkan 3 komutu kopyalayıp sırasıyla ekrana basıyoruz;

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

mkdir -p $HOME/.kube: Bu komut, kullanıcı ev dizininde ($HOME) .kube adlı bir dizini oluşturur. Bu dizin, Kubernetes ile iletişim için kullanılan konfigürasyon dosyalarını içerecektir. -p bayrağı, gerektiğinde dizinin üst dizinlerini de oluşturur.

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config: Bu komut, /etc/kubernetes dizininde bulunan admin.conf adlı bir Kubernetes konfigürasyon dosyasını kullanıcı ev dizininizdeki .kube dizinine kopyalar. Bu konfigürasyon dosyası, Kubernetes kümesine yönetici (admin) olarak erişmek için kullanılır. -i bayrağı, hedef dizinde aynı isme sahip bir dosyanın zaten varlığını kontrol eder ve üzerine yazmadan önce onay ister.
sudo chown $(id -u):$(id -g) $HOME/.kube/config: Bu komut, kopyalanan config dosyasının sahipliğini ve izinlerini düzenler. $(id -u) ve $(id -g) ifadeleri, kullanıcı tarafından çalıştırılan işlem için kullanıcı kimliği (UID) ve grup kimliğini (GID) temsil eder. Bu, config dosyasının kullanıcıya ait olduğu ve kullanıcının bu dosyayı düzenleme yetkisine sahip olduğu anlamına gelir.

wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

Kubernetes için Calico CNI (Container Network Interface) ağ çözümünün manifest dosyasını indirip kaydediyoruz.

dosyanın içine giriyoruz vi /etc/calico.yaml şuan bende 4601. ve 4602. satırda yer alan comment out edilmiş 2 satır var bu satırları comment in ediyoruz. Satırlar;

- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
kubectl apply -f calico.yaml

bu komut, calico.yaml dosyasındaki ağ yapılandırma ve ağ hizmetlerini tanımlayan kaynakları Kubernetes kümesine uygular. Bu komutu çalıştırdığınızda, belirtilen ağ kaynakları Kubernetes kümesinde oluşturulur veya güncellenir, ve Calico ağ hizmetleri etkinleştirilir.

kubeadm token create --print-join-command

Bu komutun sonucunda, bir katılım komutu (join command) görüntülenir. Bu komutu kopyalayıp Worker Node’larımızda çalıştırıyoruz ve böylece Worker node’lar clustera dahil olmuş olurlar.

5 10 dakika sonra worker node’lar ready duruma gelecektir.

--

--

Ecren Nur Esen
TurkNet Technology

Cloud Infrastructure intern at TurkNet İletişim Hizmetleri | Computer Engineering student at Gazi University