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 !!!