Kubeadm İle Kubernetes Cluster Kurulumu
13 min read

Kubeadm İle Kubernetes Cluster Kurulumu

Kubeadm, Kubernetes clusterını kolayca oluşturmak ve yönetmek için kullanılan bir araçtır.
Kubeadm İle Kubernetes Cluster Kurulumu
Photo by Growtika / Unsplash

Kubeadm, Kubernetes clusterını kolayca oluşturmak ve yönetmek için kullanılan bir araçtır. Ayrıca Kubeadm, sunucunun Kubernetes'i çalıştırmak için gerekli tüm bileşenlere ve yapılandırmalara sahip olduğundan emin olmak için bir dizi ön kontrol gerçekleştirerek tüm kurulum sürecini kolaylaştırır.

Bu makalede, Kubeadm kullanarak Kubernetes kurulumunu adım adım anlatacağız ve daha sonra yeni bir Kubernetes cluster oluşturmak için Kubeadm'in diğer özelliklerini keşfedeceğiz.

1. Kubeadm Nasıl Çalışır?

Kubeadm kullanarak bir Kubernetes cluster initialize ettiğinizde kubeadm aşağıdakileri adımları sırasıyla gerçekleştirir.

  1. İlk olarak sistem durumunu doğrulamak için ön kontrolleri çalıştırır ve gerekli tüm cluster continer imagelerini register.k8s.io adresinden indirir.
  2. Daha sonra gerekli TLS sertifikalarını oluşturur ve bunları /etc/kubernetes/pki dizininde saklar.
  3. Ardından, /etc/kubernetes dizininde cluster bileşenleri için tüm kubeconfig dosyalarını oluşturur.
  4. kubelet servisini başlatır ve tüm cluster bileşenleri için statik pod manifestlerini oluşturur ve bunu /etc/kubernetes/manifests dizinine kaydeder.
  5. Static pod manifestlerinden tüm control-plane bileşenlerini başlatır.
  6. Ardından, core DNS ve Kubeproxy bileşenlerini kurar
  7. Son olarak, node bootstrap token'ini oluşturur.
  8. Çalışan düğümler, control-plane'e katılmak için bu token'ı kullanır.

Kubeadm kurulumunun sorunsuz bir şekilde tamamlanabilmesi ve ardından Kubernetes cluster işlemlerine geçebilmeniz için kubeadm kurulum öncesi bazı gereksinimleri tamamlamanız oldukça önemlidir. Aşağıdaki başlıkta yer alan adımları başarılı bir şekilde tamamladıktan sonra Kubeadm kurulumuna geçebilirsiniz.

💡
Bu yazıdaki tüm komutlar root kullanıcı ile çalıştırılmıştır. Sudoers olmayan farklı bir kullanıcı ile çalıştırmak istediğiniz sudo komutunu tüm komutların başına eklemeniz gerekir.

2. Kubeadm Kurulumu

Kubeadm ile Kubernetes cluster kurulumu için ilerleyen başlıklardaki işlemleri sırasıyla ve başarılı bir şekilde tamamlamalısınız.

3. Gereksinimler

Kubeadm kurulumuna geçmeden önce, aşağıdaki başlıklarda yer alan işlemleri sırası ile ve başarılı sonuç alacak şekilde tamamlamanız gerekmektedir. Aksi halde kubeadm kurulumu başarısız sonuçlanabilir veya Kubernetes doğru bir şekilde çalışmayabilir.

3.1 Flavor ve OS

  • Debian ve Red Hat tabanlı Linux dağıtımlarını tercih etmelisiniz. Biz bu yazıda Rocky Linux 8 kullanacağız.
  • Makine başına 2 GB veya daha fazla RAM
  • 2 CPU veya daha fazlası
  • Clusterdaki tüm makineler arasında sorunsuz ve kesintisiz ağ bağlantısı

3.2 Benzersiz Node Tanımları

Kubernetes cluster içinde yer alacak her node için benzersiz hostname, MAC adresi ve product_uuid tanımlanmalıdır.

  • hostname komutu ile makine adını kontrol edebilirsiniz.
  • ip link komutu ile MAC adresini kontrol edebilirsiniz.
  • cat /sys/class/dmi/id/product_uuid komutu ile de uuid değerini kontrol edebilirsiniz.

3.3 Port ve Protokoller

Kubernetes'in çalışabilmesi için makinelerinizde belirli portlar haberleşebilmek için açık olmalıdır.

💡
Firewall-cmd, Red Hat tabanlı dağıtımların, UFW ise Debian tabanlı dağıtımların varsayılan güvenlik duvarı yöneticisidir. Güvenlik duvarı kuralları eklemek için kullandığınız dağıtıma uygun komutları aşağıdan seçiniz.
  • Control Plane, manager, makinelerde açık olması gereken port ve protokoller şunlardır:
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

Bu portları açmak için aşağıdaki komutları kullanabilirsiniz:

Red Hat tabanlı dağıtımlarda:

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=10259/tcp
firewall-cmd --permanent --add-port=10257/tcp

Debian tabanlı dağıtımlarda:

ufw allow 6443/tcp
ufw allow 2379:2380/tcp
ufw allow 10250/tcp
ufw allow 10259/tcp
ufw allow 10257/tcp
  • Worker nodelarda açık olması gereken port ve protokoller şunlardır:
Protocol Direction Port Range Purpose Used By
TCP Inbound 10250 Kubelet API Self, Control plane
TCP Inbound 30000-32767 NodePort Services All

Bu portları açmak için aşağıdaki komutları kullanabilirsiniz:

Red Hat tabanlı dağıtımlarda:

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp

Debian tabanlı dağıtımlarda:

ufw allow 10250/tcp
ufw allow 30000:32767/tcp

Kurulum tamamlandıktan sonra ilgili portları nc komutu ile test edebilirsiniz:

nc 127.0.0.1 6443

3.4 Memory SWAP

Memory SWAP devre dışı bırakılmalıdır. Aksi halde Kubelet performanslı çalışamayacağı için sorunlar meydana gelebilir.

  • Öncelikle swapoff -a komutunu çalıştırınız.

Bu komut swap özelliğini geçici olarak devre dışı bırakır. Bu değişikliğin yeniden başlatmalarda kalıcı olması için, sisteminizde nasıl yapılandırıldığına bağlı olarak /etc/fstab, systemd.swap gibi yapılandırma dosyalarında swap satırının devre dışı bırakıldığından emin olun.

Örneğin Red Hat tabanlı dağıtımlarda /etc/fstab dosyasını açınız ve swapfile.. ile başlayan satırın başına # işareti koyarak o satırı yoruma alabilir ve swap'ı devre dışı bırabilirsiniz.

3.5 Kernel Modüllerinin Aktif Edilmesi

Kubeadm kurulumunun sorunsuz başlayabilmesi için overlay ve br_netfilter modüllerinin aktif edilmesi gerekmektedir. Bu iki modülü aktif etmek için şu komutları kullanınız:

modprobe overlay
modprobe br_netfilter

Son olarak ilgili sistem ayarlarını değiştirmek için /etc/sysctl.d dizini altında k8s.conf isimli bir dosya oluşturarak aşağıdaki değerleri içine ekleyiniz:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

Ardından sudo sysctl -p /etc/sysctl.d/k8s.conf komutunu çalıştırarak yukarıdaki ayarları aktif ediniz.

Son olarak [WARNING FileExisting-tc]: tc not found in system path hatası almamak için aşağıdaki komutu çalıştırarak iproute-tc paketini kurunuz.

yum install iproute-tc

3.6 Container Runtime Kurulumu

Kubernetes, Pod içinde container çalıştırabilmek için Container Runtime teknolojisi kullanır.

Varsayılan olarak Kubernetes, seçtiğiniz container runtime ile interface oluşturmak için Container Runtime Interface (CRI) kullanır.

Eğer bir container runtime belirtmezseniz, kubeadm, bilinen endpointlerin listesini tarayarak kurulu bir container runtime'ın kurulu olup olmadığını otomatik olarak algılamaya çalışır.

Birden çok container runtime algılanırsa veya hiçbiri bulunamazsa, kubeadm bir hata atar ve hangisini kullanmak istediğinizi belirtmenizi ister.

Aşağıdaki tablo, desteklenen işletim sistemleri için bilinen endpointleri içerir:

Runtime Linux socket Windows pipe
containerd unix:///var/run/containerd/containerd.sock npipe:////./pipe/containerd-containerd
CRI-O unix:///var/run/crio/crio.sock -
Docker Engine (using cri-dockerd) unix:///var/run/cri-dockerd.sock npipe:////./pipe/cri-dockerd
🚧
Docker Engine, container runtime'ın Kubernetes ile çalışması için bir gereklilik olan CRI'yi implement etmez. Bu nedenle, ek bir servis olan cri-dockerd kurulmalıdır. cri-dockerd, 1.24 sürümünde kubelet'ten kaldırılan legacy built-in Docker Engine desteğini temel alan bir projedir.

Biz bu 3 seçenek arasından containerd'i kuracağız. Bunun için aşağıdaki linkte yer alan containerd kurulum yöntemlerinden herhangi birini kullanabilirsiniz veya aşağıdaki komutları sırayla çalıştırabilirsiniz.

containerd/getting-started.md at main · containerd/containerd
An open and reliable container runtime. Contribute to containerd/containerd development by creating an account on GitHub.

Red Hat tabanlı bir dağıtımda containerd kurmak için yukarıda linkte yer alan ve aslında 2.methoda karşılık gelen aşağıdaki komutları kullanabilirsiniz:

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd.io
systemctl daemon-reload
systemctl enable --now containerd
🛑
Eğer Red Hat tabanlı bir dağıtım kullanıyorsanız yüksek ihtimal ile Podman container runtime'a da sahip olabilirsiniz. Containerd kurulumu sırasında podman ile ilgili bir hata alıyorsanız bu iki container runtime'ın çakışmasını engellemek için Podman'i kaldırmanız gerekmektedir. Şu link ile Podman'i kaldırabilirsiniz: https://www.ibm.com/docs/en/eam/4.2?topic=questions-troubleshooting-tips#uninstall_podman

containerd'i kurduktan sonra SystemdCgroup ayarını aktif etmemiz gerekiyor. Bunun için default containerd yapılandırmasını config dosyasına yazıp üzerinde düzenleme yapmalıyız. Aşağıdaki komutlar bu işlemler için yeterli olacaktır.

containerd config default | tee /etc/containerd/config.toml
sed -i 's/            SystemdCgroup = false/            SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd

Artık kubeadm kurabilmek için gerekli olan tüm gereksinimleri tamamlamış bulunuyoruz. Şimdi kubeadm kurulumuna geçebiliriz.

💡
Birden fazla node içeren cluster kurmak istiyorsanız, kubeadm kuracağınız bütün node'larda yukarıdaki işlemleri eksiksiz bir şekilde yapmanız gerekir.

4. Kubeadm Kurulumu

Gereksinimleri başarılı bir şekilde tamamladıktan sonra artık kubeadm kurulumuna geçebiliriz.

Kubeadm kurulumu için şu paketleri tüm nodelara kurmamız gerekiyor:

  • kubeadm: Kubernetes clusterların başlatılmasını sağlamak için kullanılan bir araçtır.
  • kubelet: Cluster üzerindeki tüm nodelarda çalışan ve pod ile container'ları başlatmak gibi işler yapan bileşendir.
  • kubectl: Cluster ile haberleşmek için kullanılan CLI aracıdır.

kubeadm sizin yerinize kubelet veya kubectl'i kurmaz veya yönetmez. Bu nedenle bu üç aracın versiyonlarının eşleştiğinden emin olmalısınız. Aksi halde kararsız ve doğru olmayan bir çalışma ile karşılaşabilirsiniz. Versiyonlar ve örnek senaryolar için şu linki ziyaret edebilirsiniz.

4.1 Red Hat Tabanlı Dağıtımlarda Kurulum

Bu yazıda Rocky Linux kullanıyoruz ve bu sebeple aşağıdaki komutlarla kubeadm kurulumunu yapabilirsiniz.

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# Set SELinux in permissive mode (effectively disabling it)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable --now kubelet
  • setenforce 0 ve sed ... komutları çalıştırılarak SELinux'u devre dışı bırakılır. Bu, containerların host makinenin dosya sistemine erişmesine izin vermek için gereklidir. Kubelet'te SELinux desteği gelişene kadar bunu yapmanız gerekiyor.
  • Red Hat tabanlı dağıtımınız basearch'ı yorumlayamayıp baseurl başarısız olursa, $basesearch'ü bilgisayarınızın mimarisiyle değiştirin. Bu değeri görmek için uname -m yazın. Örneğin, x86_64 için baseurl URL'si şu olabilir: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64.

4.2 Debian Tabanlı Dağıtımlarda Kurulum

Siz Ubuntu gibi bir Debian tabanlı dağıtım kullanmak isterseniz aşağıdaki komutlarla kubeadm i kurabilirsiniz.

apt-get update
apt-get install -y apt-transport-https ca-certificates curl
curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

Artık kubeadm, kubelet ve kubectl kurulumlarını da başarıyla tamamladık. Şimdi Kubeadm initialize işlemine geçebiliriz.

💡
systemctl status kubelet komutunu çalıştırdığınızda kubelet servisinin başlayamayarak hata verdiğini göreceksiniz. Bu durum normaldir ve kubeadm, kubelet'in ne yapması gerektiğini söyleyene kadar birkaç saniyede bir yeniden başlayarak hata vermeye devam edecektir.

4.3 Kubeadm'i Başlatmak

Control-plane yani manager node, etcd (cluster veritabanı) ve API Server (kubectl cli aracının iletişim kurduğu) dahil olmak üzere control-plane bileşenlerinin çalıştığı makinedir.

Kubeadm'i başlatabilmek için kubeadm init komutunu gerekli parametrelerle birlikte çalıştırmalıyız. Kullanabileceğimiz parametreler ve açıklamaları şu şekildedir:

  • --control-plane-endpoint: Kubernetes cluster'ındaki control-plane node'lara erişmek için kullanılır. Kuracağınız tek control-plane node'lu kubeadm cluster'ını high availabilty için birden fazla control-plane'li node'a yükseltme planınız varsa, (production ortamı için önerilir), bu parametreyi ayarlamanız gerekir. IP adresi veya domain kullanabilirsiniz.
  • --apiserver-advertise-address: API server'ın dış dünyadan erişilebileceği IP adresini belirtir. Bu parametre, Kubernetes cluster'ın API server'a nasıl erişileceğini belirlemek için kullanılır. Eğer bu parametre belirtilmezse, API server, Kubernetes cluster'ın bulunduğu node'lar arasındaki ağ trafiğine bağlı olarak otomatik olarak belirlenir. Ancak, bazen bu otomatik belirleme yöntemi doğru şekilde çalışmayabilir veya API server'ın dış dünyadan erişilebilmesi gerektiği durumlarda bu parametrenin kullanımı gerekebilir.
  • --pod-network-cidr: Cluster'da podlar arasındaki ağ iletişimini yönetmek için kullanılan IP adresi aralığını belirtir. Belirtilmediğinde, Kubernetes varsayılan olarak 10.244.0.0/16 IP adresi aralığını kullanır.
  • --cri-socket: cluster'da container runtime (örneğin, CRI-O veya containerd) ile iletişim kurmak için kullanılan Unix soketinin yolunu belirtir. Belirtilmediğinde, kubeadm, bilinen endpointlerin bir listesini kullanarak container runtime'ı otomatik algılamaya çalışır.

Kullanabileceğiniz diğer parametreler için şu sayfayı inceleyebilirsiniz.

Artık kubeadm init komutunu gerekli parametrelerle çalıştırarak cluster'ı init edebiliriz:

kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=<node_ip> --control-plane-endpoint=<node_ip>
💡
Bu yazıda Calico network eklentisini kullanacağımız için --pod-network-cidr parametresini 192.168.0.0/16 olarak ayarladık. Çünkü Calico manifest dosyasında network aralığı bu şekilde ayarlanmıştır. Siz farklı bir aralık kullanacaksanız manifest dosyasında da ilgili aralığı düzenlemelisiniz.

Kurulum başarılı bir şekilde tamamlandığında aşağıdaki gibi örnek bir çıktı görmeniz gerekiyor:

Eğer kubectl'i root olmayan bir kullanıcıyla kullanacaksanız şu komutları çalıştırınız:

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

Fakat root kullanıcıyla kullanacaksanız şu komutu çalıştırmak yeterlidir:

export KUBECONFIG=/etc/kubernetes/admin.conf
💡
export komutu geçici bir environment variable ekleyeceği için terminal kapandığında bu tanımda silinecektir. Bu nedenle ~/.bash_profile dosyasının içine export komutunu ekleyerek komutu kalıcı hale getirebilirsiniz. Aksi halde couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp [::1]:8080: connect: connection refused hatası alırsınız. Ortam değişkenleri hakkında daha fazla detay için aşağıdaki yazımızı inceleyebilirsiniz.
Linux .bashrc, .bash_profile ve .profile Dosyaları Farkı
Linux .bashrc, .bash_profile ve .profile dosyaları shell startup dosyalarıdır ve başlangıçta otomatik olarak komutlarınızı çalıştırırlar.

Cluster'a high availability için yeni bir control-plane node ekleyecekseniz, ilgili node'da çıktıda söylenen şu benzeri komutu çalıştırınız:

kubeadm join 140.82.53.197:6443 --token [token] \
        --discovery-token-ca-cert-hash sha256:[hash] \
        --control-plane

Cluster'a bir worker node ekleyecekseniz, ilgili node'da çıktıda söylenen şu benzeri komutu çalıştırınız:

kubeadm join 140.82.53.197:6443 --token [token] \
        --discovery-token-ca-cert-hash sha256:[hash]
💡
Varsayılan olarak, uygulamalar manager node'da schedule edilemez. Uygulamaları manager nodelarda da schedule edebilmek için aşağıdaki komutları çalıştırarak taint'i kaldırabilirsiniz.
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-

Şu anda kubeadm kurulumunu tamamladık. Fakat systemctl status kubelet çıktısına bakarsanız bu sefer kubelet servisinin başladığını, fakat NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized hatası verdiğini görürsününüz. Bunu çözmek için sıradaki başlıkla işlemlere devam ediyoruz.

4.4 Kubeadm Pod Network Eklentisi Kurmak

Pod'ların birbiriyle iletişim kurabilmesi için Container Runtime Interface (CNI) tabanlı bir Pod network eklentisi kurmalısınız. Cluster DNS (CoreDNS), bir network kurulmadan başlamaz.

Kurabileceğiniz tüm eklenti seçenekleri şu adreste listelenmiştir. Biz bu yazıda Calico kurarak devam edeceğiz.

Calico kurulumu için aşağıdaki şu komutları çalıştırınız:

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O
kubectl create -f custom-resources.yaml

5. Kubeadm Kurulumunun Doğrulanması

Yukarıdaki tüm aşamaları başarılı bir şekilde tamamladıktan sonra kubectl get nodes komutu ile nodeların durumunu Ready olarak görmeniz gerekmektedir.

NotReady görmeniz durumunda kubectl describe nodes ile eventleri ve sistem mesajlarını kontrol edebilirsiniz.

6. Kubernetes Metrics Server Kurulumu

Kubeadm, kurulum sırasında metrics server bileşenini yüklemez. Bu sebeple ayrı olarak yüklememiz gerekiyor.

Bunu doğrulamak için top komutunu çalıştırırsanız, Metrics API not available hatasını görürsünüz.

root@manager1:~# kubectl top nodes
error: Metrics API not available

Metrics server yüklemek için aşağıdaki komutu çalıştırınız:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Bu manifest dosyası, resmi metrics server github sayfasından alınmıştır. Fakat kubelet-insecure-tls parametresi ek olarak eklenmiştir. Aksi halde because it doesn't contain any IP SANs" node="" hatası verir.

Metrics server nesneleri konuşlandırıldıktan sonra top komutunu kullanarak node ve pod metriklerini görmeniz bir dakika sürer.

kubectl top nodes

Node metriklerini aşağıda gösterildiği gibi görüntüleyebilmeniz gerekir.

root@manager1:~# kubectl top nodes
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
manager1        111m         5%     1695Mi          44%

Aşağıdaki komutu kullanarak belirli bir pod için CPU ve bellek ölçümlerini de görüntüleyebilirsiniz.

kubectl top pod -n kube-system

7. Kubernetes Cluster Önemli Config Dosyaları

Aşağıda, bilmeniz gereken önemli cluster yapılandırmalarının dosya yolları bulunmaktadır.

Konfigürasyon Dosya Yolu
Static Pods Location (etcd, api-server, controller manager and scheduler) /etc/kubernetes/manifests
TLS Certificates location (kubernetes-ca, etcd-ca and kubernetes-front-proxy-ca) /etc/kubernetes/pki
Admin Kubeconfig File /etc/kubernetes/admin.conf
Kubelet configuration /var/lib/kubelet/config.yaml

Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes Cluster Nasıl Güncellenir?
Kubernetes cluster ve bileşenlerin master ve worker node’larda ayrı ayrı güncelleyebilirsiniz.