Kubernetes ReplicaSet Nedir?

Kubernetes ReplicaSet, belirtilen sayıda replica Pod'un daima çalıştığından emin olmak için kullanılan bir Kubernetes nesnesidir. ReplicaSet, scalability ve high availability için kullanılır.

ReplicaSet, bir önceki yazımızda anlattığımız Replication Controller nesnesinin yeni versiyonudur ve daha efektif pod selector seçenekleri sunar.

💡
Çok yakında Replication Controller deprecated olacak gibi gözüküyor. Bu sebeple şimdiden ReplicaSet kullanmaya başlamanız tavsiye edilir. Kaynak: A Deployment that configures a ReplicaSet is now the recommended way to set up replication.

Replication işleminin nasıl çalıştığına dair detaylı bilgi almak için devam etmeden önce Replication Controller yazısını ziyaret edebilirsiniz.

Kubernetes Replication Controller Nedir?
Replication Controller, pod’ları sürekli izleyerek belirlenen sayıda pod’un çalışır olduğunu garantiler.

1. Replication Set Oluşturmak

Replication Set oluşturmak için JSON veya YAML formatında bir manifest dosyası hazırlayarak Kubernetes API Server'a göndermemiz gerekiyor. Bunun için ilk olarak manifest dosyamızı görelim:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      name: myapp
      labels:
        app: myapp
    spec:
      containers:
        - name: web
          image: nginx
          ports:
            - containerPort: 8080

Bu YAML dosyası, "myapp" adlı bir Replication Set oluşturur. Bu Replication Set, 3 replica Pod çalıştırmak için yapılandırılmıştır ve selector altında belirtildiği gibi "app: myapp" label ile işaretlenmiş Pod'ları bulup yönetir.

template kısmı ise daha önce gördüğümüz Pod manifesti ile aynıdır. Tek dikkat edilmesi gereken şey, oluşturulan Pod'ların RS tarafından yönetilebilmesi için labels kısmında, RS'nin selector kısmında belirtilen label'larla oluşturulmasıdır. Aksi halde RS'yi oluşturamazsınız.

Manifest dosyası hazır olduktan sonra kubectl create veya kubectl apply komutlarından birisi ile Replication Controller'ı oluşturabilirsiniz.

 kubectl create -f file-rs.yaml

Ardından pod'lara baktığınızda belirttiğiniz replica sayısı kadar pod'un oluşturuluduğunu göreceksiniz.

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-53thy 0/1 ContainerCreating 0 2s
myapp-k0xz6 0/1 ContainerCreating 0 2s
myapp-q3vkg 0/1 ContainerCreating 0 2s

2. ReplicaSet İle Detaylı Label Selector Kullanımı

Replica Controller ile kıyaslandığında ReplicaSet ile gelen en önemli güncellemelerden birisi de daha detaylı ve anlamlı label selector kullanımıdır.

Label selector olarak kullanabileceğimiz ilk parametre matchLabels'dır.

selector:
    matchLabels:
      app: myapp

Bu kullanım ile RS, direkt olarak key:value çiftiyle eşleşen podları kontrolü altına alır. Replication Controller'daki kullanım ile aynıdır.

Diğer bir selector ise matchExpressions'dır. Bu yeni selector ile daha esnek ve detaylı selector'lar yazabiliriz.

selector:
 matchExpressions:
 - key: app
   operator: In
   values:
     - myapp

Örnekte gördüğünüz gibi her expression bir key, operator ve operator'e bağlı olarak values içerir. operator parametresinin alabileceği parametreler ise şunlardır:

  • In: Label'ın değeri values ile verilen listedeki değerlerden biri olmalıdır
  • NotIn: Label'ın değeri values ile verilen listedeki değerlerden biri olmamalıdır
  • Exists: Pod, değeri farketmeksizin belirtilen key'e sahip olmalıdır.
  • DoesNotExists: Pod, değeri farketmeksizin belirtilen key'e sahip olmamalıdır.
💡
Exists ve DoesNotExists operator'leri kullanıldığında values parametresini kullanmamanız gerekir. Çünkü bu iki operator sadece key kontrolü yapar.

Birden fazla koşul içeren label selector kullanmak istediğinizde, hem matchLabels hem de matchExpressions altında tüm koşullarınızı yazabilirsiniz. Fakat bu durumda bir pod'un tüm bu koşulları sağlaması gerekmektedir. Yani OR değil, AND ile koşullar oluşturmuş olursunuz.

3. Oluşturulan Replication Set Hakkında Bilgi Almak

Oluşturduğunuz Replication Set'leri görmek için kubectl get rs komutunu kullanabilirsiniz.

$ kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp 3 3 2 3m
💡
kubectl get komutunda uzunca replicationset yazmak yerine kısaca rs yazabilirsiniz.

Replication Set hakkında daha fazla bilgi almak için kubectl describe komutunu kullanabilirsiniz.

$ kubectl get rs myapp
Name:         myapp
Namespace:    default
Selector:     app=myapp
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  2 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=myapp
  Containers:
   web:
    Image:        nginx
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  15s   replicaset-controller  Created pod: myapp-sfpgv
  Normal  SuccessfulCreate  15s   replicaset-controller  Created pod: myapp-zng5n
  Normal  SuccessfulCreate  15s   replicaset-controller  Created pod: myapp-kjb8p

4. RS Scale Etmek ve Replica Sayısını Değiştirmek

ReplicaSet oluştururken replicas parametresi ile belirlediğimiz replica sayısı, RS'nin bize çalışmasını garanti ettiği pod sayısıdır. Replica sayısını ihtiyaçlara göre dilediğimiz zaman azaltabilir veya artırabiliriz.

Replica sayısını değiştirmek için kubectl scale rs komutunu kullanabiliriz.

kubectl scale rs myapp --replicas=10

Bu komut örneğinde, RS'nin verilen template üzerinden 10 adet replika ayarlamasını istiyoruz. Yani eğer mevcutta 3 tane pod aktifse, bu komut sonrası 7 tane daha pod çalıştırılacak ve toplam pod sayısı 10 olacaktır.

Diğer bir yöntemde Replication Set'in tanımını kubectl edit komutu ile düzenlemektir.

kubectl edit rs myapp

Açılan editörde replicas değerini düzenleyerek kaydedebilirsiniz. Ardından RS pod sayısını arzu ettiğiniz sayı kadar ayarlayacaktır.


Sıradaki yazı ile eğitim serisine devam edebilirsiniz.

Kubernetes DaemonSet Nedir?
Kubernetes DaemonSet, belirli bir pod’un her bir node üzerinde çalışmasını sağlayan bir yapılandırma nesnesidir.