Kendi Kubernetes Lab’ınızı Oluşturun

Önsel Akın
SabancıDx
Published in
10 min readJun 10, 2019

--

Bildiğiniz gibi Kubernetes üzerinde geliştirme yapabilmek için tercih edilecek en iyi yollardan biri Minikube kullanmak. Minikube lokal makinenizde bir VM içinde, tek node’lu bir cluster oluşturarak Kubernetes deneyimi yaşamanıza imkan veriyor. Ancak çok node’lu bir cluster nasıl çalışıyor görmek istiyorsanız, lokal makinenize sanal makinelerden oluşan bir kurulum yapmanız gerekiyor.

Ayrıca, lokalde gerçek bir cluster üzerinde çalışmak varken kim Mini’siyle çalışmak ister ki? 😜

Kolları sıvayıp, elleri kirleterek bu işi nasıl yaparız görmek istiyorsanız, buyrun…

Tek bir makine üzerinde bir Kubernetes cluster oluşturabilmek için bir sanallaştırma aracına ihtiyaç var. Ben Mac OS ile çalıştığım için VMware Fusion kullanacağım ancak kurulum adımları bir çok farklı sanallaştırma aracı için de geçerli. Dilerseniz VirtualBox, Parallels vb. kullanabilirsiniz.

1: Sanal Makineleri Oluşturmadan Önce

Kuracağımız cluster’ın düzgün çalışabilmesi için, cluster içindeki tüm makinelerin iletişimlerinin sorunsuz olduğundan emin olmamız gerekiyor. VMare tarafından her makineye atanan IP’lerin sabitlenmesi de emin olmak için atmamız gereken adımlardan biri. VMware’in oluşturduğu vmnet8 adında, sanal makinelerin fiziksel network ile NAT üzerinden haberleşmesini sağlayan network’ü kullanacağız. Dolayısıyla vmnet8 sanal network adaptörünün konfigürasyonuna müdahale etmemiz gerekiyor.

VMware, sabit IP ataması için bir arayüz sunmuyor, dolayısıyla bu işi manuel olarak çözeceğiz. Konfigürasyonu, Mac OS üzerinde /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf dosyası içinde gerçekleştiriyoruz. Windows üzerinde çalışıyorsanız dosya C:\ProgramData\VMware\vmnetdhcp.conf olmalı.

sudo nano /Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf

Dosyanın en altına aşağıdaki satırları doğrudan yapıştırabilirsiniz:

host K8SBase {
hardware ethernet 00:0C:29:B9:77:AD;
fixed-address 192.168.58.10;
}
host K8SMaster {
hardware ethernet 00:50:56:27:3B:12;
fixed-address 192.168.58.20;
}
host K8SNode1 {
hardware ethernet 00:50:56:21:B9:EB;
fixed-address 192.168.58.21;
}
host K8SNode2 {
hardware ethernet 00:50:56:2F:28:95;
fixed-address 192.168.58.22;
}
host K8SNode3 {
hardware ethernet 00:50:56:35:CF:5A;
fixed-address 192.168.58.23;
}

Bu konfigürasyona her müdahale ettiğinizde VMware’i tekrar başlatmanız gerekiyor. Dolayısıyla, konfigürasyonu tek seferde halledip, her sanal makine oluşturduğumuzda buradaki MAC adreslerini kullanmak daha kolay bir yöntem olacak. Bu liste bir yerlerde açık olarak elinizin altında bulunsun. Ayrıca dosyayı değiştirdiğinizde VMware açık ise kapatıp açmayı unutmayın.

2: İlk Sanal Makine

Bir Kubernetes cluster’ı içinde iki farklı kaynak mevcut; master ve node. İki farklı sanal makine oluşturup, ortak kurulumları tamamlayıp, ileriki adımlarda master ve node’u özelleştirerek hedefe ulaşabiliriz. Ben de kurulumu biraz daha generic gerçekleştirip, sanallaştırma aracının özelliklerini kullanarak ileride node ekleme işlemini elimden geldiğince hızlandırmaya çalışacağım.

Önce, master ve node için ortak kullanılabilecek sanal makineyi oluşturalım. İşletim sistemi olarak Ubuntu 18.04 seçtim. CentOS, Fedora ya da RHEL de kullanmanız mümkün.

Ubuntu 18.04 imajını seçtik
Easy Install ile yorulmadan kurulum
VM Oluşturma Özeti

Finish tuşuna basmadan önce Customize Settings ile dhcp konfigürasyonunda oluşturduğumuz MAC adresini sanal makine ile eşleştirelim.

Bu arada, sanal makineyi generic bir isimle kayıt etmenizi tavsiye ederim çünkü bu makineyi diğerlerine base image olarak kullanacağız, kafamızın karışmasını istemiyoruz 🙂Ben K8SBase ismini seçtim.

Sanal makine ayarlarında Network bölümüne gidip dhcp dosyasındaki K8SBase makinesi için verdiğimiz MAC adresini giriyoruz:

Kurulum tamamlandıktan sonraki ilk boot’ta aşağıdaki hatayı görmeniz normal çünkü sanal makine için statik IP yapılandırmasını gerçekleştirmedik henüz.

Sisteme giriş yaptıktan sonra IP ayarlarını düzenleyelim.

Network bağlantısını düzelttikten sonra tüm güncellemeleri almayı unutmayalım.

Güncellemeler tamamlandıktan sonra makineyi kapatıp VMware üzerinden bir snapshot alıyorum. Snapshot’ları Docker’daki layer’lar gibi düşünebilirsiniz. Snapshot’ların en güzel yanı, kurulum sırasında yanlış bir yol izlediğinizde kolayca geri dönülebilir olmaları, fiziksel makinelerde sahip olmadığımız bir lüks.

Snapshot

3. Kubernetes Hazırlıkları

Snapshot aldıktan sonra makineyi tekrar başlatıp hem master hem de node’larda bulunması gereken yazılımları yüklemeye başlayabiliriz.

Login olduktan sonra Terminal açıp aşağıdaki komutları çalıştırmaya başlayalım. Önce apt-get repository’sini güncelliyoruz.

Repository güncellemesi:

sudo su
apt-get update

Swap kullanımının kapatılması:

Kubernetes’in swap kullanımında garip hatalar verdiğine dair bilgiler mevcut. Dolayısıyla swap kullanımını devre dışı bırakıyoruz:

swapoff -a
nano /etc/fstab

/etc/fstab dosyasında swap ile başlayan satırı comment’liyoruz:

Host isminin güncellenmesi:

Sonradan bir karışıklık olmaması için her makinenin ismini güncellemekte fayda var.

nano /etc/hostname

Master ve node’ların IP adreslerinin girilmesi:

Tüm sunucuların birbirlerine host isimleriyle ulaşabilmesi için host isimleri ve IP adreslerini eşleştirmemiz gerekiyor. Yazının başında verdiğimiz statik IP’leri aynen hosts dosyasına giriyoruz:

nano /etc/hosts

Bu ayarları yaptıktan sonra özellikle hostname’in devreye girmesi için makineyi yeniden başlatmakta fayda var.

OpenSSH Server kurulumu:

Yazının sonunda, oluşturduğumuz tüm sanal makineleri headless, yani GUI olmadan çalıştırmanın yolunu göstereceğim. VMware arayüzü olmadan, örneğin master’a bağlanıp çalışabilmek için makinelerimizde OpenSSH yüklü olması gerekiyor.

sudo su
apt-get install openssh-server

Docker kurulumu:

Ağır ama emin adımlarla Kubernetes’i kurmaya doğru yaklaşıyoruz 🙂 Docker kurulumunu da tamamlayalım.

apt-get update 
apt-get install -y docker.io

Kubernetes kurulumu:

Kubernetes’i kurmadan önce aşağıdaki komutları da çalıştırıyoruz. Bu komutlar sırasıyla curl uygulamasını kuruyor. Ardından Ubuntu için Google repository key’lerini sisteme kayıt ediyor ve kurulum için gerekli olan Kubernetes repository’lerini sources.list içine atıyor.

apt-get update && apt-get install -y apt-transport-https curlcurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update

Kubernetes’i kurabiliriz artık:

apt-get install -y kubelet kubeadm kubectl

Kurulum tamamlandıktan sonra Kubernetes konfigürasyonunda bir güncelleme yapmamız gerekiyor.

nano /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Beyaz ile işaretlediğim satırı konfigürasyona eklemeniz gerekiyor:

Environment=”cgroup-driver=systemd/cgroup-driver=cgroupfs”

Böylece hem master hem de node’larda bulunması gereken herşeyi kurmuş olduk. Bundan sonraki adımda sadece master’a özel kurulumları gerçekleştireceğiz.

4. Master Kurulumu

Bu noktada VMware üzerinde bir snapshot daha almamız gerekiyor. Bu snapshot master ve node dallanmasının başlangıcı olacak. Snapshot’a Kube Base adını verdim.

Snapshot alındıktan sonra Kube Base snapshot’ına sağ tıklayıp Create Linked Clone… seçeneği ile Master için yeni bir sanal makine oluşturalım. Makine adını K8SMaster olarak belirleyin. Böylece dhcp ayarlarında, bu makine için rezerve edilmiş statik IP’yi kullanabilelim.

Makineyi başlatmadan önce işlemci çekirdek sayısını 2 ve RAM’i de en az 4GB olacak şekilde ayarlayalım. Aksi takdirde Kubernetes yetersiz kaynaklardan şikayetçi olacaktır.

Ayrıca network ayarlarına girip, yazının başında bu makine için ayarladığımız MAC adresini girmeyi unutmayın.

Makine açıldıktan sonra ilk iş olarak IP ayarlarını yapılandıralım:

Hostname’i de düzeltmemiz gerekiyor.

sudo nano /etc/hostname
Restart lütfen :-)

Kubernetes Cluster’ı başlatıyoruz:

sudo sukubeadm init --apiserver-advertise-address=192.168.58.20 \
--pod-network-cidr=192.168.0.0/16

Kurulum başarıyla tamamlandığında şöyle bir ekran görmeniz gerekiyor:

Sarı renkle belirlediğim alandaki komutu bir yere kopyalamanızda fayda var. Bu komut cluster’a node eklerken node’lar üzerinden çalıştıracağımız komut.

Mavi çerçeve ile gösterdiğim alandaki komutları normal bir kullanıcı olarak çalıştırmamız gerekiyor. Hala su modunda iseniz exit ile normal kullanıcıya geçelim.

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

Herşey yolunda mı diye test edelim:

Son olarak podların durumuna da bir bakalım:

kubectl get pods — all-namespaceskubectl get pods — all-namespaces

Tüm podlar aktif ancak DNS ve service discovery için çalışması gereken CoreDNS podları pending olarak bekliyor. Şu adresteki açıklamada görebileceğiniz gibi, CoreDNS’in aktif hale geçmesi için cluster içinde çalışacak bir network eklentisini bizim kurmamız gerekiyor. Yine Kubernetes dokümantasyonuna göre, birkaç alternatif mevcut. Ben Weave network provider ile ilerliyorum ve aşağıdaki komut ile kurulu olan Kubernetes versiyonuna uygun konfigürasyonu çekiyorum:

kubectl apply -f “https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n’)”

Bu işlemden sonra bir süre beklemeniz gerekecektir. Weave için podların oluşturulması ve CoreDNS’in devreye girmesi biraz vakit alabilir. Sonunda şu güzel çıktıya ulaşmış olmanız gerekiyor:

Tüm podlar çalışır durumda

Kubernetes Dashboard

Cluster yönetimini bir arayüz üzerinden de yapmak istiyorsanız, Kubernetes Dashboard’u da kurabilirsiniz. Kurulum oldukça basit.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml

Bu komuttan sonra da bir süre bekleyip, Dashboard için deploy edilen pod’un çalıştırılmasını beklememiz gerekiyor. Ulaşmak istediğimiz nokta şudur:

Dashboard’a erişebilmek için Kubernetes içindeki API server’a ulaşabilmek gerekiyor. Bunun için aşağıdaki komutu kullanıyoruz:

kubectl proxy

Bu adımdan sonra master’dan dashboard’a şu adres ile ulaşabiliriz: http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Ekran görüntüsünden de görebileceğiniz gibi, dashboard’a girebilmek için ya Kubeconfig dosyası, ya da bir token sağlamamız gerekiyor. Dashboard’a erişim için bir token oluşturma yolunu tercih ediyorum. Bunun için Kubernetes Dashboard projesinin altındaki wiki’de gerekli adımlar bulunuyor. Adımları buraya aynen alıyorum, ne işe yaradıklarına dilerseniz dashboard wiki’den bakabilirsiniz.

Browser’ı kapatmadan yeni bir terminal penceresi açalım ve gerekli tanımları yapalım. nano ile admin-user.yaml adında bir dosya oluşturup içine aşağıdaki tanımları yapıştırıyoruz:

apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system

Yine nano ile role-binding.yaml adında bir dosya oluşturun.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system

Bu iki yaml dosyasını kubectl ile apply ediyoruz:

kubectl apply -f admin-user.yaml
kubectl apply -f role-binding.yaml

Son olarak, oluşturulan kullanıcıya ait token’ı sorguluyoruz:

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

Turuncu ile çerçevelediğim token’ı kopyalayıp dashboard’a giriş yapabiliriz artık:

Ve dashboard karşınızda:

Master sanal makinesini açık bırakalım ve cluster’a node eklemeye başlayalım.

5. Node Sanal Makinesi

Node’lar için sanal makinelerimiz aslında hazır. K8SBase adındaki makineden bir Linked Clone oluşturmak ve ayarlarını yapmak yeterli olacak.

Node için Linked Clone Oluşturma:

K8SBase makinesinin Kube Base adındaki snapshot’ından bir Linked Clone alıyoruz. Yeni makineyi K8SNode1 adıyla kayıt ediyoruz. Makineyi çalıştırmadan önce Network ayarlarına girip, Node 1 için belirlediğimiz MAC adresini giriyoruz:

Makine çalıştıktan sonra ilk yapmamız gereken şey IP ayarlarını düzenlemek:

Master için yaptığımız gibi hostname’i de düzeltelim:

sudo nano /etc/hostname

Bu adımlardan sonra makineyi restart edelim ve restart sonrası node’un master’a ulaşabildiğini teyid edelim:

Evet bu makine cluster’a katılmaya hazır. Daha önce kubeadm init komutunun çıktısından kopyaladığımız komut ile node’u cluster’a dahil edebiliriz:

kubeadm join 192.168.58.20:6443 --token 3b506i.fzsc70zhss619n7j \
--discovery-token-ca-cert-hash sha256:d33b3a3e50e8fd4ac03e1e101a2b6e2372e94d03ea2bdee5a590bbafbcd45705

Herşey yolunda giderse, aşağıdaki ekranı görmemiz gerekiyor:

Dashboard’umuz hazır açıkken, node’un durumunu kontrol edelim.

Herşey sorunsuz çalışıyor 🎉 Ayrıca sadece bu son adımı tekrar ederek cluster’a istediğiniz kadar node eklemeniz de mümkün:

6. Headless modda VM Başlatmak

Cluster içindeki tüm sanal makineleri VMware arayüzü ile kullanabileceğiniz gibi, VMware’i hiç açmadan da arka planda bu makinelerin çalışmasını sağlayabilirsiniz. Fazladan pencere yönetmek zorunda olmadığım ve terminalden çalışmayı da sevdiğim için benim tercih ettiğim yöntem de bu.

Aşağıda verdiğim komutları start-cluster adında bir dosyaya kayıt edin:

vmrun -T fusion start [MASTER_VM_FOLDER]/K8SMaster.vmx nogui
vmrun -T fusion start [NODE1_VM_FOLDER]/K8SNode1.vmx nogui
vmrun -T fusion start [NODE2_VM_FOLDER]/K8SNode2.vmx nogui
vmrun -T fusion start [NODE3_VM_FOLDER]/K8SNode3.vmx nogui

Daha sonra bu script dosyasını çalıştırılabilir hale getirelim:

chmod +x start-cluster

Bu adımdan sonra aşağıdaki gibi tek adımda cluster’ı çalıştırabilirsiniz:

./start-cluster

Aynı şekilde tüm cluster’ı durdurmak için de aşağıdaki komutlarla bir script oluşturabilirsiniz:

vmrun -T fusion stop [MASTER_VM_FOLDER]/K8SMaster.vmx nogui
vmrun -T fusion stop [NODE1_VM_FOLDER]/K8SNode1.vmx nogui
vmrun -T fusion stop [NODE2_VM_FOLDER]/K8SNode2.vmx nogui
vmrun -T fusion stop [NODE3_VM_FOLDER]/K8SNode3.vmx nogui

Tabi arka planda çalışan makinelere SSH üzerinden ulaşmanız mümkün. Her birine ayrı statik IP verdik biliyorsunuz. VMware’in çalıştığı host makinemiz de aslında aynı network’e dahil. Dolayısıyla aşağıdaki seçenek her zaman elinizin altında:

Tebrikler! Ingress, Service Mesh vb gibi birçok özellik ve farklı aracı kurup test edebileceğiniz gerçek bir Kubernetes Lab’ınız var artık 🥳

--

--

Önsel Akın
SabancıDx

Cloud Native Engineer @ Container Solutions. Formerly @ SabancıDX, DoğuşTeknoloji, KoçSistem. Trained hundreds at BilgeAdam, KoçBryce, Netron, Microsoft etc.