Desktop Hypervisor üzerinde Kubernetes Ortamı Kurulumu (Master, Worker, NFS, HELM ve Octant)
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 :)