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 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
- Develepordan pod oluşturma isteği alındığında bu istek kubctl üzerinden api-servera iletilir.
- Api-server aldığı bu isteği etcd’ye yazar.
- Etcd bilginin yazıldığına dair bilgiyi api-server’a iletir.
- Api-server yeni pod oluşturulacağına dair bilgiyi schedulera iletir.
- Scheduler podun hangi node üzerinde oluşacağına dair karar verir ve bilgiyi api-server’a iletir.
- Api-server bu bilgiyi etcd’ye yazar.
- Etcd bilginin yazıldığına dair api-server’a geri dönüş yapar.
- Api-server ilgili node üzerindeki kubelet’i tetikleyerek bilgilendirir.
- Kubelet ilgili docker servisi ile api aracılığı ile iletişime geçerek ilgili container’ın pod içerisinde oluşmasını sağlar.
- Kubelet pod oluşturulduğunu ve durumuna dair bilgiyi api-server’a iletir.
- 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.
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
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
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
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.
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
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'
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
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.
İ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-184.108.40.206-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-220.127.116.11-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
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'
Değişikliklerin uygulanması için aşağıdaki komut çalıştırılır.
sysctl --system
Her iki makinede(master ve worker) net-filter modülü yüklenir.
lsmod | grep br_netfilter
Daha sonra master node üzerinde kubeadm ile ilgili image dosyaları indirilir.
kubeadm config images pull
İ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.
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.
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…