PostgreSQL için Kubernetes Operatörü Seçimi

Giriş
PostgreSQL, güvenilirliği, yüksek performansı ve esnekliği ile bilinen sağlam, ilişkisel ve açık kaynaklı bir veri tabanıdır. Veri tabanı yönetim sistemi, yabancı anahtar kısıtlamaları, yüksek kullanılabilirlik, karmaşık sorgular, SQL multi-Version Concurrency (MVCC) gibi özellikler sunar. Bu özellikleri sayesinde PostgreSQL Kubernetes(K8S) küme içerisindeki uygulamalara yüksek erişilebilir ve dayanıklı veri hizmetleri sunmaya uygun hale gelir.
Ancak bir Kubernetes ortamında dağıtık bir PostgreSQL sistemini yönetmek kolay değildir ve veri tabanları gibi durum bilgisi olan uygulamaları yönetmek ciddi zorluklar doğurur. Kubernetes operatörleri, bu karmaşık uygulamaların yönetimini otomatikleştirmeye, iş yüklerinin dağıtımı, ölçeklendirilmesi ve bakımına yönelik bir çözüm olarak ortaya çıkmıştır. Kubernetes operatörü, PostgreSQL kümemizi otomatik olarak hazırlar, izler ve kümedeki düğümler arasındaki iletişim, yönetim ve bakım süreçlerinden sorumludur. Bu yazıda kapsamlı olarak, PostgreSQL dağıtımları için en uygun Kubernetes operatörünü seçmeye yönelik hususları ve kriterleri ayrıntılı olarak ele alacağız.
PostgreSQL Kubernetes Ortamında Neden Kullanılmalı?
PostgreSQL’i Kubernetes ortamında kullanımı her bir Mikroservis için veri tabanı olarak PostgreSQL’in kullanılması ve genel uygulama dağıtımını ve ölçeklendirmesini yönetmek için Kubernetes ile birleştirilmesiyle sağlam bir mimari elde edilir. Özet olarak avantajlarını aşağıdaki gibi sıralayabiliriz:
Otomasyon ve Yönetim Kolaylığı: Kubernetes, PostgreSQL gibi stateful uygulamaların dağıtımını ve yönetimini otomatikleştirmek için geliştirilmiş bir platformdur. PVC’ler aracılığıyla veri kalıcılığını sağlamak, stateful uygulamaları Kubernetes üzerinde çalıştırmayı daha kolay hale getirir. Bu sayede, veri tabanının dağıtımı, yükseltilmesi ve yedeklenmesi gibi işlemler daha basit ve tekrarlanabilir hale gelir.
Elastik Ölçeklendirme: PVC’ler ve StatefulSets kullanılarak PostgreSQL’i Kubernetes ortamında çalıştırmak, veri tabanının ölçeklenebilirliğini artırabilir. Dinamik olarak ölçeklendirilebilen depolama çözümleriyle birlikte, PostgreSQL örneklerini gereksinimlere göre otomatik olarak ölçeklendirebilir ve yönetebilirsiniz.
Yüksek Kullanılabilirlik: StatefulSets, PostgreSQL gibi stateful uygulamaların yüksek kullanılabilirlik gereksinimlerini karşılamak için tasarlanmıştır. StatefulSets, otomatik olarak yeniden başlatma ve failover gibi özellikleri sağlayarak, PostgreSQL kümenizin kesintisiz çalışmasını sağlar.
Karmaşıklığın Azaltılması: PVC’ler ve StatefulSets gibi Kubernetes özellikleri, PostgreSQL’in dağıtımını ve yönetimini basitleştirir. Bu, veri tabanının kurulumu, yapılandırılması ve güncellenmesi gibi karmaşık işlemleri otomatikleştirebilir ve tekrar edilebilir hale getirebilir.
Veri Kalıcılığı: PVC’ler, PostgreSQL verilerinin kalıcılığını sağlar. Bu, veri tabanının yeniden oluşturulması veya taşınması gerektiğinde veri kaybını önler. Ayrıca, PVC’ler veri tabanı örnekleri arasında veri taşımayı ve yedekleme/geri yükleme işlemlerini kolaylaştırır.
Kapsamlı İzleme ve Günlükleme: Kubernetes, gelişmiş izleme ve günlükleme araçlarına sahiptir. PVC’ler ve StatefulSets ile PostgreSQL’i Kubernetes üzerinde çalıştırarak, veri tabanının performansını izlemek ve hataları tespit etmek daha kolay hale gelir.
Çeviklik ve Taşınabilirlik: PostgreSQL’i Kubernetes ortamında çalıştırmak, uygulamanızı farklı bulut sağlayıcılarına veya altyapı sağlayıcılarına daha kolay taşınabilir hale getirir. Bu sayede, uygulamanızın gereksinimlerini karşılamak için altyapıda esneklik sağlar.
Sonuç olarak, PostgreSQL’i Kubernetes ortamında çalıştırmak, veri tabanınızın yönetimini basitleştirebilir, ölçeklenebilirliğini artırabilir ve yüksek kullanılabilirlik sağlayabilir. Bu, modern bir bulut tabanlı altyapıda veri tabanı gereksinimlerinizi karşılamak için güçlü bir seçenek olacaktır.
Kubernetes’te PostgreSQL’i Yönetmedeki Zorluklar
Kubernetes’te PostgreSQL gibi karmaşık bir veri tabanını yönetmek, bazı belirgin zorluklarla karşılaşabilir. İşte bu zorluklardan bazıları:
Veri Kalıcılığı: PostgreSQL gibi bir veri tabanı, veri kalıcılığını sağlamak için güvenilir bir depolama ortamına ihtiyaç duyar. Kubernetes ortamında veri kalıcılığını yönetmek, veri kaybı veya bütünlük sorunları gibi risklerle karşılaşabilir.
Yüksek Erişilebilirlik: PostgreSQL’in yüksek erişilebilirlik gereksinimleri vardır. Yüksek kullanılabilirlik ve otomatik başarısızlık iyileştirmesi sağlamak için karmaşık yapılandırmalar ve uygulama mimarileri gerekebilir.
Yedekleme ve Geri Yükleme: Veri kaybını önlemek için düzenli yedekleme ve geri yükleme işlemleri yapılmalıdır. Bu süreçleri otomatikleştirmek ve sorunsuz bir şekilde yönetmek zor olabilir.
Ölçeklendirme: PostgreSQL veri tabanı, artan yük altında ölçeklenebilir olmalıdır. Kubernetes’te PostgreSQL’i ölçeklemek, veri tabanı sunucularını dinamik olarak eklemek veya kaldırmak için karmaşık konfigürasyonlar ve otomatik ölçeklendirme stratejileri gerektirebilir.
Güncelleme ve Yükseltme: PostgreSQL’in güncellenmesi ve yükseltilmesi, veri kaybını önlemek için dikkatlice planlanmalı ve yönetilmelidir. Bu süreç, kullanıcı kesintilerini minimize etmek için dikkatlice yönetilmelidir.
İzleme ve Günlükler: PostgreSQL veri tabanının performansını izlemek ve sorunları tespit etmek için etkili bir izleme ve günlükleme stratejisi gereklidir. Bu, Kubernetes ortamında ek zorluklarla karşılaşabilir.
Güvenlik: PostgreSQL veri tabanının güvenliği kritiktir. Kubernetes ortamında PostgreSQL veri tabanını güvence altına almak için gerekli önlemleri almak ve güvenlik açıklarını düzeltmek önemlidir.
Bu zorluklar, PostgreSQL’i Kubernetes ortamında başarılı bir şekilde yönetmeyi zorlaştırabilir. Ancak, uygun araçlar, stratejiler ve en iyi uygulamalar kullanılarak bu zorluklar aşılabilmektedir.
Kubernetes Operatörü Nedir?
Kubernetes operatörleri, Kubernetes’in işlevselliğini genişleten yazılım eklentileridir. Diğer bir deyişle, bunlar, Kubernetes üzerinde çalışan karmaşık uygulamaların oluşturulmasını, yönetilmesini ve yapılandırılmasını otomatikleştiren Özel Denetleyiciler’dir (Custom Controller). Bu denetleyiciler, Kubernetes’in API’lerini kullanarak, belirli uygulama türlerine özgü kurallara göre çalışır ve küme durumunu izleyebilir, pod ve hizmetleri değiştirebilir, ölçeklendirme işlemleri gerçekleştirebilir ve çalışan uygulamaların erişim noktalarını çağırabilir.
Operatörler, Kubernetes’in temel kavramları olan kaynaklar ve denetleyicilerden oluşur. Ancak, operatörler, sıkça yapılan görevleri otomatikleştirmek için özel veya uygulama özgü bilgi içerir. Bu görevler arasında, talep üzerine dağıtım yapma, uygulama durumunun yedeklerini alma veya geri yükleme, veri tabanı şema veya yapılandırma değişikliklerine bağlı olarak uygulama kodunu güncelleme, Kubernetes yükseltmelerini yönetme ve otomatik ölçeklendirme gibi işlemler bulunur. Operatörler, karmaşık uygulamaların yönetimini otomatikleştirerek, geliştiricilere zaman kazandırırken hata olasılığını azaltır ve işletmelerin verimliliğini artırır.
Örneğin, Elastic Stack’i Kubernetes ortamında kurmayı düşünelim. Elasticsearch, Logstash ve Kibana gibi bileşenlerden oluşan bu dağıtım, belirli bir sıra ve koordinasyon gerektirir. Elasticsearch’in önce başlatılması ve çalışır duruma gelmesi gerekmektedir. Ardından, Logstash ve Kibana gibi bileşenler başlatılabilir. Ancak, Logstash ve Kibana’nın Elasticsearch’e bağlı olması nedeniyle, Elasticsearch’in öncelikle hizmete hazır olması gerekmektedir. Tüm bu kurulum süreci, Helm gibi basit bir araçla yönetilmesi zor olabilir. Ancak, özel bir denetleyici (Custom Controller) kullanarak, bu karmaşık akışı kolayca yönetmek mümkündür. Denetleyici, kurulum sürecinin belirli adımlarını otomatikleştirir ve doğru sırayla bileşenleri başlatarak Elastic Stack’i kurar. Bu şekilde, karmaşık bir işlemi otomatikleştirerek, kurulum sürecini daha basit ve yönetilebilir hale getirir.

PostgreSQL Operatörü Seçiminde Temel Kriterler
PostgreSQL operatörü seçerken dikkate alınması gereken temel kriterler şunlardır:
Topluluk Desteği ve Yaygınlık: Operatörün yaygın olarak kullanılması ve geniş bir topluluğa sahip olması, karşılaşılabilecek sorunların çözümü için önemlidir. Daha aktif ve büyük bir topluluk, daha fazla destek ve geri bildirim anlamına gelir.
Özellik Seti: Operatörün sağladığı özellikler, PostgreSQL kümesini etkili bir şekilde yönetmeye yardımcı olmalıdır. Bu, otomatik yedekleme, veri tabanı yükseltmeleri, yüksek erişilebilirlik, izleme ve günlükleme gibi özellikleri içerebilir.
Esneklik ve Özelleştirme: Operatörün esnek olması ve çeşitli konfigürasyon seçenekleri sunması önemlidir. PostgreSQL kümesini kurarken ve yapılandırırken özelleştirilmiş gereksinimlere uyum sağlamalıdır.
Stabilite ve Güvenilirlik: Operatörün güvenilirliği ve istikrarı, işletmenin kesintisiz çalışmasını sağlamak için kritiktir. Operatörün düzenli olarak güncellenmesi ve bakımının yapılması önemlidir.
Uyum ve Entegrasyon: Operatörün Kubernetes ve PostgreSQL’in en son sürümleriyle uyumlu olması gerekmektedir. Ayrıca, diğer Kubernetes ekosistemi araçlarıyla entegrasyon sağlaması da önemlidir.
Belgelendirme ve Destek: Operatörün sağladığı belgelendirme ve destek seviyesi de dikkate alınmalıdır. Kapsamlı belgeler ve etkili destek kanalları, kullanıcıların operatörü başarıyla kullanmasına yardımcı olur.
Operatörün Güvenliği: PostgreSQL operatörü, PostgreSQL kümesini güvenli bir şekilde yönetmek için gerekli güvenlik önlemlerini sağlamalıdır. Veri güvenliği, ağ güvenliği ve erişim kontrolü gibi konularda önemli bir rol oynamaktadır.
Performans: Operatörün PostgreSQL kümesini yönetirken performans etkileri minimalize edilmelidir. Operatörün etkisi, PostgreSQL kümesinin performansını olumsuz yönde etkilememelidir.
Bu kriterler, PostgreSQL operatörü seçimi yaparken dikkate alınmalıdır. İşletmenin ihtiyaçlarına ve gereksinimlerine en uygun olan operatörü seçmek, PostgreSQL kümesini etkili bir şekilde yönetmek ve operasyonel verimliliği artırmak için önemlidir.
PostgreSQL için Popüler Kubernetes Operatörleri
Patroni:
Artıları:
- Otomatik Failover Yetenekleri: PostgreSQL kümesindeki bir düğümün başarısız olduğunu algılar ve otomatik olarak bir yedek düğümü ana düğüm olarak tanımlayarak failover sağlar.
- Dinamik Konfigürasyon Yönetimi: Çalışma zamanında yapılandırmayı güncelleyebilir, bu da esnek konfigürasyon yönetimi sağlar.
- Kubernetes Uyumlu: Kubernetes ortamında kullanım için özel olarak tasarlanmış ve CRD’leri kullanarak yapılandırma kolaylığı sunar.
Eksileri:
- Karmaşık Yapılandırma Gereksinimleri: Başlangıçta karmaşık yapılandırmalara ihtiyaç duyabilir, bu da yeni kullanıcılar için öğrenme eğrisini artırabilir.
- Bakım Süreçleri: Bazı durumlarda bakım işlemleri karmaşık olabilir ve dikkatli planlama gerektirebilir.
Stolon:
Artıları:
- Etcd Kullanımı ile Küme Durumu Yönetimi: Etcd kullanarak küme durumunu saklamak, PostgreSQL düğümlerini etkili bir şekilde yönetmek için kullanılır.
- Dinamik Konfigürasyon: Çalışma zamanında konfigürasyon güncellemeleri ve otomatik failover yetenekleri mevcuttur.
- Küme Ölçeklendirme: PostgreSQL kümesini ölçeklendirebilme yeteneği mevcuttur.
Eksileri:
- Karmaşık Yapılandırma: Başlangıçta karmaşık yapılandırmalara ihtiyaç duyar.
- Bakım İşlemleri: Kullanıcılar için bakım süreçleri bazen karmaşık olabilir.
Citus:
Artıları:
- Dağıtılmış Veri tabanı: Dağıtılmış bir veri tabanı sistemi olup, yüksek ölçeklenebilirlik ve performans sağlar.
- Yüksek Erişilebilirlik: Otomatik failover yetenekleri ile yüksek erişilebilirlik sunar.
- Yüksek Performans: Ölçeklenebilir ve yüksek performanslı bir PostgreSQL çözümüdür.
Eksileri:
- Yönetim Karmaşıklığı: Dağıtılmış sistemlerin yönetimi genellikle daha fazla çaba gerektirir.
- Konfigürasyon Gereksinimleri: Belirli konfigürasyonlara ihtiyaç duyabilir, bu da ek konfigürasyon çabası gerektirebilir.
- Kubernetes Ortamında Kurulum: Citus bir PostgreSQL extension’ı olduğu için Kubernetes ortamına deployment işlemlerini kendimiz yönetmeliyiz.
KubeDB:
Artıları:
- Geniş Veri tabanı Desteği: Kubernetes üzerinde çeşitli veri tabanlarını yönetmek için geniş bir platform sunar.
- Otomatik Failover: PostgreSQL için yüksek erişilebilirlik ve otomatik failover yetenekleri mevcuttur.
- Özel CRD’ler: Kolay yapılandırma için özel CRD’ler kullanır.
Eksileri:
- Karmaşıklık: KubeDB’nin karmaşıklığı ve belirli konfigürasyonlara ihtiyaç duyan durumlar olabilmektedir.
- Yönetim Zorlukları: Kullanıcıların ihtiyaçlarına bağlı olarak konfigürasyon ve yönetim karmaşıklığı vardır.
Crunchy PostgreSQL for Kubernetes:
Artıları:
- Kubernetes Entegrasyonu: PostgreSQL için Kubernetes üzerinde bir platform sunar.
- Güçlü Yedekleme ve Geri Yükleme: Güçlü yedekleme ve geri yükleme özellikleri ile veri güvenliğini sağlar.
- Yüksek Performans: Ölçeklenebilir ve yüksek performanslı bir PostgreSQL çözümüdür.
Eksileri:
- Karmaşık Konfigürasyon: Bazı durumlarda karmaşık konfigürasyonlar ve yapılandırmalar gerekebilir.
- Yönetim Karmaşıklığı: Kullanıcıların ihtiyaçlarına bağlı olarak konfigürasyon ve yönetim karmaşıklığı mevcuttur.
Cloud Native PostgreSQL (cloudnative-pg):
Artıları:
- Kubernetes Odaklı Tasarım: Proje, Kubernetes ortamlarında PostgreSQL’i yönetmeyi kolaylaştırmak için özel olarak tasarlanmıştır, bu da Kubernetes kullanıcıları için avantajlı olabilir.
- Otomatik Yedekleme ve Geri Yükleme: Otomatik yedekleme ve geri yükleme yetenekleri, veri güvenliğini artırabilir ve yönetimi kolaylaştırabilir.
- Ölçeklenebilir PostgreSQL Kümesi: Ölçeklenebilir PostgreSQL kümesi oluşturabilme yeteneği, büyüyen iş yüklerine daha iyi uyum sağlayabilir.
- Esnek Yapı ve Konfigürasyon: Cloud Native PostgreSQL, çeşitli yapılandırma seçenekleri sunabilir, böylece kullanıcılar ihtiyaçlarına göre PostgreSQL kümesini özelleştirebilir.
- Yeni Nesil PostgreSQL Yönetimi: Kubernetes entegrasyonu ve modern yönetim özellikleri ile geleceğe dönük bir PostgreSQL yönetim çözümü sunabilir.
Eksileri:
- Karmaşık Konfigürasyon: Bazı durumlarda karmaşık konfigürasyonlar ve yapılandırmalar gerekebilir.
- Yönetim Karmaşıklığı: Kullanıcıların ihtiyaçlarına bağlı olarak konfigürasyon ve yönetim karmaşıklığı vardır.
Patroni | Stolon | Citus | KubeDB | Crunchy Data | CloudNativePG | |
---|---|---|---|---|---|---|
Supported latest PostgreSQL version | 16 | 15 | 16 | 16 | 16 | 16 |
PgSQL clusters | + | + | + | + | + | + |
Synchronous replication | + | + | + | + | + | + |
Streaming replication | + | + | + | + | + | + |
Automatic failover | + | + | + | + | + | + |
Initialization: using a WALarchive | + | + | + | + | + | + |
Instant and scheduled backups | - | + | + | + | + | + |
Managing backups in a Kubernetes-native way | - | - | - | + | - | + |
Initialization: using a snapshot + scripts | + | + | + | + | + | + |
Built-in Prometheus support | - | - | - | + | + | + |
Custom configuration | + | + | + | + | + | + |
External CLI utilities | + | + | + | + | + | + |
CRD-based configuration | - | - | - | + | + | + |
Custom Pods | - | + | - | + | - | + |
CloudNativePg Kurulumu

- Öncelikle lokal ortamda test için Docker masaüstü üzerinden Kubernetes kümesi oluşturuyoruz.
1
Docker Desktop → Settings → Kubernetes → Enable Kubernetes → Apply & restart.
- CloudNativePQ postgis için özelleştirilmiş bir imaja sahip. Kendi platformumuza uygun platform bilgisi geçerek imajı çekiyoruz.(Mac için –platform=linux/amd64)
1
docker image pull ghcr.io/cloudnative-pg/postgis:16-3.4 --platform=linux/amd64
- CloudNativePG controller manager’ı kümeye deploy ediyoruz.
1 2
kubectl apply -f \ https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.21/releases/cnpg-1.21.0.yaml
1
kubectl get deployment -n cnpg-system cnpg-controller-manager
- CloudNativePG Cluster’ı kuracağımız namespace’i oluşturuyoruz.
1
kubectl create ns tekno
- Aşağıdaki manifest dosyalarını oluşturduğumuz namespace’te deploy ediyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: tekno-pg namespace: tekno spec: instances: 3 primaryUpdateStrategy: unsupervised imageName: ghcr.io/cloudnative-pg/postgis:16-3.4 imagePullPolicy: IfNotPresent superuserSecret: name: superuser-secret bootstrap: initdb: database: teknobir_db owner: u_teknobir secret: name: teknouser-secret postInitTemplateSQL: - CREATE EXTENSION postgis; - CREATE EXTENSION postgis_topology; - CREATE EXTENSION fuzzystrmatch; - CREATE EXTENSION postgis_tiger_geocoder; storage: size: 1Gi
1 2 3 4 5 6 7 8 9
apiVersion: v1 kind: Secret metadata: name: superuser-secret namespace: tekno type: kubernetes.io/basic-auth data: username: cG9zdGdyZXM= password: cG9zdGdyZXM=
1 2 3 4 5 6 7 8 9
apiVersion: v1 kind: Secret metadata: name: teknouser-secret namespace: tekno type: kubernetes.io/basic-auth data: username: dV90ZWtub2Jpcg== password: cQ==
- Kurulum sonrasında veri tabanına küme dışından erişebilmek için service tipini değiştirmemiz gerekiyor.
1
kubectl -n tekno patch service tekno-pg-rw -p '{"spec": {"type": "NodePort"}}'
- Aşağıdaki komut ile küme dışına açılan nodeport değerini öğrenerek, localhost üzerinden veri tabanına bağlanabiliriz.
1
kubectl -n tekno get svc
1
psql -h localhost -p <nodeport> -U u_teknobir -d teknobir_db
Sonuç
Özellikle Kubernetes ortamında kullanılmak üzere geliştirilmiş ve küme üzerinde kurulumun kolay olması, CRD desteğinin ve bu CRD (Custom Resource Definitions ) ‘yi kendi ihtiyaçlarımıza göre özelleştirebiliyor olmamız, farklı PostgreSQL eklentileri için özelleştirilmiş CRD’lerinin var olması, harici CLI aracına sahip olması, izleme işlemleri için içinde Prometheus Stack desteğinin olması, Replication ve yedekleme yetenekleri gelişmiş, stabil ve “Kubernetes Native” şekilde yönetilebiliyor olması, güncellemelerin aktif ve son sürüm PostgreSQL versiyonunu destekliyor olmasından dolayı Kubernetes ortamında CloudNativePG operatörünün kullanılması diğerlerine göre öne çıkmaktadır.
Kaynakça
- https://www.kubermatic.com/blog/why-implementing-kubernetes-operators-is-a-good-idea/
- https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
- https://www.redhat.com/en/topics/containers/what-is-a-kubernetes-operator
- https://blog.palark.com/comparing-kubernetes-operators-for-postgresql/
- https://cloudnative-pg.io/documentation/1.20/architecture/