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 !!!
1 thought on “Kubernetes LAB 09 20/20”