Kubernetes LAB06 14/20

Merhaba arkadaşlar bu laboratuvarımızda Kubernetes Service Yönetimini konusu hakkında örnekler yapacağız.

Servisler, (mikroservis olarakta bilinir.) mantıksal bir pod cluster’ına erişme politikasını ilan eden nesnelerdir. Yerel uygulamalar erişim için endpoint API’ını kullanabilir. Yerel olmayan uygulamalar arka uç pod’lara erişmek için sanal IP tabanlı bridge kullanabilir. Servis tipleri şunlardır:

  • ClusterIP (varsayılan) cluster’ın internal IP’sini gösterir. Sadece cluster içinde erişilebilir.
  • NodePort noed IP’sini statik bir bağlantı noktasında gösterir. Bir ClusterIP’de otomatik olarak oluşturulur.
  • LoadBalancer cloud sağlacıların yük denyeleyicisini kullanarak servisi dışarıdan sağlar. NodePort ve ClusterIP otomatik olarak oluşturuldu.
  • ExternalName, bir CNAME kaydı kullanarak externalName içeriğini eşler.

Şimdi uygulama kısmımıza geçelim ve bir YAML dosyasından iki nginx sunucusu dağıtalım. API’ın v1beta sürümünü kullanacağız. Türü deployment olmalı ve “nginx” olarak label oluşturulmalıdır. İki kopya oluşturalım ve 8080 portunu gösterelim. Bu işlemleri yeni oluşturacağımız namespace adı altında yapalım (lab06 isimli namespace).

$ vim nginx-bir.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-bir
  labels:
    system: nginxsunucu
  namespace: lab06
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 8080
          protocol: TCP
      nodeSelector:
        system: nginxselector

$ kubectl create ns lab06
namespace/lab06 created

$ kubectl create -f nginx-bir.yaml
deployment.extensions/nginx-bir created

$ kubectl -n lab06 get pods
NAME                         READY   STATUS    RESTARTS   AGE
nginx-bir-6d479fd745-4mm26   0/1     Pending   0          37s
nginx-bir-6d479fd745-hk747   0/1     Pending   0          37s


$ kubectl -n lab06 describe pod nginx-bir-6d479fd745-8wgfb
  Type     Reason            Age                  From               Message
  ----     ------            ----                 ----               -------
  Warning  FailedScheduling  41s (x3 over 2m10s)  default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector.

Namespace oluşturmak için kubectl create ns <namespace_adi> komutunu kullandık. Listeleme işlemi yaparken namespace bazında filtreleme yapmak istersek -n parametresini kullanabiliriz. Örneğin yukarıdaki kodlarda belirbi bir namespace’deki pod’ları listelemek için kubectl -n lab06 get pods komutu kullanılmıştur.

YAML dosyasımızı lab06 namespace’inde dağıttık. Fakat şöyle bir duruma rastladık. Pod’lar henüz başlatılmamış Pending durumunda kalmış. Bunun sebebini öğrenmek için pod’un açıklamalarına baktık ve nodeSelector değerinin node’a atanmadığı mesajını elde ettik. Bu durumu şu şekilde görebilir ve düzeltebiliriz.

$ kubectl get nodes --show-labels
NAME            STATUS   ROLES    AGE   VERSION   LABELS
master-node-1   Ready    master   35m   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-node-1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
worker-node-1   Ready    <none>   32m   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker-node-1,kubernetes.io/os=linux

$ kubectl label node worker-node-1 system=nginxselector
node/worker-node-1 labeled

$ kubectl get nodes --show-labels
NAME            STATUS   ROLES    AGE   VERSION   LABELS
master-node-1   Ready    master   22h   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-node-1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
worker-node-1   Ready    <none>   22h   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker-node-1,kubernetes.io/os=linux,system=nginxselector

$ kubectl get pods -n lab06
NAME                         READY   STATUS    RESTARTS   AGE
nginx-bir-6d479fd745-4mm26   1/1     Running   0          3m51s
nginx-bir-6d479fd745-hk747   1/1     Running   0          3m51s

Artık pod’larımız Running durumuna gelmiş bulunmaktadır. Birde farklı listeleme filtrelemeleri ile listeleyelim.

$ kubectl -n lab06 get pods
NAME                         READY   STATUS    RESTARTS   AGE
nginx-bir-6d479fd745-4mm26   1/1     Running   0          3m51s
nginx-bir-6d479fd745-hk747   1/1     Running   0          3m51s

$ kubectl get pods -l app=nginx --all-namespaces
NAMESPACE   NAME                         READY   STATUS    RESTARTS   AGE
lab06       nginx-bir-6d479fd745-4mm26   1/1     Running   0          50m
lab06       nginx-bir-6d479fd745-hk747   1/1     Running   0          50m

Artık 8080 port’undan servisimizi dağıtabiliriz. Bunun için expose komutunu kullanıyoruz.

$ kubectl -n lab06 expose deployment nginx-bir
service/nginx-bir exposed

$ kubectl -n lab06 get ep nginx-bir
NAME        ENDPOINTS                           AGE
nginx-bir   192.168.1.3:8080,192.168.1.4:8080   5s

8080 ve 80 portu üzerinden pod’a erişmeye çalışalım. Burda bağlantıya 8080 değilde 80 portu cevap verecektir. Çünkü nginx 80 portuna yanıt verecek şekilde dinleme yapar. curl ile denemesini yapabiliriz.

$ curl 192.168.1.3:8080
curl: (7) Failed to connect to 192.168.1.3 port 8080: Connection refused

$ curl 192.168.1.3:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....

NodePort Yapılandırma

Bu alıştırmada önceki örnekte (nginx-bir) oluşan pod’a erişirken NodePort kullanacağız. Önceki adımda dahili pod IP adresini kullanarak nginx sayfasını görüntüleyebildik. Şimdi dağıtımında servisi -type=NodePort kullanarak çıkaracağız.

$ kubectl -n lab06 expose deployment nginx-bir --type=NodePort --name=ornekservice
service/ornekservice exposed

$ kubectl -n lab06 describe services
....
NodePort:                 <unset>  31001/TCP
....

Cluster’ın dışarıya açılan IP adresini bulalım. Bu IP üzerinden NodePort’u kullanarak nginx sayfasına erişebildiğimi kontrol edelim.

$ kubectl cluster-info
Kubernetes master is running at https://10.128.0.2:6443
KubeDNS is running at https://10.128.0.2:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ curl http://10.128.0.2:31001
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
....

Kaynakları Yönetmek için Label Kullanalım

Tüm namespace’lerdeki app=nginx label’ına sahip tüm pod’ları silmeyi deneyelim. Not: v1.13 versiyonunda –all-namespaces diyerek geniş bir kısıtlama yapmamıza izin verilmiyordu. Bu sebeble namespace’i belirtmek gerekiyordu. v.14 ile artık bu işlem kullanılabilir durumda.

$ kubectl delete pods -l app=nginx --all-namespaces
pod "nginx-bir-56b7bfc545-jrskg" deleted
pod "nginx-bir-56b7bfc545-zbffm" deleted

Birde bu işlemi belirli bir kısıtlama gerçekleştirerek yapalım.

$ kubectl -n lab06 delete pods -l app=nginx
pod "nginx-bir-56b7bfc545-kwmmh" deleted
pod "nginx-bir-56b7bfc545-rbwx7" deleted

Ayrıca deployment’ımıza bir label tanımladık. lab06 namespace’i içerisindeki deployment’ların label’larını görüntüleyelim.

$ kubectl -n lab06 get deploy --show-labels
NAME        READY   UP-TO-DATE   AVAILABLE   AGE   LABELS
nginx-bir   2/2     2            2           19m   system=nginxsunucu

Şimdi bu label’ı kullanarak deployment’ı silelim

$ kubectl -n lab06 delete deploy -l system=nginxsunucu
deployment.extensions "nginx-bir" deleted

Daha önceden node’a verdiğimiz label’ı (nginxselector) kaldıralım.

$  kubectl label node worker-node-1 system-
node/worker-node-1 labeled

$  kubectl get nodes --show-labels
NAME            STATUS   ROLES    AGE   VERSION   LABELS
master-node-1   Ready    master   65m   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-node-1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
worker-node-1   Ready    <none>   62m   v1.14.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker-node-1,kubernetes.io/os=linux

Kubernetes Servis Yönetimi laboratuvar yazımız burada sonlanmış bulunmaktadır. Kubernetes eğitim serimizin bir sonraki yazısında görüşmek üzere!

Umarım bu yazı sizin için bilgilendirici olmuştur. Yazıyla ilgili bir sorunuz, görüşünüz veya isteğiniz varsa alt kısımda bulunan yorumlardan veya mail adresimden iletişime geçebilirsiniz. Bu yazının başkaları içinde bilgilendirici olduğunu düşünüyorsanız sosyal olun ve sosyal medyada paylaşın! Okuduğunuz için teşekkürler !!!

Bir cevap yazın

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