Öncelikli olarak ‘Kubernetes’ kelimesi uzun bir kelime olduğu için yazının devamında ‘k8s’ olarak devam edilecektir. Bu kısaltmanın ‘K’ ve ‘S’ harfleri arasında 8 harf olmasıdır. Basitçe söylemek gerekirse, K8s bir container düzenleme sistemidir. Diğer bir deyişle, K8s’leri kullandığınızda, container tabanlı bir uygulama otomatik olarak konuşlandırılabilir, ölçeklenebilir ve yönetilebilir. En basit haliyle container orchestration teknolojisi diyebiliriz. Zaten kelimenin kökeni yunan alfabesinden gelmektedir. İngilizce olarak baktığımızda ‘ Helmsman’ veya ‘Pilot’ anlamına gelir.
Kubernetes Nedir ?
K8scontainer orchestration amacı, paketlenmiş uygulamaları temsil eden ve tedarik edildikleri her yerde onlar için gereken kodu ve her şeyi içeren bir container filosunu yönetmenin karmaşıklığını soyutlamaktır. Kullanıcılar, K8s REST API ile etkileşime girerek uygulamalarının istenen durumunu tanımlayabilir ve K8s altyapıyı uyumlu hale getirmek için gereken her şeyi yapar. Kapsayıcı gruplarını dağıtır, çoğaltır, bazıları başarısız olursa yeniden dağıtır. Open source olduğu için bir K8s kümesi neredeyse her yerde çalışabilir ve başlıca genel cloud sağlayıcılarının tümü bu teknolojiyi kullanmak için kolay yollar sunar. OpenStack tabanlı özel bulutlar da K8s çalıştırabilir ve bare metal sunucular bunun için çalışan nodelar olarak kullanılabilir. Dolayısıyla, uygulamanızı K8s’in yapı taşlarıyla tanımlarsanız, bunu sanal makineler veya bare metal sunucularda, public veya private cloudlarda dağıtabilirsiniz.
Kubernetes Cluster Nedir ?
K8’in mimarisi nispeten basittir. Uygulamanızı barındıran nodelarla hiçbir zaman doğrudan etkileşime girmezsiniz, ancak yalnızca bir API sunan ve pod adlı container gruplarının planlanmasından ve çoğaltılmasından sorumlu olan kontrol düzlemiyle etkileşime girersiniz. Kubectl, istenen uygulama durumunu paylaşmak veya altyapının mevcut durumu hakkında ayrıntılı bilgi toplamak için API ile etkileşim kurmanıza olanak tanıyan komut satırı arayüzüdür.
Terminoloji
- Node: Dağıtılmış uygulamanızın bir bölümünü barındıran her node, Docker’dan veya CoreOS’tan Rocket gibi benzer bir container teknolojisinden yararlanarak bunu yapar. Nodelar ayrıca iki ek yazılım parçası çalıştırır: çalışan uygulamanıza erişim sağlayan kube-proxy ve k8s kontrol düzleminden komutlar alan kubelet.
- Master: Master Node, bir dizi çalışan node’u kontrol eden ve yöneten node’dur.
- Worker: Çalışan nodelar, uygulamanın iş yükünün bileşenleri olan podları barındırır.
- Pod: Podlar, bir veya daha fazla containerdan, paylaşılan depolama alanlarından ve bunların nasıl çalıştırılacağına ilişkin seçeneklerden oluşan bir gruptur. Her pod kendi IP adresini alır.
- Label: Labellar, K8S’in podlar, replication controllerlar, endpointler vb. gibi herhangi bir nesneye eklediği key/value çiftleridir.
- Annotation: Annotations, sorgulanamayan rastgele metadata depolamak için kullanılan key/value çiftleridir.
- Service: Services, bir logical pod kümesini ve network üzerinden bunlara erişme politikasını tanımlayan bir özetidir.
- Replication Controller: Replication Controllerlar, herhangi bir zamanda belirli sayıda pod replica çalışmasını sağlar.
- Secret: Secrets; parolalar, TLS sertifikaları, OAuth tokenlar ve ssh keyler gibi hassas bilgileri tutar.
- ConfigMap: ConfigMap’ler, containerları K8s’ten bağımsız olarak tutarken configuration data containerları enjekte etmek için kullanılan mekanizmalardır.
Local K8s Lab Oluşturmak
Öncelikli olarak bir virtulization aracına ihtiyacımız olacaktır. Bu yazıda Operating System olarak Window virtulization aracı olarak VMware Workstation tercih edilmiştir. Dilerseniz operating system olarak MacOS yada ubuntu tercih edebilirsiniz, virtulization aracı olarakta Hyper-V veya VirtualBox tercih edebilirsiniz.
K8s için kurulacak cluster doğru stabil çalışabilmesi için cluster içindeki makinelerin network tarafında haberleşmesinde herhangi bir sorun olmaması gerekir. Daha sonra düzenleme yapmamak adına birde aracın network adaptöründe NAT üzerinden haberleşmesi sağlanacağı için öncelikli olarak network konfigürasyonları yapılacaktır. Araç kurulduktan sonra konfigürasyon doyasını default olarak ‘C:\ProgramData\VMware\vmnetdhcp.conf’ bu path atacaktır. Burda localddeki subnet ile çakışmayacak istediğimiz ip bloğunu kullanabiliriz. Dosyanın en alt kısmına aşağıdaki configler direk yazılabilir.
host K8SMaster {
hardware ethernet EE:DA:CC:D1:FE:4C;
fixed-address 192.168.61.40;
}
host K8SNode1 {
hardware ethernet D3:B1:FB:B3:A0:D8;
fixed-address 192.168.61.41;
}
host K8SNode2 {
hardware ethernet F1:6C:97:B5:A2:B6;
fixed-address 192.168.61.4
2;
}
VMware Workstation da makineleri oluşturmaya başlayabiliriz. 3 makine oluşturacağız. Biri master node ve diğer ikisi worker node lar olacaktır. Makineleri speclerini aşağıdaki gibi yapabilirsiniz.
K8sMaster : 4 core 4 memory 40 gb hdd
K8sNode1 : 2 core 2 memory 40 gb hdd
K8sNode2 : 2 core 2 memory 40 gb hdd
Makineleri oluşturduktan sonra öncesinde belirlenen konfigürasyonları alması için Network Adapter, Advanced sekmesinden belirlenen MAC adreslerini girmek gerekecektir.

OS kurulumdan sonra OS içindede verdiğimiz IP leri makinelere atıyoruz. K8s, IP bilgisine ihtiyaç duymadığı için bütün makinelerimize hostname veriyoruz ve bütün makinelerin hosts dosyasına makinelerin hostname ve IP bilgilerinin yazıyoruz. Örnek olarak master aşağıdaki gibidir;
sudo hostnamectl set-hostname K8SMaster
sudo nano /etc/hostname
K8SMaster 192.168.61.40
K8SNode1 192.168.61.41
K8SNode2 192.168.61.42
Bu configleri diğer node lar içinde yapıyoruz. Ayrıca K8s swap disk kullanımında hatalar verdiği için bütün makinelerde swap devre dışı bırakıyoruz.
sudo swapoff -a
sudo nano /etc/fstab
Swap file başına # sembolü yerleştiriryoruz.

Öcelikli olarak bütün makinelerde docker kuruyoruz. Docker ile ilgili bilgiler için bu yazıyı okumanızı tavsiye ederim.
sudo yum-config-manager –enable extras
sudo yum install device-mapper-persistent-data lvm2
sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
sudo systemctl start docker
sudo systemctl enable docker
Artık K8s kurulumuna başlayabiliriz. Yine bütün makinelerde kurulacaktır. K8s repository ler ekleyip kuruluma başlıyoruz.
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
sudo yum install -y kubelet kubeadm kubectl
systemctl enable kubelet
systemctl start kubelet
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl –system
Bütün makinelerde kurulum tamamlandıktan master konfigürasyonuna başlayabiliriz.
kubeadm init –apiserver-advertise-address=192.168.61.40 \ –pod-network-cidr=192.168.0.0/16
Başarıyla tamamlandıktan sonra aşağıdaki gibi bir ekran gelecektir;

İlk çizilen alanda başarıyla kurulduğunu gösteriyor. İkinci çizilen alanda ise cluster kullanmak için herhangi bir user ile komutları çalıştırmamız gerekiyor. Üçüncü çizilen alanda ise worker ları master join edebilmek için gerekli komut veriyor bunu bir kenara yazmakta faydalıdır. Öncelikli olarak master da ikinci alandaki komutları uyguluyoruz.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Aşağıdaki komutla podların durumunu görebiliriz.
kubectl get pods –all-namespaces
Tüm podlar aktif fakat CoreDNS kurulu olmadığı için DNS ve service discovery için çalışması gereken podlar pending durumdadır. Daha öncede belirtildiği üzere servisler birbirinin IP sini resolve edebilmek için DNS kullanır. Bunu kube-dns veya CoreDNS ile sağlayabilirsiniz. Farklı tercihler de mevcut fakat bu yazıda Weave network provider tercih edilmiştir. Nodelar arasında mesh overlay oluşturduğu için esnek bir yönlendirme olacağından tercih edilmiştir.
kubectl apply -f “https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d ‘\n’)”
Sonrasında artık node ları join edebiliriz. Her iki node üzeirndede daha önce adlığımız join komutunu uyguluyoruz.
kubeadm join 192.168.61.40:6443 –token 3b506i.fzsc70zhss619n7j \ –discovery-token-ca-cert-hash sha256:d33b3a3e50e8fd4ac03e1e101a2b6e2372e94d03ea2bdee5a590bbafbcd45705
Ve K8s lab’ımız artık hazır testlerimizi yapabileceğimiz bir cluster’ımız var.
Cluster yönetimini komut üzerinden yönetmeyi tercih etmeyebiliriz. K8s’in bunun içinde bir çözümü var bir gui ile bunu yapabiliriz. Bunun için dashboard kurulumundan bahsedilcektir. Aşağıdaki komutla master node üzerinde kurulumu sağlıyoruz.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
mkdir ~/dashboard && cd ~/dashboard
Pod deploy edildikten sonra running duruma gelmesini bekliyoruz. Fakat dashboard girebilmek için bir kubeconfig dosyası veya bir token ihtiyacı vardır. Bu yazıda token tercih edilecektir.
Bunun için bir dashboard-admin.yaml dosyası oluşturuyoruz.
nano dashboard-admin.yaml

Bu ‘.yaml’ dosyasını kubectl ile apply ediyoruz.
kubectl apply -f dashboard-admin.yaml
Oluşturulan user’a ait token aşağıdaki kkomutla sorguluyoruz.
kubectl get secret -n kubernetes-dashboard $(kubectl get serviceaccount admin-user -n kubernetes-dashboard -o jsonpath=”{.secrets[0].name}”) -o jsonpath=”{.data.token}” | base64 –decode
Daha sonra master makinede aşağıdaki komutla dashboard erişimini akrif ediyoruz.
kubectl proxy
Artık master makinede browser üzerinden aşağıdaki linkten dashboard erişebiliriz.
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
Dashboard hazır açıkken Nodeların durumunu kontrol edebiliriz.

0 yorum