[ CKA-IV ] - Kubeadm ile Multi Node Cluster Kubernetes Kurulumu

Serkan Bingöl
AWS Certified User Group Turkey
11 min readJan 9, 2021

--

görsel kaynağı https://www.cloudiqtech.com

Merhabalar serimizin 2. ve 3. yazılarında kubernetes temel konularını ve Minikube ile lokal ortamımızda oluşturturabileceğimiz single node mimarimizi işledik.

Bu yazımız ile edindiğimiz temel kubernetes becerilerini bir adım öteye taşıyarak production ortamında containerlarımızı yönetmek için kullanacağız. Bunun için öncelikle multi-node cluster yaklaşımına göz atacağız ve gerekli kurulum aşamalarını tamamlayacağız.

Production ortamlarımız için ileride kullanacağımız kubernetes altyapısını oluşturmak için gerekli püf noktaları inceleyeceğiz.

Nedir Bu Kubeadm ?

görsel kaynağı https://imgflip.com

Kubeadm , daha önceki yazılarımızda kısaca değindiğimiz üzere kubernetes clusterının yaratılmasını / upgrade edilmesini sağlayan k8s tarafından geliştirilen bir araçtır.

Kubernetes Mimarisi

Kubernetes için temel mimari, oguzhaninan’ın aşağıda referans linkinin verildiği yazısında şu şekilde anlatılmıştır.

Temelinde Kubernetes, fiziksel ve sanal makineleri, her sunucu arasında iletişim kurabilmek için bir ağ kurarak tek bir küme haline getirir. Bu küme, tüm Kubernetes bileşenlerinin, işlevlerinin ve iş yüklerinin yapılandırıldığı fiziksel platformdur.
Kümedeki makinelerin her birini Kubernetes ekosisteminde bir rol verilmiştir. Bir sunucu ana (master) sunucu olarak kullanılır. Bu sunucu, tüm küme için bir beyin görevi görür. Diğer sunucuların sağlık kontrolünü yaparak en iyi nasıl dağıtım yapılacağına karar verir. Ana sunucu, küme ile ilk temas noktası olarak kullanılır.
Kümedeki diğer makineler düğüm (Node) olarak adlandırılır. Her bir düğüm konteyner çalıştırabilecek (Docker, RKT) durumda olmalıdır. Uygulama ve hizmetleri düğümler çalıştırır. Düğümler ana sunucudan aldığı talimatlar ile uygun şekilde konteynerleri oluşturur veya yok eder. [1]

Master node içinde bir çok farklı uygulamayı barındıran ve k8s için yönetici görevini üstlenen node olarak kullanılmaktadır. Kontrol düzlemi ( control plane ) dediğimiz bir mantıksal çerçeve içinde yönetim için kullanılan API Server (sunucumuza gelen tüm REST requestlerin yönetilmesinden sorumludur ), Control Manager ( kümenin durumunu API Server izleme özelliğiyle izler ve bildirildiğinde, geçerli durumu istenen duruma doğru hareket ettirmek için gerekli değişiklikleri yapar ), Scheduler (yeni bir pod oluşturulması isteğine karşı API server’ı izler) ve Etcd ( tutarlı ve izlenebilir bir key value store olarak veri tabanı görevini üstlenir ) bileşenlerini barındırır.

Worker node ise, kubernetes kontrol düzlemi tarafından yönetilen podları çalıştırmak için gerekli hizmetleri içerir. Bu hizmetler Kubelet ( ana kubernetes agent olarak kullanılır. API server’dan gelecek isteklere karşı API Server’ı izler ), Kube-Proxy ( kubernetes network’u diyebiliriz.Pod’lara IP adresi proxy sayesinde atanır ), Container Engine ( konteyner yönetimini yapar.İmage’ları ilgili registry üzerinden çeker ve konteyner’ların start ve stop olmalarını sağlar ) bileşenlerini barındırır.

Kubeadm ile k8s kurulumu için bu yazıda öncelikle 1 master ve 2 worker node olacak şekilde bir planlama yapıyoruz. Bunun için AWS üzerinde 3 adet linux EC2 sanal makinası ayağa kaldırıyoruz. Bu sunum içinde k8s master sanal makinası için ilk olarak minimum sistem gereksinimlerine önem verilmeden bir kurulum gerçekleştirerek kurulum aşamasında karşılaşacağımız zorluklar ele alındı.Bu sunum içinde AWS cloud üzerinde işlem gerçekleştirdiğimizden dolay açılan makinaları dikeyde ölçeklendirebiliyoruz , bizim için bu sorunu çözmek kolay olacaktır.

  • Siz sorunsuz bir kurulum yapmak için lütfen aşağıda belirtilen özelliklerde sanal makinalar ile işleme başlayayın.

Bu k8s cluster için kullanılacak sanal makinalarda minimum sistem gereksinimleri aşağıda belirtilen özelliklerde olmalıdır.

  • Ubuntu 16.04+ , Debian 9+ , CentOS 7 , Red Hat Enterprise Linux (RHEL) 7 , Fedora 25+ dağıtımlarından herhangi birine sahip linux işletim sistemi
  • Master için min 2 Core CPU , 2 GB RAM , 20 GB Disk (Ölçeklendirme yapılabilir.)
  • Tüm makinalar için network bağlantısının sağlanmış olması ve gereken portların açılmış olması.

Linux için Minikube Kurulumu

görsel kaynağı https://tr.pinterest.com

Kubernetes Cluster Network Kontrolü Adımları

Kubeadm ile k8s multinode cluster kurulumuna başlamadan önce üzerinde çalıştığımız sistem içindeki tüm makinalarda br_netfilter modülünün kurulu olduğunu kontrol ediyoruz. Bunun için lsmod | grep br_netfilter komutu ile gereken kontrolleri yapabilir. Harici olarak modulü yüklemek için sudo modprobe br_netfilter komutunu çalıştırmamız gerekmektedir.

Kubernetes Cluster Network Kontrolü Adımları 1

Bu işlem sonucunda nodelar üzerinde kullandığımız iptables içinde bridge trafiğini görebilmemiz gerekmektedir. net.bridge.bridge-nf-call-iptables bilgisinin sysctl konfigurasyonunda 1 değeri olarak atandığını kontrol etmek ve uygulamaya geçebilmek için aşağıdaki komutları çalıştırıyoruz.

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

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

Yaptğımız değişiklikleri uygulamak için sudo sysctl --system komutu ile son işlemi gerçekleştiriyoruz.

Kubernetes Cluster Network Kontrolü Adımları 2

ÖNEMLİ : Kubernetes ve Docker Yol Ayrımı Bilgilendirmesi

Bu k8s kurulumu için container runtime olarak docker kullanıyoruz. Fakat Kubernetes 1.20 versiyonu ile yayınlanan değişiklikler içinde kubernetes ile docker bir yol ayrımına gitmeye karar vermiş durumda.Yani kubernetes yeni sürümleri ile birlikte docker desteğini sonlandıracak. Bu değişiklikleri aşağıdaki link üzerinden inceleyebilirsiniz.

Bu yol ayrımından kısaca bahsetmek gerekir ise docker, kubernetes için geliştirilmiş bir ürün değil. CRI desteği bulunmuyor bu konu Docker-Kubernetes entegrasyonu açısından extra geliştirilmelerin yapılması ve bu iki projenin bir şekilde entegre çalışması anlamına geliyor.

Docker-k8s entegrasyonu Kubernetes tarafından geliştirilen ve desteği sunulan bir proje olan DockerShim tarafından sağlanmaktaydı. DockerShim aynı bir adapter gibi çalışıp Kubernetes direktiflerini Docker komutları haline getirmek için kullanılıyordu. Bu konu kubernetes geliştiricileri açısından her yeni özellik eklenmesi , değişiklik yapılması durumu için ya da bunun tam tersi durumunlarda DockerShim için güncelleme yapılması anlamına geliyor. Extra iş yükü karşısında Kubernetes tarafından alınan karar ile yakın bir tarihte ( kubernetes 1.22 sürümü ile planlanacak gibi ) DockerShim desteği sonlanacak.

Bu konu ile ilgili daha detaylı bilgileri aşağıdaki linkler üzerinden inceleyebilirsiniz.

Biz docker engine üzerinde gerekli adımları yapacağımızı belirtmiştik. Docker CE kullanmak istemeyenler ve containerd üzerinden işlem yapmak için Docker CE Kurulum Adımları başlığını atlayarak bu link üzerinden gereken containerd kurulumunu adımlarını gerçekleştirebilirler.

Docker CE Kurulum Adımları

Kaldığımız yerden devam edecek olursak bu kurulumda Docker CE kurulumunu yapmak ve apt paket yöneticisi kullanarak HTTPS protokolü üzerinden gereken paketleri indirmek için sudo apt-get update && sudo apt-get install -y ve apt-transport-https ca-certificates curl software-properties-common gnupg2 komutlarını çalıştırıyoruz.

Docker CE Kurulum Adımları 1

GPG (GNU Privacy Guard) ile anahtar-şifreleme hibrit standartları üzerinden docker ce kurulumunda kullanılacak anahtarı curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key --keyring /etc/apt/trusted.gpg.d/docker.gpg add - komutunu kullanarak ekliyoruz.

Devam eden işlemimizde Docker paketini repository içine eklemek için aşağıdaki komutu çalıştırıyoruz.

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
Docker CE Kurulum Adımları 2

Tüm işlemlerimizi gerçekleştirdikten sonra Docker CE kurulumunu aşağıdaki komut ile gerçekleştiriyoruz. Burada siz istediğiğiniz sürümü kullanabilirsiniz.

sudo apt-get update && sudo apt-get install -y \
containerd.io=1.2.13-2 \
docker-ce=5:19.03.11~3-0~ubuntu-$(lsb_release -cs) \
docker-ce-cli=5:19.03.11~3-0~ubuntu-$(lsb_release -cs)
Docker CE Kurulum Adımları 3

Docker deamon üzerindeki gerekli ayarlamaları yapmak , gereken parametreleri çekip düzenlemeleri yapmak için aşağıdaki komutu kullanıyoruz.

cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

Devam eden adımlarda docker.service.d konfigurasyon dosyasını sudo mkdir -p /etc/systemd/system/docker.service.d komutu ile oluşturuyoruz. Docker’ı tekrardan başlatmak için sudo systemctl daemon-reload komutunu ve sudo systemctl restart docker komutunu sırası ile kullanmaktayız.

En son olarak docker engine güncel durumunu kontrol etmek ve kurulumu başarılı şekilde gerçekleştirmiyiz anlamak için sudo systemctl status docker komutunu çalıştırıyoruz.

Docker CE Kurulum Adımları 4

Kubeadm , Kubelet ve Kubectl Kurulum Adımları

Kubernetes kümemizi oluşturmak için tüm makinalar üzerinde başlıkta belirttiğimiz gibi kubeadm, kubelet ve kubectl kurulumlarını gerçekleştirmeliyiz. Bu işlem için aşağıdaki komut bloğunu çalıştırıyoruz.

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
Kubeadm , Kubelet ve Kubectl Kurulum Adımları 1

Artık k8s master olarak kullanacağımız sanal makina üzerinde control-plane node olarak işlem yapabilmek için kubeadm init <args> komutunu temel alacağız. Biz sudo kubeadm init --pod-network-cidr 10.244.0.0/16 --apiserver-advertise-address=172.31.35.106komutu ile işlemimizi gerçekleştiriyoruz.

Bu kısım için --pod-network-cidr 10.244.0.0/16 komutu ile AWS üzerinde kullandığımız VPC network içinde bizlere atanmış olan IP aralığında işlemini gerçekleştirmekte ve --apiserver-advertise-address=172.31.35.106 komutu ile bu makina için atanmış olan API sunucusunun tanıyıp kullanabileceği IP adresi ataması işlemini gerçekleştirmiş oluyoruz.

Fakat burada daha önce sözünü ettiğimiz control plane makinasının kurulması için gereken minimum sistem ayarlarını dikkate almadığımız ve daha düşük konfigurasyonlu bir makina tercih ettiğimiz için “the number of available CPUs is less than the required 2” hatası ile karşılaşıyoruz.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 2

WS consolu üzerinden kullandığımız makinanın konfigurasyonunu yükseltip tekrardan bağlanarak sudo kubeadm init --pod-network-cidr 10.244.0.0/16 --apiserver-advertise-address=172.31.35.106 komutunu tekrar çalıştırıyorum. Ve işlemimizin artık bir hata ile karşılaşmadan başladığını görebiliyorum.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 3

Kubernetes master olarak kullanacağım makinada control-plane node kurulum işlemi tamamlandıktan sonra bize verilen çıktıyı bir kenara not ediyorum. Bu komut üzerinden worker node olarak kullanacağımız makinalarımızı cluster sisteminin içine dahil edebileceğiz.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 4

Pod Network Eklentisi Calico Kurulum Adımları

Kubernetes kümesi içinde kullanacağımız node’lar ve pod’lar için network ilişkilerini konfigure edip kontrol etmemizi sağlamak amacı ile “Calico” eklentisini kullanacağız. Calico

Calico eklentisi ile ilgili detaylı bilgi ve kurulum adımlarını aşağıdaki link üzerinden inceleyebilirsiniz. Yeni hazırlanmış bir Kubernetes kümesinde, Calico kullanarak tek bir yaml dosyası ile ağ bağlantılarını hızla dağıtılabiliriz.

Ayrıca diğer CNI eklentileri için oguzhaninan ’ ın aşağıdaki yazısına göz gezdirmeniz faydalı olacaktır.

İlgili calico eklentisini https bağlantısı kullanarak yaml dosyası üzerinden kurmak için kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml komutunu çalıştırıyoruz.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 5

Artık kubectl konfigurasyonu için gereken işlemleri yapmaya başlayabiliriz. Kubernetes master node üzerinden cluster işlemlerinin yapılması ve worker node’lar için gereken kontrolün sağlanması için mkdir -p $HOME/.kube komutu ile bir klasör oluşturup sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configkomutu ile bu klasör içine kubernetes için kullanılacak admin.conf dosyasını kopyalıyoruz ve sudo chown $(id -u):$(id -g) $HOME/.kube/config komutu ile bu dosya üzerinde gereken izinleri vermiş oluyoruz.

İşlemleri bitirdikten sonra kubectl get nodes komutu ile kubectl ‘in çalıştığını kontrol ediyoruz. Kontrol sonrasında henüz worker nodelar k8s kümesine dahil edilmediği için sadece master node çıktısını görebiliyoruz.

Artık kubeadm kurulumunu tamamladığımızda kenara kaydettiğimiz token’ı kullanarak worker nodeların bağlantısını gerçekleştirebiliriz.

Eğer bu token’ı unuttuysak ve ya bir yere kaydetmediysek kubeadm token create --print-join-command komutu ile tekrardan bir token oluşturarak işlemimize devam edebiliriz.

Burada kullanacağımız token’ı oluşturduğumuz iki worker node için de çalıştırarak bu nodeların master node üzerinden yönetilmesi için k8s kümesine dahil edilme işlemini gerçekleştirmiş oluyoruz.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 6

Burada dikkat edilmesi gereken husus bizlere verilen join token için kullandığımız komutta belirtilen portun network firewall gibi bir bileşen içinde gereken kuralını yazmayı unutmamış olmamız gerekmektedir.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 7

Worker node’ların sisteme dahil edilme işlemini bitirdikten sonra kubectl get nodes komutu ile kubectl ‘in çalıştığını kontrol ediyoruz. Artık tüm cluster node’larımızı çıktı olarak görebilmekteyiz.

Kubeadm , Kubelet ve Kubectl Kurulum Adımları 8

Deployment Dosyası Test Adımları

Kubernetes kümemizi kurduktan sonra bir deployment gerçekleştirerek sistemimizi test edebiliriz. Master node üzerinde mkdir k8s-test-files komutu ile boş bir klasör oluşturuyorum. Açmış olduğum klasörün içinde girerek sudo vim test-nginx-deployments.yaml komutu ile vim editörü üzerinden bir deployment yaml dosyası oluşturuyorum.

Bu deployment dosyası içinde nginx imajını kullanarak myapp-pod isminde 3 adet pod ayağa kaldıracağımı ön tanımlı olarak oluşturmuş bulunuyorum.

Pod, ReplicaSet ,Deployments ve Service tanımlamaları gibi kavramları sonraki yazılarımızda daha detaylı acıklıyor olacağız. Genel bilgi için aşağıdaki linki incelemenizde fayda var.

Deployment Dosyası Test Adımları 1

Sistemimizde kullanacağımız deployment tanımını bitirdikten ve cat test-nginx-deployments.yaml komutu ile kontrol ettikten sonra kubectl apply -f test-nginx-deployments.yaml komutu ile deployment oluşturma işlemimizi tamamlıyoruz.

Deployment Dosyası Test Adımları 2

Deployment dosyasının işlenmesi tamamlanıp pod’larımızın oluşturulduğunu detaylı şekilde kontrol etmek amaçlı sudo kubectl get nodes -o wide komutunu çalıştırıyoruz.

Burada 3 adet nginx imajından oluşturulmuş uygulamanın 3 pod içinde ayağa kaldırıldığını görebilmekteyiz. Ayrıca çıktının NODE sütununu kontrol ettiğimizde 2 podun 29 bitimli IP ye sahip worker node üzerinde diğer pod’un 214 bitimli IP üzerinde oluşturulduğunu inceleyebiliriz.

Deployment Dosyası Test Adımları 3

Herhangi bir pod ismine göre kubectl descripe pod/frontend-xxxxxx-xxx-xx komutunu kullanarak detaylara bakmak istediğimizde deployment yaml dosyasında oluşturduğumuz ayrıntıları inceleyebiliriz.

Bizlere verilen çıktının Containers kısmından bu konteyner’a ait detayları Events kısmından ise pod ayağa kaldırılırken geçtiği aşamaları takip edebilmekteyiz.

Deployment Dosyası Test Adımları 4

Kubeadm ile Yüksek Erişilebilir Küme Kurulumu

Kubernetes cluster’ınız içinde master node tarafında yüksek erişilebilir (high-available) bir mimari istiyorsanız aşağıdaki adımları incelemenizde fayda var.

Sonuç

görsel kaynağı https://tenor.com

Production ortamlarımız için kubeadm kullanarak multi node cluster kubernetes kurulumunu anlattığımız yazımızın sonuna gelmiş bulunmaktayız.

Multi node kubernetes kümesi üzerinde uçtan uca bir mikro-servis uygulamayı yayına alma aşamalarını anlatmaya çalışacağımız serimizin 5. kısmı olan [ CKA-V ]-Kubernetes Deployments ile Mikroservis Uygulama Yayınlama yazımızda görüşmek dileği ile.

--

--

Serkan Bingöl
AWS Certified User Group Turkey

Muzur bir oğlan babası, hayvan sever, Harry Potter hayranı, bazen maceracı düz yazılımcı.