Desktop Hypervisor üzerinde Kubernetes Ortamı Kurulumu (Master, Worker, NFS, HELM ve Octant)

Evren Baycan
Turk Telekom Bulut Teknolojileri
8 min readMar 31, 2023

--

Micro-services BT ortamlarında oldukça yaygınlaştı ve platform üzerinde sürekli birçok farklı çözüm geliştirip piyasaya çıkarılıyor. Çok fazla bileşen çok fazla isim olduğu içinde kavramlar gittikçe karışıyor. Aslında firmaların size sunmuş olduğu Micro-Service çözümleri ile büyük kurumlarda çalışan Micro-services platformları arasında pek bir fark yok gün sonunda kullanılan tüm araçlar benzer olduğundan bu konuyu biraz daha detaylandıracağız.

Oldukça küçük bir kaynak gereksinimi ile ufak bir Kubernetes ortamı kuracağız. Bu ortam temel seviyede tüm gereksinimleri karşılayacak. Production ortamlarında farklı servis ve gereksinimler için çok daha fazla servis ve uygulama da mevcut compute kaynaklarına göre entegre edilebilir.

Cloud Native Landscape (cncf.io) üzerinden tüm servisleri detaylı olarak inceleyebilirsiniz.

VMware Workstation/Fusion alternatif olarak Opensource VirtualBox ya da Windows 10 Pro, Enterprise, Education kullanıyorsanız Hyper-V üzerinde de aşağıdaki ortamı kurabilirsiniz.

Bu ortamı kurduğumuzda toplam kaynak kullanımız 4 vCPU, 5GB Memory ve yaklaşık 20G Disk olacak. Eğer 8GB ve üstü bir PC kullanıyorsanız rahatlıkla çalışabilirsiniz.

Biz temel Kubernetes kurulumu yapacağız. Farkı ne derseniz bu kurulumda temel seviyede Master ve Worker Node kullanacağız. İsterseniz bu işi tekil bir VM üzerinde Docker Desktop, k3s, Minikube, kind gibi alternatifler kullanarak da yapabilirsiniz. Amaç temel seviyede mantığını kavramak olduğundan Docker Dektop, k3s, Minikube, kind gibi local Kubernetes kullanırsanız uçtan uca tüm entegrasyonlar el değmeden yapılacağından açıkçası sizin entegrasyonlar konusunda pek bir katkınız olmayacak biz ise hepsini tek tek yapacağız. Böylece arada hangi gereksinimlerin olacağını da kavramış olacağız.

Bu kurulumda Master Node için HA uygulanmayacak çünkü bunun ayrı ayrı bir sürü entegrasyonu olması gerekiyor (etcd, HAproxy, Keepalived gibi) bu başlı başına ayrı konu olduğundan burada onu kapsam dışında bırakıyoruz. Şahsi bilgisayarlarımızda compute kaynak limitli olduğundan (CPU ve Memory gibi) HA senaryosu pek mümkün olmuyor. Amaç burada gerekli bileşenleri uçtan uca test etmek sonuçta burada bir production ortamı değil bir SANDBOX/LAB ortamı oluşturuyoruz.

Docker ve Kubernetes gibi CNCF uygulamaların çoğu açık kaynaklı projeler fakat SuSE, Red Hat, VMware gibi büyük yazılım üreticileri kendi içlerinde bu açık kaynak kodları kullanarak farklı dağıtımlar çıkartabiliyor. Örneğin Red Hat OpenShift, SuSE Rancher, VMware Tanzu gibi. Bu dağıtımlarında Enterprise Kubernetes olarak tanımlıyoruz. Aynı şekilde Docker EE (Enterprise Edition) da bunlara alternatif gösterilebilir. Enterprise Kubernetes kullandığımızda ayrıca lisanslamaya da dahil oluyoruz. Bu lisanslama Core, Soket ya da Node temelli olabiliyor. Lisanslama genel olarak Support&Subscription şeklinde yapılıyor böylece kullanmış olduğunuz kaynak kadar lisans, destek ve güncelleme almış oluyorsunuz.

PaaS olarak Kubernetes, IaaS olarak OpenStack, SDS olarak CEPH, SDN olarak OVN/OVS bunların hepsi ücretsizdir fakat bir servis sağlayıcı, banka, sigorta gibi bir kurumdaysanız sürdürülebilir operasyon ve güvenlik için Enterprise-Class kullanmanız oldukça önemli. Üreticiler bu konuda size uçtan uca destek sağladığı için yaşanabilecek ciddi bir güvenlik ya da operasyon sorununda sizi güvenceye alacaktır.

Topolojimiz aşağıdaki gibi olacaktır.

VMware Workstation üzerinde Master ve Worker olarak 2 adet VM hazırlıyoruz.

Eğer ortamda kullanacağınız networkleri özelleştirmek isterseniz ya da detaylarını merak ediyorsanız Virtual Network Editor’ü kullanabilirsiniz.

Bu ortamda Ubuntu Server 22.04 LTS kullanıyoruz. Standart Ubuntu dağıtımına göre daha farklı bir kurulum arayüzüne sahip bu nedenle üzerinde kısaca geçelim.

Kurulum tipini varsayılan olarak bırakıyorum Ubuntu Server bir GUI ile gelmiyor varsayılan kurulum tipinde gerekli olan tüm temel bileşenler geliyor.

Standart olarak LVM disk yapısı kullanıyor. Varsayılan olarak bırakabilirsiniz ya da özelleştirebilirsiniz.

OpenSSH üzerinden ortamı yöneteceğimiz için kurulama OpenSSH mutlaka dahil etmeliyiz.

Ubuntu Server kurumsal bir dağıtım olduğu için aşağıdaki katalog üzerinden sık kullanılan uygulamaların kurulumlarını da yapabilirisiniz.

Varsayılan olarak devam edebiliriz.

Hem Master hem de Worker üzerinde aşağıdaki konfigürasyonları yapıyoruz.

Statik IP konfigürasyonu

sudo nano /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses:
- 192.168.145.100/24
nameservers:
search: [local]
addresses: [8.8.8.8, 8.8.8.4]
routes:
- to: default
via: 192.168.145.2
sudo netplan apply

Hostname konfigürasyonu

sudo hostnamectl set-hostname k8s-master
sudo nano /etc/hosts
192.168.145.100 k8s-master
192.168.145.200 k8s-worker

Swap ve Kernel konfigürasyonu

sudo swapoff -a

sudo nano /etc/fstab
# swap satırının başına # ekliyip, restart ediyoruz.

sudo shutdown -r now

Containerd kurulumu (Container Runtime)

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

sudo modprobe overlay

sudo modprobe br_netfilter

sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system
sudo apt install -y curl gnupg2 software-properties-common apt-transport-https ca-certificates

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update

sudo apt install -y containerd.io

containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1

sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

sudo systemctl restart containerd

sudo systemctl enable containerd

sudo systemctl status containerd

Kubernetes kurulumu

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg

sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

sudo apt update

sudo apt install -y kubelet kubeadm kubectl

sudo apt-mark hold kubelet kubeadm kubectl

Master Node üzerinde Kubernetes Cluster kurulumu (Bu komutu yalnızca Master Node üzerinde çalıştırıyoruz!!!)

sudo kubeadm init --control-plane-endpoint=k8s-master

Master Node kurulumu sonrası Kubernetes Cluster erişimi için izinlerimizi tanımlıyoruz.

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

sudo systemctl status kubelet

Worker Node için Join konfigürasyonu (Bu komutu yalnızca Worker Node üzerinde çalıştırıyoruz!!!)

NOT: Kullanılan token sizde farklı olacaktır.

sudo kubeadm join k8s-master:6443 --token ko1sql.gqzh3jfd4w054rhs \
--discovery-token-ca-cert-hash sha256:4d7227917c2ea7c5fd635bd285f4f5091c09e0b7608e007cb509b15ea27794f5

Master Node üzerinde CNI kurulumu (Container Network Interface)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml

Kubernetes kurulumu tamamlandı. Bir kaç komutla cluster üzerinde gözlem yapabilirsiniz.

kubectl get pods -n kube-system

kubectl get nodes

Aşağıdaki komutla Worker Node için bir etiket girebilirsiniz.

kubectl label node k8s-worker node-role.kubernetes.io/worker=worker

NFS Server kurulumu

CSI (Container Storage Interface) için NFS servisini kullanacağız. Oluşturulan NFS paylaşımı üzerinden de POD’lar için Persistent Volume sağlanacak.

NFS rolünü Master Node üzerinde çalıştıracağız.

sudo apt -y install nfs-kernel-server

sudo mkdir /nfs

sudo nano /etc/exports
# en alt satıra aşağıdaki parametreyi ekleyeceğiz.
/nfs 192.168.145.100/24(rw,sync,no_subtree_check)

sudo chown nobody:nogroup /nfs

sudo chmod 777 /nfs

sudo systemctl restart nfs-server

sudo exportfs -a

Worker Node üzerinde NFS Client kurulumu ve konfigürasyonu

sudo apt -y install nfs-common

sudo mkdir /nfs

sudo mount -t nfs 192.168.145.100:/nfs /nfs

sudo nano /etc/fstab
# konfigürasyonun kalıcı olması için aşağıdaki parametreyi ekliyoruz.
192.168.145.100:/nfs /nfs nfs defaults 0 0

df -hT

Master Node üzerinde HELM kurulumu

HELM oldukça faydalı bir uygulama yöneticisidir. HELM Chart ile Bitnami gibi uygulama kataloglarını kullanarak kolayca uygulama dağıtımı ve konfigürasyonu yapabilirsiniz.

wget https://get.helm.sh/helm-v3.11.2-linux-amd64.tar.gz

tar -zxvf helm-v3.11.2-linux-amd64.tar.gz

sudo mv linux-amd64/helm /usr/local/bin/helm

helm version

Gerekli HELM kaynaklarının eklenmesi

helm repo add stable https://charts.helm.sh/stable

helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/

helm repo add bitnami https://charts.bitnami.com/bitnami

helm repo update

helm repo list

HELM ile NFSProvisioner kurulumu

Bu kurulum ile bir Storage Class (SC) oluşturmuş olacağız.

helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.145.100 --set nfs.path=/nfs

CSI ve Storage Class konfigürasyonu kontrol edelim.

kubectl get pods --all-namespaces

kubectl get sc

HELM Chart ile bir RabbitMQ kurulumu yapalım.

helm install rabbitmq --set auth.password=demo1234 --set persistence.storageClass=nfs-client --set persistence.accessMode=ReadWriteMany --set persistence.size=1Gi --set service.type=NodePort bitnami/rabbitmq

POD ve servis durumunu kontrol edelim.

kubectl get pods

kubectl get pv

kubectl get pvc

kubectl get service

Uygulamaya bağlanıp kontrol edelim.

Octant ile Cluster Monitoring

Octant VMware tarafından geliştirilen çok kullanışlı bir Open Source Kubernetes Dashboard uygulamasıdır. Kullanmanızı tavsiye ederim.

wget https://github.com/vmware-archive/octant/releases/download/v0.25.1/octant_0.25.1_Linux-64bit.deb

sudo dpkg -i octant_0.25.1_Linux-64bit.deb

OCTANT_LISTENER_ADDR=0.0.0.0:8090 octant #any interface, Port 8090

Artık şahsi bilgisayarınızda gerçeğe yakın bir Kubernetes Cluster ortamı kurmuş bulunuyorsunuz.

Benim için sadece Kubernetes Cluster yeterli bu tarz kurulum ve konfigürasyonları yapmak istemiyorum derseniz o zaman k3s kullanabilirsiniz. Bunun için hali hazırda bir Ubuntu, Debian, Centos gibi bir dağıtım yeterli olacak k3s arka planda tüm kurulum ve entegrasyonları sizin yerinize yapacaktır. Alternatif olarak Docker Desktop da kullanabilirsiniz.

Eğer Open-Source Kubernetes’i (Vanilla Kubernetes) olarak production ortamı olarak kullanmak isterseniz buraya kadar yapılan kurulum ve konfigürasyonlar buz dağının sadece görünen yüzü oluyor. Bunlara CD/CI, Private Image Registry, Service Proxy, Service Mesh gibi servisler gerektiği zaman entegrasyonlar oldukça artacak ve karmaşık bir hale gelmiş olacak.

CNCF içerisinde en bilindik uygulama ve servisleri entegre çözüm olarak uçtan uca almak isterseniz o zaman Enterprise-Class Kubernetes çözümü olarak VMware Tanzu, Red Hat OpenShift, SuSE Rancher gibi çözümleri kullanabilirsiniz. Platformun tüm yaşam döngüsü (kurulum, entegrasyon, güncelleme, güvenlik ve destek gibi) yazılım üreticisinde olacak. Böylece CNCF içindeki entegrasyonlara efor ve zaman harcamaktansa var olan eforunuzu güvenli bir şekilde uygulama ve süreçleri geliştirmeye harcıyor olacaksınız.

Dr. Manhattan’a dönüşmek istemiyorsanız siz Production ortamlarda mutlaka Enterprise-Class Kubernetes kullanın :)

--

--