Merhaba arkadaşlar bu yazımda önceki yazımda yazmış olduğum Kubernetes Mimarisi üzerine çalışacağız. Önceki laboratuvar ortamında kurmuş olduğumuz cluster üzerinden devam edeceğiz. Mimari içerisindeki kaynak sınırlandırmalarını anlamak için örnekler yapacağız.
CPU ve Memory Kısıtlamaları
Yeni dağıtımımızda deneme1 adında stress imajını dağıtalım. Dağıtımı yapıktan sonra doğrulama işlemi yapalım.
$ kubectl create deployment deneme1 --image vish/stress
deployment.apps/deneme1 created
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
deneme1 1/1 1 1 66s
Şimdi oluşturduğumuz dağıtımın YAML formatında bilgilerini görüntüleyelim. Burda şunu fark etmemiz gerekiyor. Dağıtım için herhangi bir kaynak kısıtlaması mevcut değil.
$ kubectl get deployment deneme1 -o yaml
....
spec:
containers:
- image: vish/stress
imagePullPolicy: Always
name: stress
resources: {} => herhangi bir kaynak kısıtlaması belirlenmemiş
....
deneme1 dağıtımımızı YAML formatında kayıt edip, açalım. Ardından kaynak kısıtlaması ekleyelim. resources anahtarından sonra limits ve requests olmak üzere iki özellik tanımladık. Container maksimum 1GB memory kullanabilir, dağıtılırken ise 500MB memory istedik.
$ kubectl get deployments deneme1 -o yaml > deneme1.yaml
$ vim deneme1.yaml
....
spec:
containers:
- image: vish/stress
imagePullPolicy: Always
name: stress
resources:
limits:
memory: "1Gi"
requests:
memory: "500Mi"
....
$ kubectl replace -f deneme1.yaml
deployment.extensions/deneme1 replaced
$ kubectl get deployment deneme1 -o yaml
....
resources:
limits:
memory: 1Gi
requests:
memory: 500Mi
....
Çıktı olarak aldığımız YAML dosyasına kaynak kısıtlaması ekledik ve bunu teğit ettik. Şimdi pod’un log kayıtlarına bakarak nasıl bir işlem gerçekleştirdiğini izleyebiliriz.
$ kubectl get po
NAME READY STATUS RESTARTS AGE
deneme1-6b8d589dc4-27vrf 1/1 Running 0 3m25s
$ kubectl logs deneme1-6b8d589dc4-27vrf
I0409 14:33:08.240924 1 main.go:26] Allocating "0" memory, in "4Ki" chunks, with a 1ms sleep between allocations
I0409 14:33:08.241398 1 main.go:29] Allocated "0" memory
Şimdi ise CPU için bir kısıtlama belirleyelim. Bu işlemi daha önceden hazırlamış olduğumuz deneme1.yaml dosyası üzerinden devam edeceğiz.
$ vim deneme1.yaml
....
resources:
limits:
memory: "1Gi"
requests:
memory: "500Mi"
args:
- -cpus
- "2"
- -mem-total
- "700Mi"
- -mem-alloc-size
- "100Mi"
- -mem-alloc-sleep
- "1s"
....
Dağıtımı silip, düzenlediğimiz yeni YAML dosyasını dağıtalım. Farkedeceğimiz nokta neredeyse hemen CPU kullanımında artış olduğudur. 100MB’lık parçalarda memory tahsisi gerçekleştirilecektir. top komutunu kullanarak bu işlemi izleyebiliriz.
$ kubectl delete deployment deneme1
deployment.extensions "deneme1" deleted
$ kubectl create -f deneme1.yaml
deployment.extensions/deneme1 created
$ kubectl get po
NAME READY STATUS RESTARTS AGE
deneme1-54cbf57774-9fv6j 1/1 Running 0 29s
$ kubectl logs deneme1-54cbf57774-9fv6j
I0409 14:50:42.974569 1 main.go:26] Allocating "700Mi" memory, in "100Mi" chunks, with a 1s sleep between allocations
I0409 14:50:42.974644 1 main.go:39] Spawning a thread to consume CPU
I0409 14:50:42.974671 1 main.go:39] Spawning a thread to consume CPU
I0409 14:50:53.285854 1 main.go:29] Allocated "700Mi" memory
Namespace için Kaynak Limiti
Önceki dağıtımda yaptıklarımıza ek olarak bu işlemleri namespace tabanında yapacağız. Öncelikle yeni bir namespace oluşturacağız ve içinde çalışacak bir dağıtım gerçekleştireceğiz.
$ kubectl create namespace kaynak-limiti
namespace/kaynak-limiti created
$ kubectl get namespace
NAME STATUS AGE
default Active 2d9h
kaynak-limiti Active 63s
kube-node-lease Active 2d9h
kube-public Active 2d9h
kube-system Active 2d9h
CPU ve memory kullanımını sınırlayan bir YAML dosyası oluşturalım. Burda dağıtacağımız tür: LimitRange. (YAML dosyasında kind parametresinde bu türü görebilirsiniz.)
$ vim dusuk-kaynak-kullaninimi.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: dusuk-kaynak-kullanimi
spec:
limits:
- default:
cpu: 1
memory: 500Mi
defaultRequest:
cpu: 0.5
memory: 100Mi
type: Container
Şimdi oluşturduğumuz LimitRange türündeki YAML dosyasını, daha önce oluşturduğumuz kaynak-limiti isimli namespace altında dağıtalım.
$ kubectl --namespace=kaynak-limiti create -f dusuk-kaynak-kullanimi.yaml
limitrange/dusuk-kaynak-kullanimi created
$ kubectl get LimitRange
No resources found.
LimitRange’leri listelediğimiz zaman hiçbir kaynağın listelenmediğini görürüz. Bunun sebebi kubectl varsayılan olarak seçtiği namespace default’dur.
$ kubectl get LimitRange --all-namespaces
NAMESPACE NAME CREATED AT
kaynak-limiti dusuk-kaynak-kullanimi 2019-04-09T19:25:39Z
Artık oluşturduğumuz namespace altında bir dağıtım yapabiliriz. Oluşturduğumuz LimitRange sayesinde belirlediğimiz namespace içerisinde kaynak kullanımını sınırlandırmış olduk.
$ kubectl -n kaynak-limiti create deployment limitlenmis-ornek1 --image vish/stress
deployment.apps/limitlenmis-ornek1 created
$ kubectl get deployments --all-namespaces
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
default deneme1 1/1 1 1 4h45m
kaynak-limiti limitlenmis-ornek1 1/1 1 1 53s
kube-system calico-typha 0/0 0 0 2d8h
kube-system coredns 2/2 2 2 2d9h
$ kubectl -n kaynak-limiti get pods
NAME READY STATUS RESTARTS AGE
limitlenmis-ornek1-6546b47d45-bkxcg 1/1 Running 0 2m11s
Dağıtımı gerçekleştirdik ve kontrollerimizi sağladık. Şimdi bu dağıtımın YAML dosya formatına bakalım. Resources parametresine hangi veriler eklenmiş.
$ kubectl -n kubectl -n kaynak-limiti get pod limitlenmis-ornek1-6546b47d45-bkxcg -o yaml
....
spec:
containers:
- image: vish/stress
imagePullPolicy: Always
name: stress
resources:
limits:
cpu: "1"
memory: 500Mi
requests:
cpu: 500m
memory: 100Mi
....
YAML dosyasını incelediğimiz zaman resources parametresine sınırlandırmaların LimitRange’de olduğu gibi eklendiğini görebiliriz. İkinci laboratuvarımız burada sonlanmış oluyor. Oluşturduğumuz dağıtımları silebiliriz.
$ kubectl delepe deployment deneme1
deployment.extensions "deneme1" deleted
$ kubectl delete deployment limitlenmis-ornek1 -n kaynak-limiti
deployment.extensions "limitlenmis-ornek1" deleted
Kubernetes Eğitimi’nin ikinci laboratuvarımız ortamını burada sonlandırıyoruz. Bir sonraki yazımda Kubernetes API ve Erişimlerinden bahsedeceğim. 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 !!!!