Centos 7 Üzerine Kubernetes kurulumu

Bu makale ile uzun bir maratona başlıyoruz. Hazır olun… Kubernetes… İlk bölümlerde kurulumlara başlıyoruz.

Aşağıda paylaşacağım detaylar 1 master, 2 worker olmak üzere 3 node Kubernetes kurulumunu anlatmaktadır. Kurulum adımlarını tüm node’lar ve master node olmak üzere 2 bölümde gruplanmıştır.

Tüm Node’larda

Öncelikle sunucularda firewall’un aktif olması durumunda aşağıdaki komutlarla gerekli izinler verilmelidir;

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=10255/tcp
firewall-cmd --reload

alternatif olarak FirewallD aşağıdaki komutla disable edilebilir;

systemctl stop firewalld
systemctl disable firewalld

IPTables aktif ise Kubernetes kurulumu için br_netfilter Kernel modülüne ihtiyaç bulunmaktadır. Bu modül sayesinde bridge üzerinden gezen paketler iptables tarafından filtreleme ve port forwarding için işlenebilecek, kubernetes pord’ları cluster içerisinde birbiri ile iletişim kurabilecektir. Bu sebeple modül aşağıdaki şekilde aktif hale getirilir;

modprobe overlay
modprobe br_netfilter

cat > /etc/sysctl.d/99-kubernetes-cri.conf <<eoh align="justify" <p="" sourcecode]="" [="" --system="" sysctl="" net.bridge.bridge-nf-call-ip6tables="1" net.ipv4.ip_forward="1" net.bridge.bridge-nf-call-iptables="1" eoh="">Sistemin yeniden başlatılması ardından da değişikliklerin etkin olması için;</eoh>


echo overlay >> /etc/modules-load.d/overlay.conf
echo br_netfilter >> /etc/modules-load.d/br_netfilter.conf

Sistemlerin güncellemesi yapılır;

yum update -y

Sunucuların birbirine isimleri üzerinde gidebildiği test edilir. DNS sunucusu yoksa /etc/hosts dosyasına diğer sunucular girdi olarak eklenmelidir.

Aşağıdaki komutlar sunucularda swap kullanımı kapatılır;

swapoff -a
sed -i.bak -r 's/(.+ swap .+)/#\1/' /etc/fstab

Kontrol için aşağıdaki komut kullanılabilir;

free

Container Runtime Kurulumu – Docker

Kubernetes farklı Container Runtime’larını desteklemektedir. Bu yazımda Docker ile ilerleyeceğim için öncelikle Docker kurulumu yapılmalıdır.

Tüm sunucularda SELinux kapatılır;

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/sysconfig/selinux

Bu komutlarla SELinux permissive modunda çalıştırılır. Bu sayede container’lar host dosya sistemine ulaşabilecektir, bu durum örneğin pod network’leri için gereklidir.

Docker kurulumu için gerekli paketler kurulur;

yum install -y yum-utils device-mapper-persistent-data lvm2

Docker deposu kurulur;

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Docker kurulumu yapılır;

yum install -y docker-ce

/etc/docker dizini oluşturulur;

mkdir /etc/docker

deamon.json dosyası oluşturulur;

cat > /etc/docker/daemon.json <<eof align="justify" <p="" sourcecode]="" [="" eof="" }="" ]="" "overlay2.override_kernel_check='true"' "overlay2",="" },="" "100m"="" {="" "json-file",="" ["native.cgroupdriver='systemd"],'><strong>docker.service.d</strong> dizini oluşturulur;</eof>

mkdir -p /etc/systemd/system/docker.service.d

Docker servisi yeniden başlatılır;

systemctl daemon-reload
systemctl enable docker
systemctl start docker

Kubelet Kurulumu

Sunucularda aşağıdaki içerikle /etc/yum.repos.d/kubernetes.repo adresinde bir repository dosyası oluşturulur;

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

Aşağıdaki komutla kubelet kurulumu yapılır;

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

kurulum ardından kubelet servisi aktive edilir;

systemctl enable --now kubelet

kubelet servisi yeniden başlatılır;

systemctl daemon-reload
systemctl restart kubelet

Master Sunucu’da

Kubernetes Cluster ilklendirilmesi

Başlarken, opsiyonel olarak, init öncesi yapılandırma imajları indirilir;

kubeadm config images pull

Master sunucuda aşağıdaki komutla kubernetes cluster’ı ilklendirilir; (network_cdir alanına ilgili cidr değeri girilmelidir.)

kubeadm init --pod-network-cidr=[NETWORK_CIDR]

pod-network-cid parametresi pod network’ü için kullanılacak olan ağı belirtmektedir. Aşağıda tercih edilen network doğrultusunda kullanılacak Network CIDR değerleri bulunabilir;

Network Adı Cidr Desteklenen Platform
Clico 192.168.0.0/16 amd64, arm64, ppc64le
Canal 10.244.0.0/16 amd64
Cilium 10.217.0.0/16
Flannel 10.244.0.0/16 amd64, arm, arm64, ppc64le, s390x

Kubernetes cluster ilklendirmesi tamamlandıktan sonra çıktıda yer alan ve kubeadm join ile başlayan bölümü kopyalayın. Bu değer daha sonradan Kubernetes Cluster’ına yeni node’lar eklenmesinde kullanılacaktır.

kubeadm init --apiserver-advertise-address=192.168.200.2 --pod-network-cidr=10.244.0.0/16

Image

Bu işlemler ardından Kubernetes komutlarını kullanabilmek adına aşağıdaki komutlar çalıştırılır;

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

Bu işlemler ardından pod network addon yapılandırmasına hazırız. Bu adım pod’ların birbiri ile iletişim kurabilmesi için zorunludur. Bunun için aşağıdaki komutu kullanabiliriz;

kubectl apply -f [NETWORK_YAML]
Network Adı Yalm Dosyası
Calico https://docs.projectcalico.org/v3.7/manifests/calico.yaml
Canal https://docs.projectcalico.org/v3.7/manifests/canal.yaml
Cilium https://raw.githubusercontent.com/cilium/cilium/v1.5/examples/kubernetes/1.14/cilium.yaml
Flannel https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml

Image

Yaklaşık bir dakika bekledikten sonra aşağıdaki komutlarla cluster durumu kontrol edilebilir;

kubectl get nodes
kubectl get pods --all-namespaces

Image

Varsayılan olarak Kubernetes güvenlik nedeniyle master node’larda pod schedule etmez. Bunu aşağıdaki komut yardımıyla bypass edebilirsiniz;

kubectl taint nodes --all node-role.kubernetes.io/master-

Kubernetes Cluster’ına Node’ların Eklenmesi

Kubernetes Cluster’ının kurulması ardından aşağıdaki adımlar takip edilerek diğer sunucular worker node olarak cluster’a dahil edilebilir. Work node’ların Cluster’a dahil edilmesi için Cluster kurulumunun sonunda bize verilen komut her iki worker node üzerinde de çalıştırılmalıdır.

Örneğin;

kubeadm join 192.168.200.2:6443 --token yxo08j.gvowyx1im86kwwrz \
--discovery-token-ca-cert-hash sha256:471ea1505089f263aa82cef6b6180030ac5b8dec21b66f08f7725966954d48ea

Not: Token not alınmadıysa, aşağıdaki komutla öğrenilebilir;

kubeadm token list

Token’lar varsayılanda 24 saat geçerli olacak şekilde üretilirler. Eğer node, üretilen token zaman aşımına uğradıktan sonra cluster’ı dahil ediliyorsa, aşağıdaki komut kullanılarak yeni bir token üretilebilir.

kubeadm token create

Eğer –discovery-token-ca-cert-hash parametresine verilecek değer not alınmadıysa, aşağıdaki komut yardımıyla bu değer öğrenilebilir;

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

Node’ların doğru eklendiği aşağıdaki komutla teyit edilebilir;

kubectl get nodes

Image

Master Dışındaki Makinelerden Cluster Kontrolü

Opsiyonel olarak; aşağıdaki komut diğer sunucularda çalıştırılarak cluster kontrolünün bu sunucularda da yapılabilmesi sağlanabilir;

scp root@<master ip="">:/etc/kubernetes/admin.conf .

Sonuç aşağıdaki komut çalıştırılarak test edilebilir;

kubectl --kubeconfig ./admin.conf get nodes

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

1 Yorum

  1. Pingback: Fatih'in NotlarıGluster ile Kubernetes Dinamik Birim Sağlama - Fatih'in Notları

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.