Kubernetes LAB02 6/20

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

Leave a Reply

Your email address will not be published. Required fields are marked *