Giriş: Özel İş Yükleri İçin Kubernetes Kaynakları
Kubernetes, `Deployment`lar aracılığıyla durum bilgisiz (stateless) uygulamaları yönetmek için harikadır. Ancak, bazı uygulamaların özel gereksinimleri vardır: örneğin, verilerin kalıcı olması, Pod'ların sabit bir kimliğe sahip olması veya her düğümde belirli bir görevin çalıştırılması gibi. Kubernetes, bu özel iş yükü senaryolarını yönetmek için `StatefulSet` ve `DaemonSet` gibi daha spesifik API objeleri sunar.
Bu belge, `StatefulSet` ve `DaemonSet`'in ne olduğunu, neden kullanıldığını, nasıl çalıştığını, temel özelliklerini ve aralarındaki farkları detaylı bir şekilde açıklayacaktır. Bu kaynaklar, Kubernetes kümelerinizde daha karmaşık ve özelleşmiş uygulama mimarilerini dağıtmanıza olanak tanır.
1. StatefulSet: Durum Bilgisi Olan Uygulamalar İçin
**StatefulSet**, Kubernetes'te durum bilgisi olan (stateful) uygulamaları (örneğin veritabanları, mesaj kuyrukları, dağıtılmış anahtar-değer depoları) yönetmek için kullanılan bir iş yükü API objesidir. `Deployment`'ların aksine, StatefulSet'ler, Pod'larının kararlı ve benzersiz bir ağ kimliğini (hostname), kalıcı depolama alanını ve sıralı dağıtım/ölçekleme/silme garantisini korumasını sağlar.
Neden ve Ne İşe Yarar?
- **Kararlı Ağ Kimliği:** Her Pod'a kararlı bir hostname (örneğin `web-0.example.com`, `web-1.example.com`) ve kalıcı bir DNS adı atar. Bu, Pod'ların yeniden başlatıldığında veya yeniden planlandığında bile aynı kimliği korumasını sağlar.
- **Kalıcı Depolama:** Her Pod'a kendi kalıcı depolama birimini (PersistentVolumeClaim - PVC) bağlama garantisi verir. Bu depolama, Pod yeniden başlatılsa veya başka bir düğüme taşınsa bile verilerini korur.
- **Sıralı Garanti:** Pod'ların belirli bir sıra dahilinde başlatılmasını, güncellenmesini ve sonlandırılmasını garanti eder (örneğin `web-0` başlamadan `web-1` başlamaz, `web-2` silinmeden `web-1` silinmez). Bu, dağıtılmış veritabanları gibi uygulamaların tutarlılığı için kritiktir.
- **Hata Toleransı:** Bir Pod çökerse, StatefulSet kontrolcüsü aynı kimlik ve depolama ile yeni bir Pod başlatır.
Nasıl Çalışır?
StatefulSet, Pod'lar için kararlı bir kimlik ve depolama sağlamak üzere `volumeClaimTemplates` ve Pod'ların isimlendirilmesi için sayısal bir indeksleme kullanır. Her Pod'un adı, `[StatefulSet-adı]-[indeks]` formatında olur (örneğin `web-0`, `web-1`). Ölçekleme veya güncelleme durumunda, bu Pod'lar belirli bir sıra (indeks numaralarına göre) izlenerek işlenir.
Örnek YAML:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-db # StatefulSet adı
spec:
serviceName: "web-db-service" # Pod'ların DNS kaydı için headless Service adı
replicas: 3 # 3 adet Pod kopyası
selector:
matchLabels:
app: web-db
template:
metadata:
labels:
app: web-db
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www # Kalıcı depolama birimini bağla
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # Her Pod için dinamik olarak PVC oluşturma şablonu
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ] # Tek bir Pod tarafından okunabilir/yazılabilir
storageClassName: standard # Kullanılacak StorageClass
resources:
requests:
storage: 1Gi # Her Pod için 1GB depolama alanı isteği
StatefulSet Akışı
(Replicas: 3)
StatefulSet, her Pod için kararlı bir kimlik ve kalıcı depolama ile sıralı dağıtım sağlar.
2. DaemonSet: Her Düğümde Bir Pod
**DaemonSet**, Kubernetes kümesindeki her bir düğümde (veya belirlenmiş düğüm alt kümelerinde) Pod'un bir kopyasının çalışmasını garanti eden bir iş yükü API objesidir. Bir düğüm kümeye eklendiğinde, DaemonSet Controller otomatik olarak bu düğüme bir Pod dağıtır. Düğüm kümeden kaldırıldığında ise, DaemonSet tarafından dağıtılan Pod da silinir. DaemonSet'ler, küme altyapısıyla doğrudan etkileşime giren veya her düğümde sürekli çalışması gereken yardımcı servisler (daemons) için idealdir.
Neden ve Ne İşe Yarar?
- **Düğüm Başına Bir Kopya:** Log toplayıcıları (örneğin Fluentd, Filebeat), izleme ajanları (örneğin Prometheus Node Exporter), küme depolama sağlayıcıları (örneğin Ceph, GlusterFS) veya ağ proxy'leri (örneğin kube-proxy) gibi her düğümde tek bir örneğin çalışması gereken servisler için kullanılır.
- **Otomatik Dağıtım:** Yeni bir düğüm kümeye eklendiğinde veya mevcut bir düğüm yeniden başlatıldığında, ilgili Pod otomatik olarak bu düğüme dağıtılır.
- **Sürekli Çalışma Garantisi:** Belirlenen düğümlerde her zaman ilgili Pod'un çalıştığından emin olur.
Nasıl Çalışır?
DaemonSet Controller, kümedeki düğümleri sürekli izler. Yeni bir düğümün eklendiğini veya mevcut bir düğümün güncellendiğini algıladığında, DaemonSet'in şablonunu kullanarak uygun bir Pod oluşturur ve bu Pod'u ilgili düğüme atar. Eğer bir düğüm kümeden çıkarılırsa veya DaemonSet tarafından artık hedef alınmıyorsa, ilgili Pod o düğümden silinir. NodeSelector ve toleration'lar kullanılarak Pod'ların sadece belirli düğümlerde çalıştırılması sağlanabilir.
Örnek YAML:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-logging
labels:
app: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
tolerations: # Tüm düğümlerde çalışabilmek için taint'lere tolerans
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-container
image: fluent/fluentd-kubernetes-daemonset:v1.14-debian-fluentd-1.14
env:
- name: FLUENTD_ARGS
value: -qq
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
DaemonSet Akışı
(Her Düğümde)
Düğüm 1
Düğüm 2
Düğüm N
DaemonSet, her düğümde belirlenen Pod'un bir kopyasını çalıştırır.
StatefulSet ve DaemonSet Karşılaştırması
StatefulSet ve DaemonSet, Kubernetes'te farklı amaçlara hizmet eden özel iş yükü kontrolörleridir. Her ikisi de Pod'ları yönetirken, odak noktaları ve davranışları önemli ölçüde farklılık gösterir.
Özellik | StatefulSet | DaemonSet |
---|---|---|
**Ana Amaç** | Durum bilgisi olan (stateful) uygulamaları yönetmek. | Her düğümde veya belirli düğümlerde bir Pod kopyasının çalışmasını garanti etmek. |
**Pod Kimliği** | Kararlı, benzersiz ve sıralı kimlik (hostname, network ID) sağlar. | Önemli değildir, her Pod'un kimliği geçicidir. |
**Depolama** | Her Pod için kalıcı ve kararlı depolama (PVC aracılığıyla) garantisi verir. | Genellikle düğümün yerel diskine veya `hostPath` birimlerine erişir, kalıcı depolama garantisi vermez. |
**Dağıtım Prensibi** | Kontrollü, sıralı dağıtım, ölçekleme ve silme. Pod'lar indeks sırasına göre oluşturulur/silinir. | Her uygun düğüme bir Pod dağıtır. Düğüm sayısına göre Pod sayısı değişir. |
**Hata Durumunda** | Aynı kimlik ve depolama ile Pod'u yeniden başlatır/yeniden planlar. | Pod'u yeniden başlatır/yeniden planlar, ancak Pod kimliği veya depolama bağlılığı yoktur. |
**Örnek Kullanım** | Veritabanları (PostgreSQL, MongoDB, Kafka), dağıtılmış önbellekler (Cassandra), özel kimlik ve depolama gerektiren uygulamalar. | Log toplayıcıları (Fluentd, Filebeat), izleme ajanları (Node Exporter, Datadog Agent), ağ proxy'leri (kube-proxy), depolama sağlayıcıları (Ceph, GlusterFS). |
**Ölçeklendirme** | `replicas` sayısına göre ölçeklenir. Ölçekleme sırasında indeks sırası korunur. | Düğümlerin sayısına göre ölçeklenir. Otomatik olarak yeni düğümlere Pod dağıtır. |
Sonuç
Kubernetes, `Deployment`'lar ile durum bilgisiz uygulamalar için güçlü bir standart sunarken, `StatefulSet` ve `DaemonSet` gibi özel iş yükü kontrolörleri, daha karmaşık ve özelleşmiş dağıtım ihtiyaçlarını karşılar.
**StatefulSet**, veritabanları gibi durum bilgisi olan uygulamalar için kararlı kimlik, kalıcı depolama ve sıralı operasyonlar sağlayarak bu tür iş yüklerinin Kubernetes üzerinde güvenle çalışmasını mümkün kılar. Öte yandan, **DaemonSet**, her düğümde belirli bir Pod'un çalıştığından emin olmak için tasarlanmıştır ve genellikle küme altyapısının ayrılmaz bir parçası olan yardımcı servisler için kullanılır.
Bu iki kaynağın farklı kullanım alanlarını ve çalışma prensiplerini anlamak, Kubernetes kümelerinizde doğru uygulama deseni seçimi yapmanız ve dağıtımlarınızı optimize etmeniz için hayati öneme sahiptir.