KUBERNETES VE KURULUM

Container Nedir?
Container teknolojisin de geliştiricinin bir uygulamayı ihtiyaç duyduğu paketler,kütüphaneler ve diğer bağımlılıklarıyla birlikte paketlemesini sağlar. Bu sayede uygulama makine özelliklerine bağlı kalmadan başka bir sunucu üzerinde ilgili container engine’nin(örn. Docker) üzerinde kullanılabilir.  Container teknolojisi olmadan uygulamayı başka bir linux makine üzerinde kullanacak olsaydık makine özelliklerini uygulama için ayarlamamız gerekecekti. Container sayısı artıkça yönetimi konusunda zorluklar yaşanır. Bu zorlukların yaşanmaması adına containerları yöneten yapılar ortaya çıkmıştır. Kubernetes bunlardan bir tanesidir.

Kubernetes Mimarisi

KUBERNETES CLUSTER KOMPONENTLERİ

Kubernetes Master Node Komponentleri:
   . Kube-apiserver
   . Kube-scheduler
   . Kube-controler-manager
   . Etcd

Kube-apiserver: Master sunucusuna gelen tüm REST isteklerini yönetir. Yapılan tüm işlemleri etcd databasesi üzerine kaydeder. Ayrıca  yetkilendirme işlemi yapar.
Kube-scheduler: Oluşturulacak pod’un hangi node üzerinde oluşacağına karar verir. Bu kararı kaynak gereksinimleri, donanım, yazılım,işyükleri vb. gibi değerlendirmeleri yaparak alır. Yeni bir pod oluşturulması isteği için kube-apiserveri dinler.
Kube-control-manager: Temel olarak bir denetleyici görevindedir. Deployment, statefulset vb. ksımların yönetilmasini sağlar. Bu durumu sağlamak için api-serveri dinler. İlgili durumu istenen duruma  getirmek için gerekli değişiklikleri sağlar. İçerisinde node controler, replica controler, endpoint controler, service account ve token controler içerir.
ETCD: Open source tutarlı ve izlenebilir bir key-value databasedir. Nosql database diyebiliriz. Dilersek database’ye sorgu atabiliriz. Buradaki bilgiler değiştirildiğinde önceki bilgilerin tutulmasını sağlar.İşlemlerin yerinde güncellemez, bunun yerine güncellenmiş yapıyı oluşturur. Eski verileri korumak adına sıkıştırarak saklayabiliriz.

Kubernetes Worker Node Komponentleri: 
   . Kubelet
   . Kube-proxy
   . Container-engine
   . Pod

Kubelet: Worker node üzerindeki ana agent’tr. Gerekli işlemleri yerine getirmek için api serveri dinler. İlgili docker servisi ile konuşarak ilgili podun ayağa kalkması sağlanır. Ayrıca podların çalışır durumda olmasını sağlar.
Kube-proxy: Kubernetes üzerinde her node üzerinde çalışan kubernetes network’u diyebiliriz. Podlara benzersiz(unique) IP adresi ataması yapar. Ayrıca her pod içerisinde bulunan containerlar bu ip adresini ortak olarak kullanır. Pod içerisinde birden fazla container var ise port bilgisi ile bu ip adresi üzerinden ilgili containerlara ulaşım sağlanır. Kube proxy ağ kurallarınıda belirler. Bu kurallar çerçevesinde dışardan veya içeriden podlara erişim sağlanır. Ayrıca servis altındaki podlara load balancer özelliği kazandırır.
Container-engine: Container’ların çalışmasından sorumlu ve yönetimini yapan kısımdır. Container oluşumun da ilgili image dosyasını çeker container’ın çalışmasını ve durdurulmasını sağlar. Kubernetes birden fazla container-runtime destekler. Bunlar; Docker , containerd , cri-o , rktlet ve Kubernetes CRI’nin (Container Runtime Interface)
Pod: Bir veya daha fazla container’dan oluşan yapılardır. Kubernetes cluster yapısının en küçük yapı birimidir. Her bir pod’un unique ip adresi vardır. Podlar linux namespacelerini paylaşır. Bunlar IPC, Network, Mount, UTC’ dir.Aynı işi yapan container’lar aynı pod içerisinde bulunması istenir. Pod’lar arasında aksini söylemedikçe veri iletişimi ve bağlantı söz konusudur.

Kubernetes Çalışma Şekli

  1. Develepordan pod oluşturma isteği alındığında bu istek kubctl üzerinden api-servera iletilir.
  2. Api-server aldığı bu isteği etcd’ye yazar.
  3. Etcd bilginin yazıldığına dair bilgiyi api-server’a iletir.
  4. Api-server yeni pod oluşturulacağına dair bilgiyi schedulera iletir.
  5. Scheduler podun hangi node üzerinde oluşacağına dair karar verir ve  bilgiyi api-server’a iletir.
  6. Api-server bu bilgiyi etcd’ye yazar.
  7. Etcd bilginin yazıldığına dair api-server’a geri dönüş yapar.
  8. Api-server ilgili node üzerindeki kubelet’i tetikleyerek bilgilendirir.
  9. Kubelet ilgili docker servisi ile api aracılığı ile iletişime geçerek ilgili container’ın pod içerisinde oluşmasını sağlar.
  10. Kubelet pod oluşturulduğunu ve durumuna dair bilgiyi api-server’a iletir.
  11. Api-server bilgiyi etcd’ye yazar.

KUBERNETES KURULUMU

Verilen link üzerinden aşağıdaki adımlar ile kurulumun nasıl yapıldığına dair video’yu izeleyebilirsiniz.

Kubernetes Kurulumu

Burada rhel 7.6 üzerinde bir master ve bir worker node bulunan kubernetes cluster kurulumu yapılacaktır. Kurulum için bizlere iki adet sunucu gerekecektir. Sunucular kendi aralarında erişim olacak şekilde kurulmalıdır. Ve kubernetes kurulumu için minumum gereksinimlerin karşılaması gerekir.
1 master node ve 1 worker node için minumum 2 CPU ve 2 GB RAM
1 master node ve 2 worker node için minumum 2 CPU ve 4 GB RAM

Ayrıca kubernetes kurulacak makineler üzerinde docker servislerinin kurulu olması gerekmektedir.
Docker kurulumu için gerekli bilgiyi buradan alabilirsiniz. Docker servislerinin durumu master ve worker node üzerinde kontrol edilmelidir.

systemctl status docker
Docker Servislerinin Durmlarının Görüntülenmesi

Cluster yapısında birimlerin birbiriyle ve dışarı ile haberleşmesi için portların firewall üzerinde eklenmesi gerekir. İstenilirse makine üzerindeki firewalld servisi kapatılabilir. Master node üzerinde aşağıdaki portlar firewall üzerinde eklenmelidir. Portlar eklendikten sonra firewall’un ayarları uygulaması için firewall servisi restart edilmelidir.

firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --reload
Portların Eklenmesi

Worker node olacak sunucuda aşağıdaki portlar firewall kısmına eklenmelidir.

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=6783/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --reload
Portların Eklenmesi

Yukarıdaki portları açıklamak istersek;
6443 : Kube-apiserver
2379-2380 : Etcd client api
10250 : Kubelet-api
10251 : Kube-scheduler
10252 : Kube-controler-manager
10255 : Read-only kubelet api
30000-32767 : Nodeport  ports
8472 : Canal/Flannel VXLAN overlay networking
6783 : Weave Port

Daha sonra host dosyası düzenlemesi ve hostname ayarları yapılır.

vim /etc/hostname

Bu dosya her iki sunucu içerisinde açılır ve içerisine istediğiniz hostname ismini verebilirsiniz. Ben anlaşılması adına “k8smasternode” ismini master node olacak sunucu için verdim.

Hostname İsmi Verilmesi

Worker node içerisinde de aynı komut çalıştırılarak isim verilir. Ben “k8sworkernode” ismini verdim.Veya aşağıdaki komut ile istediğimiz hostname ismini verebiliriz.

hostnamectl set-hostname k8smasternode

Aynı işlem worker node üzerinde de yapılır.

hostnamectl set-hostname k8sworkernode

Bu adımlardan sonra makine IP adresleri ve sunucu isimleri her iki sunucu da hosts dosyası içerisine yazılır. Master node olacak sunucuda hem kendisi hem worker node olacak makinenin IP adresi ve ismi yazılır. Aynı şekilde worker node üzerinde de ilgili dosya içerisine hem master node IP adresi hemde kendi ip adresi ve ismi yazılır.

vim /etc/hosts
master node ip adresi k8smasternode
worker node ip adresi k8sworkernode
Hosts Dosyası İçeriğinin Düzenlenmesi

Aşağıdaki komut ile repo dosyası oluşturulur ve içerikleri eklenir. Aşağıdaki adım hem master hem worker node üzerinde yapılır.

bash -c 'cat <<EOF > /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
exclude=kube*
EOF'
Repo Dosyasının Oluşturulması

Her iki sunucu da Selinux ve swap kapatılır.

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Kurulum adımına geçilir. Master ve worker node üzerinde bu adımlar uygulanır.

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
Kubelet Kubeadm Kubectl Yüklenmesi

NOT: Eğer Redhat veya Centos repo dizini sisteminizde aktif değil ise aşağıdaki şekilde dependencies yükleme manuel olarak yapılır.
Eğer sisteminizde ansible var veya ansible ile yüklemek isterseniz aşağıdaki linkten gerekli adımları takip edebilirsiniz.
Buradan

Eğer aşağıdaki gibi bir hata alınırsa istenilen dependencies ‘ler rpm dosyası olarak indirilir ve /opt dizini altına veya başka bir dizin altına atılarak yüklemesi yapılır. Eğer rpm dosyası indirip yüklemek istemiyorsanız cd mount edip o cd rom üzerinden kubernetes yüklenirken otomatik yüklenmesini sağlayabilirsiniz. Buradan Docker kurulumu üzerinde cd mount etme ile ilgili kısımdan faydalanabilirsiniz.

Hata Alınması

İstenen paketler için linkler aşağıdadır.

http://mirror.centos.org/centos/7/os/x86_64/Packages/libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/libnetfilter_cttimeout-1.0.0-6.el7.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/conntrack-tools-1.4.4-5.el7.x86_64.rpm
http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/l/libnetfilter_cthelper-1.0.0-4.el7.x86_64.rpm
http://mirror.centos.org/centos/7/os/x86_64/Packages/socat-1.7.3.2-2.el7.x86_64.rpm

yum install -y /opt/libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm
yum install -y /opt/libnetfilter_cttimeout-1.0.0-2.el7.x86_64.rpm
yum install -y /opt/conntrack-tools-1.4.4-5.el7.x86_64.rpm
 yum install -y /opt/libnetfilter_cthelper-1.0.0-10.el7.x86_64.rpm
yum install -y /opt/socat-1.7.3.2-2.el7.x86_64.rpm

Ek paketler indirildikten sonra yukarıdaki kubelet, kubeadm, kubectl yükleme adımı tekrarlanır.Ve master ve worker node üzerinde kubelet servisi aktif edilir ve başlatılır.

systemctl enable kubelet && systemctl start kubelet
Servisin Enable Edilmesi Ve Başlatılması

Her iki sunucu da IP tables ayarları için aşağıdaki adımlar uygulanır.

bash -c 'cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF'
IP Tables Ayarlamaları

Değişikliklerin uygulanması için aşağıdaki komut çalıştırılır.

sysctl --system
IP Tables Ayarlarının Uygulanması

Her iki makinede(master ve worker) net-filter modülü yüklenir.

lsmod | grep br_netfilter
Net-filter Yüklenmesi

Daha sonra master node üzerinde kubeadm ile ilgili image dosyaları indirilir.

kubeadm config images pull
İmage Dosyalarının Pull Edilmesi

İmage dosyaları indirildikten sonra cluster network ayarlamalarında podlar için IP bloğu belirlenir.

kubeadm init --pod-network-cidr=10.244.0.0/16

Yukarıdaki adımda hata alınırsa aşağıdaki komut ile swap kapatılmalıdır. Sonra yukarıdaki komut tekrar çalıştırılmalıdır. Alınan hata aşağıdaki görselde belirtilen şekilde ise aşağıdaki komut çalıştırılır ve daha sonra yukarıdaki komutun tekrar çalıştırılması sağlanır.

IP Fprward Hatası
kubeadm reset
echo 1 > /proc/sys/net/ipv4/ip_forward
kubeadm init --pod-network-cidr=10.244.0.0/16

Komut çalışması sonladığında worker nodelerın master node bağlanması için ilgili token ürerilecektir. Bu tokeni saklamalısınız. Üretilen kısım aynen kopyalanır ve master sunucu kurulumu tamamlandıktan sonra worker node üzerinde çalıştırılır.

Üretilen Tokenin Alınması

Kubernetes cluster’ına erişebilmek için dizin oluşturma, config dosyası ekleme ve yetki verme işlemi yapılır.

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

Daha sonra ağ ayarları için github üzerindeki flannel.yaml dosyası apply edilir.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Bu işlemler tamamlandıktan sonra üretilen kod worker node üzerinde çalıştırılır.

VAKİT BULDUKÇA YAZMAYA DEVAM EDECEĞİM…

“KUBERNETES VE KURULUM” üzerine 2 yorum

Yorum yapın