Arif KIZILTEPE
8 min readMay 24, 2020

Kubernetes Nedir?

Öncelikle bu yazıya başlamadan önce eğer docker ve container konsunda bilginiz yok ise aşağıdaki yazıyı okumanızı tavsiye ederim.

Kubernetes, Google tarafından GO programlama dili ile geliştirilmiş ve Cloud Native Computing Foundation tarafından da desteklenen mevcut konteyner haline getirilen uygulamaları otomatik olarak deploy etmek, sayılarını artırıp azaltmak gibi çeşitli işlemler ile beraber yönetmenize yardımcı olan bir konteyner kümeleme aracı olarak karşımıza çıkar.

Bu teknoloji ile birlikte uygulamaları mikro servis mimarisi aracılığı ile çok daha kolay biçimde yönetebilirsiniz. Ayrıca daha kolay sorunlarınıza da çözüm bulabilir hatta en önemlisi ise taşınabilir bir ortam sağladığından dolayı uygulamalarınızı platformlar arasın kolay biçimde taşımanız da mümkündür. Sürüm geçişlerinde de işlemlerinizi bu sayede daha kolay yapabilirsiniz.

Bir uygulamanın kubernetes üzerinden çalışması için şu adımları yapmamız gerekiyor.

  1. Uygulama geliştirilir ve container imajı oluşturulur.
  2. Kubernetes için manifest(yaml yada json) dosyası yazılır
  3. Manifest’e uygun olarak kubernetes api uygulamayı kendisine bağlı node(worker) üzerine göndererek çalışmasını sağlar.

Bileşenler

Master(Control Plane)

  1. kube-api-server : Ana yönetim noktası. Kubernetes beyni olarak ifade edilir.
  2. cluster store(etcd) : Distributed(dağıtık) yapıda key value mantığında çalışan kubernetes data alanı.
  3. kube-cheduler : Operasyonel işlemlerin yapıldığı birimdir.
  4. kube-controller-manager : Küme durumunu denetleyen controller servislerinin yönetimini sağlar. Default olarak 4 temel controller bulunur fakat genişletilebilir.
  • Node Controller
  • Replication Controller
  • Endpoints Controller
  • Service Account & Token Controllers

Node(Worker)

  1. kubelet : Master ve node arasındaki iletişimi sağlayan agent.
  2. container engine : Container mimarisini sağlayan uygulamadır. Bizim yapımızdaki container engine karşılığı docker.
  3. kube-proxy : Kubernetes network birimidir. Aynı zamanda load-balance görevi yapar.

Ortak Bileşenler

  1. Pod : Pod aslında docker ile çokça duyduğumuz container’ın kubernetes ratafındaki karşılığıdır. Bir konteyner imajı, çalıştırmak için gereken her şeyi içeren bir yazılım parçasının hafif, bağımsız, yürütülebilir bir paketidir.
  2. Deployment : Bir uygulamanın kubernetes üzerinden çalışması kısmında aktardığım 2. madde olan bir imajın kubernetes ekosisteminde nasıl dağıtılacağını belirlendiği birimdir.
  3. Service : Podlara gelen isteklerin karşılandığı ve yönlendirildiği birimdir. Pod scaling gibi işlemleri service sayesinde kesintisiz olarak yapabiliyoruz.
  4. Secret : Parola, kullanıcı, token gibi bilgileri güvenli bir şekilde oluşturduğumuz alandır.

Cluster Kubernetes Kurulumu

Cluster docker kurulumu için benim kurguladığım yapı 1 master 3 worker olacaktır.

İşletim Sistemi = RHEL 7

Master = 10.2.41.205

Worker1 = 10.2.41.206

Worker2 = 10.2.41.207

Worker3 = 10.2.41.208

Kurulumu yapacağımız ekosistemin topolojisi şu şekilde olacak.

Öncelikle tüm ortam hostname bilgileri sunucu “/etc/hosts” içerisinine yazılır. (Tüm sunucularda)

10.2.41.205 master.32bit.com.tr master
10.2.41.206 worker1.32bit.com.tr worker1
10.2.41.207 worker2.32bit.com.tr worker2
10.2.41.208 worker3.32bit.com.tr worker3

Selinux uygulamasını kapatmak için “/etc/selinux/config” içerisinde aşağıdaki gibi gerekli değişiklik yapılır. Bu işlemden sonra tüm sunuculara restart etmemiz gerekmektedir. Bu işlem mutlaka restart gerektirir. (Tüm sunucularda)

Selinux(Security-Enhanced Linux), kısaca sisteme erişim düzeyini azaltan güvenlik protokolünün çalışmasını sağlayan projedir.

Biz klasik firewalld servisini kullanacağımız için selinux uygulamasını kapatıyoruz.(Tüm sunucularda)

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

Sunucular arasındaki erişim sorunu yaşamamak için firewall’da gerekli portları açıyoruz.

firewall-cmd --permanent --add-port=9000-9999/tcp
firewall-cmd --permanent --add-port=10250-10259/tcp
firewall-cmd --permanent --add-port=10256/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=6443/udp
firewall-cmd --permanent --add-port=4789/udp
firewall-cmd --permanent --add-port=6081/udp
firewall-cmd --permanent --add-port=9000-9999/udp
firewall-cmd --permanent --add-port=30000-32767/udp
firewall-cmd --permanent --add-port=8001/tcp
firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=10.2.41.205/16 accept'firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=10.2.41.206/16 accept'firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=10.2.41.207/16 accept'firewall-cmd --zone=public --permanent --add-rich-rule 'rule family=ipv4 source address=10.2.41.208/16 accept'
firewall-cmd --reload

Kubernetes için gerekli olan br_netfilter modül aktif edilir. (Tüm sunucularda)

br_netfilter modülü iptables tarafından filtreleme ve port forwarding için işlenebilecek, kubernetes pod’ları cluster içerisinde birbiri ile iletişim kurabilecektir.

modprobe br_netfilterecho ‘1’ > /proc/sys/net/bridge/bridge-nf-call-iptables

Swap kullanımı kapatılır. Kubelet’in düzgün çalışabilmesi için bu işlem zorunludur. (Tüm sunucularda)

Swap , sabit disk üzerinde işletim sistemi tarafından ayrılmış bir bölümdür. İşlenecek veriler RAM’e sığmadığı zaman bu bölüm RAM gibi kullanılır ve böylece işlemlerin devam etmesi sağlanır.

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

Sunucular kurulduktan sonra subscription işlemi yapılır ve docker kubernetes uygulamalarını içeren repo aktif edilir. (Tüm sunucularda)

subscription-manager register --username user --password passsubscription-manager repos --enable=rhel-7-server-extras-rpms

Docker’ın son sürümünü kullanmak için linux repo işletim sistemine import edilir ve docker ile birlikte gerekli paketler kurulur. (Tüm sunucularda)

yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repoyum install -y docker-ce

Aynı şekilde kubernetes için aşağıdaki komut ile repo manuel olarak eklenir ve kubernetes kurulumu yapılır. (Tüm sunucularda)

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
EOF

Kurulumlar tamamlandı. Konfigürasyona geçmeden önce swap ve selinux kapatma işlemlerinin aktif olması için restart işlemi yapılır. (Tüm sunucularda)

reboot

Sunucular açıldıktan sonra docker ve kubernetes uygulamaları açılır ve her açılışta otomatik başlaması için aktif edilir. (Tüm sunucularda)

systemctl start docker && systemctl enable dockersystemctl start kubelet && systemctl enable kubelet

Sunucu konfigürasyon ve paket kurulumları tamamlandı. Artık docker ve kubernetes konfigürasyonunu yapmamız gerekiyor. İlk olarak docker ve kubernetes düzgün çalışabilmesi için aynı cgroup kullanması gerekiyor bunun için docker’ın kullandığı cgroup bilgisine bakıyoruz. (Tüm sunucularda)

Cgroups (Control Groups, Kontrol Grupları) görevleri (process) kümelendirerek işlemci, sistem hafızası, ağ bant genişliği gibi kaynakların kullanımlarını sınırlandırmaya ve izole etmeye yarayan Linux çekirdeğinin bir özelliğidir. Cgroups kullanılarak sistem yöneticileri görevler ve kullanıcılar arasında öncelik, engelleme yapabilmekte, sistem kaynakların kullanımını daha verimli hale getirebilmektedir.

docker info | grep -i cgroup

Evet yukarıda da görüldüğü gibi docker cgroupfs kullanıyor servisi de buna göre düzenlememiz gerekiyor. Bu işlem için aşağıdaki komutu çalıştırıyoruz ve kubernetes servisini restart ediyoruz. (Tüm sunucularda)

vi /etc/sysconfig/kubeletKUBELET_EXTRA_ARGS=--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice

Bu adımda, kubernetes master yapılandırmasını başlatacağız. Kubernetes master’ı kurmak için aşağıdaki komutu çalıştırın. Normalde konfigürsayon işlemlerinde ip kullanmayı tercih etmem ama burada kubernetes ipv4 yada ipv6 standardında bir ip adresi istiyor hostname veya dns adı kabul etmiyor. Komutun çıktısı olarak (Sadece Master Sunucusunda)

kubeadm init --apiserver-advertise-address=10.2.41.205 --pod-network-cidr 192.168.0.0/16 --upload-certs
  • -pod-network-cidr : Pod network ip aralığı. İlerleyen adımlarda kullanacağımız calico için parametre bu şekildedir.
  • --apiserver-advertise-address: Docker ve kubernetes iletişimini sağlayan api sunucusunun adresi yani master sunucu adresi.

İşlemin sonrasında ‘kubeadm join … … …’ ile başlayan komutu kopyalayın. Daha sonra worker ortamları oluşturduğumuz master ortama dahil etmek için kullanacağız. Konfigürsayon işlemleri için komut çıktısının önerilerini yapmaya devam ediyoruz. (Sadece Master Sunucusunda)

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configkubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Kubernetes konfigürasyonu tamamlandıktan sonra daha önce kopyaladığımız kubeadm join komutu worker sunucularda çalıştırılır. (Sadece Worker Sunucusunda)

kubeadm join 10.2.41.205:6443 --token qfht4f.eoqhy64k066kcokw \
--discovery-token-ca-cert-hash sha256:a33562b94294e48ab3a70cdc595b524f13869c4230dc83562580e52d44146666

Tüm worker sunucularda kubeadm join komutu çalıştırıldıktan sonra cluster yapının düzgün çalışıp çalışmadığını aşağıdaki komut ile kontrol ediyoruz. (Sadece Master Sunucusunda)

kubectl get nodes

Kubernetes Web UI (Dashboard) Yükleme

Kubernetes dashboard kısaca oluşturduğumuz ekosistemin yönetilmesini ve görüntülenmesini sağlar. İlk önce dashboard uygulamasını yüklüyoruz. (Sadece Master Sunucusunda)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

Dashboard erişimi için bir kullanıcı oluşturmamız, kullanıcıya cluster içerisinde role tanımlamamız ve bu kullanıcının token bilgilerini almamız gerekiyor. Öncelikle yeni bir yaml dosyası oluşturulur.

vi /etc/kubernetes/dashboard-adminuser.yaml

Daha sonra bu dosya içerisine aşağıdaki bilgileri yazıyoruz.

apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

Aynı işlemi cluster bind içinde yapıyoruz.

vi /etc/kubernetes/dashboard-adminuserbind.yamlapiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

Daha sonra bu dosyaları çalıştırıyoruz.

kubectl apply -f /etc/kubernetes/dashboard-adminuser.yaml
kubectl apply -f /etc/kubernetes/dashboard-adminuserbind.yaml

Dashboarda eklemek için oluşturduğumuz kullanıcının token bilgilerini çıkarmamız gerekiyor. Aşağıdaki komut ile token bilgilerini alıyoruz.

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

Şuanda dashboard master sunucunun local adresi(localhost/127.0.0.1) üzerinden erişim durumunda. Bu adresi dışarıdan erişilebilir duruma getirmek için 2 yöntem var.

  1. Kubectl Proxy

Bu yöntemde dashboard uygulamasının kullandığı portu kubectl proxy ile master sunucunun ip adresine bind edersek erişim sağlanmış olacaktır.

kubectl proxy --address 0.0.0.0 --port 8001 --accept-hosts '.*'

2. Uygulama Type Değiştirme

Dashboard ilk kurulduğunda uygulama cluster ip üzerinde çalışıyor bu durumda erişimi sadece localhost/127.0.0.1 üzerinden oluyor. Bunu değiştirmek için dashboard uygulamasının yaml içerisinde editleme yapmak gerekiyor. Şu komut ile uygulamanın yaml dosyası açılır ve type alanında ClusterIPNodePort olarak değiştirilir.

kubectl -n kubernetes-dashboard edit service kubernetes-dashboard

Uygulamamız artık master node üzerinde bir portta çalışmaya başladı. Bu portu öğrenmek için aşağıdaki komut kullanılır.

kubectl -n kubernetes-dashboard get services

Yukarıdaki 2 işlemden biri yapıldıktan sonra aşağıdaki şekilde adrese girilir token alanına yukarıda oluşturduğumuz token eklenir ve uygulamaya erişilmiş olur.

Erişim adresi : https://[master_node_ip]:[port]

Yararlı Komutlar

Kubernetes için

Node işlemleri.

#Nodeları listeleme
kubectl get nodes

Namespace işlemleri.

#Mevcut namespaceleri listeleme
kubectl get namespace

Pod işlemleri.

#Podları listeleme
kubectl get pod --all-namespaces
#İstenilen pod'u silme
kubectl -n <namespace> delete pod <pod name>
#İstenilen pod'u değiştirme
kubectl -n <namespace> edit pod <pod name>
#İstenilen pod'un bilgileri görüntüleme
kubectl describe -n <namespace> pod <pod name>

Servis işlemleri

#Servisleri listeleme
kubectl get service
#İstenilen servis'i değiştirme
kubectl -n <namespace> edit service <service name>
#İstenilen servis'i silme
kubectl -n <namespace> delete service <service name>
#İstenilen servis'în bilgileri görüntüleme
kubectl describe -n <namespace> service <service name>

Kubadm işlemleri.

#Kubernetes bağlantı komutu(kubeadm join ...) görüntüleme
kubeadm token create --print-join-command

Api işlemleri.

#Api'leri listeleme
kubectl api-resources

Docker için

container ve image işlemleri

#Çalışan container listeler -a ile tümünü görebilirsiniz.
docker ps
#Real-time container log gösterir.
docker logs [CONTAINER]
#temel seviyede bilgi verir.
docker inspect [OBJECT_NAME/ID]

docker events [CONTAINER]
#Kullanılan portu listeler.
docker port [CONTAINER]
#Çalışan processleri gösterir.
docker top [CONTAINER]
#Kaynak kullanımını gösterir.
docker stats [CONTAINER]
#Değişen dosya/klasörleri gösterir.
docker diff [CONTAINER]
#Mevcut imajları listeler.
docke image ls
#Image geçmişini gösterir
docker history [IMAGE]

Container işlemleri.

#Mevcut imaj ile yeni container oluşturma
docker create [IMAGE]
#Mevcut container adını değiştirme
docker rename [CONTAINER_NAME] [NEW_CONTAINER_NAME]
#Mevcut image ile yeni container oluşturma ve çalıştırma
docker run [IMAGE] [COMMAND]
#Mevcut çalışmayan container silme
docker rm [CONTAINER]
#Mevcut container güncelleme
docker update [CONTAINER]

Başlatma ve durdurma işlemleri.

#Mevcut container başlatma
docker start [CONTAINER]
#Mevcut container durdurma
docker stop [CONTAINER]
#Mevcut container restart
docker restart [CONTAINER]
#Mevcut container bekletme
docker pause [CONTAINER]
#Bekletilmeye alınan mevcut container başaltma
docker unpause [CONTAINER]
docker wait [CONTAINER]
#Contarner'a kill sinyali gönderme
docker kill [CONTAINER]
docker attach [CONTAINER]

Image işlemleri.

#Dockerfile kullanılarak imaj olutşurma
docker build [URL]
#Bağlı olan repository'den imaj indirme
docker pull [IMAGE]
#Bağlı olan repository'ye imaj yükleme
docker push [IMAGE]
#tarball kullanılarak imaj ekleme
docker import [URL/FILE]
#Mevcut container'dan imaj oluşturma
docker commit [CONTAINER] [NEW_IMAGE_NAME]
#Image silme
docker rmi [IMAGE]
#Filesistemde bulunan imajı yükleme
docker load [TAR_FILE/STDIN_FILE]
#Mevcut imajı tar dosyası olarak çıkartma.
docker save [IMAGE] > [TAR_FILE]

Networks işlemleri.

#Mevcut network listeleme
docker network ls
#Network silme
docker network rm [NETWORK]
#Network bilgilerini görüntüleme
docker network inspect [NETWORK]
docker network connect [NETWORK] [CONTAINER]
docker network disconnect [NETWORK] [CONTAINER]

No responses yet