Kubernetes LAB 09 20/20

Merhaba arkadaşlar bu laboratuvar yazımızda Kubernetes Scheduling (Zamanlama) işlemleri hakkında uygulamalı örnekler yapacağız. Eğer teori kısmında eksiklikleriniz olduğunu düşünüyorsanız bu linkte bulunan Kubernetes Scheduling yazımı okumanızı tavsiye ederim.

Sistemin pod’ları sizin adııza dağıtmasına izin vermek genellikle iyi bir yol olsada, bir pod’un hangi node’da kullanılacağını belirlemek isteyebilirsiniz. Örneğin; bazı pod’lar için özel donanım gereksinimi olabilir. VIP pod’ları yeni, daha hızlı donanıma ve diğerlerini eski donanıma atamak isteyebilirsiniz. Bu alıştırmada, pod’ları belirli bir node’a planlamak için label’ları kullanırız. Daha sonra geniş bir ortamda daha esnek konuşlandırmaya sahip olmanın yollarını keşfedeceğiz.

Alıştırmamıza node’ların bir listesini alarak başlayalım. Burada node’lar ready durumda olmalı ve label veya taint içermemelidir.

$ kubectl get nodes
NAME      STATUS     ROLES    AGE   VERSION
k8s-vm    Ready      master   50h   v1.14.0
k8s-vm2   Ready      <none>   49s   v1.14.0

Node’lardaki geçerli label ve taint’leri görüntüleyelim.

$ kubectl describe nodes | grep -i label
Labels:                        beta.kubernetes.io/arch=amd64
Labels:                        beta.kubernetes.io/arch=amd

$ kubectl describe nodes | grep -i taint
Taints:                        <none>
Taints:                        <none>

kube-system namespace’inde herhangi bir deployment’in çalışmadığını kontrol edelim. Varsa onları silelim. Daha sonra hem master hemde worker node’da kaç tane container çalıştığını kontrol edelim.

$ kubectl get deployments --all-namespaces
NAMESPACE        NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
default          ikinciSayfa    1         1         1            1           1h
default          ucuncuSayfa    1         1         1            1           1h
kube-system      calico-typha   0         0         0            0           20h
kube-system      coredns        2         2         2            2           20h

(master-node)$ sudo docker ps | wc -l
20

(worker-node)$ sudo docker ps | wc -l
10

Bu alıştırmamızda master node’umuza onemli, worker node’umuza onemsiz label’larını atadık.

$ kubectl label nodes master-node durum=onemli
node/master-node labeled

$ kubectl label nodes worker-node durum=onemsiz
node/worker-node labeled

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

Örnek bir YAML dosyası oluşturup, dağıtalım. Bunun içerisinde nodeSelector girişini ekleyelim.

$ vim zamanlayici.yaml
apiVersion: v1
kind: Pod
metadata:
  name: onemli
spec:
  containers:
  - name: onemli1
    image: busybox
    args:
    - sleep
    - "10000000"
  - name: onemli2
    image: busybox
    args:
    - sleep
    - "10000000"
  nodeSelector:
    durum: onemli

$ kubectl create -f zamanlayici.yaml
pod/onemli created

$ sudo docker ps | wc -l
22

Oluşturduğumuz YAML dosyasını dağıttıktan sonra, container’ların master node’da çalıştığını teyit ettik. (20 değeri 22 oldu, 2 container eklendi.)

Pod’ları silip nodeSelector satırını kaldırdığımız zaman, tekrardan pod’u dağıtınca, container’ların karışık bir şekilde konuşlandırıldığını görürüz.

$ kubectl delete pods onemli
pod "onemli" deleted

--nodeSelector kaldırılmış YAML
$ kubectl create -f zamanlayici.yaml
pod/onemli created

$ sudo docker ps | wc -l
21
(diğer container worker node'da konuşlandırılmış.)

$ kubectl delete pods onemli
pod "onemli" deleted

Pod’ların nerede dağıtılacağını veya çalışmasına izin verildiğini yönetmek için taint kullanabilirsiniz. Bir node grubuna bir pod atamanın yanı sıra bir node’daki kullanımı sınırlamak veya pod’ları tamamen boşaltmak isteyebilirsiniz. Taint kullanarak bunu başarabilirsiniz. Master node’a NoSchedule taint ataması yapabilirsiniz.

Öncelikle sekiz adet nginx container içeren bir YAML dosyası oluşturalım.

$ vim nginserisi.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: taint-deneme
spec:
  replicas: 8
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1
        ports:
        - containerPort: 80

$ kubectl create -f nginxserisi.yaml
deployment.apps/taint-deneme created

Dağıtımı gerçekleştirdikten sonra container’ların nerede çalıştığına bir göz atalım.

(master-node)$ sudo docker ps | wc -l
24

(worker-node)$ sudo docker ps | wc -l
14

$ kubectl delete deployment taint-deneme
deployment.extensions "taint-deneme" deleted

(master-node)$ sudo docker ps | wc -l
20

(worker-node)$ sudo docker ps | wc -l
10

Şimdi yeni container’ların dağıtımını etkilemek için bir taint kullanacağız.

$ kubectl taint nodes worker-node isaret=value:PreferNoSchedule
node/worker-node tainted

$ kubectl describe node | grep Taint
Taints:                        isaret=value:PreferNoScheduleTaints:                        <none>

$ kubectl create -f nginxserisi.yaml
deployment.apps/taint-deneme creaed

(master-node)$ sudo docker ps | wc -l
28

(worker-node)$ sudo docker ps | wc -l
10

Gördüğünüz gibi worker-node isimli node’da hiçbir pod dağıtımı yapılmadı. Bütün dağıtımlar master-node’da yapıldı. Şimdi taint’i silelim ve işareti kaldıralım.

$ kubectl taint nodes worker-node isaret-
node/worker-node untainted

$ kubectl describe node | grep Taint
Taints:                        <none>
Taints:                        <none>

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