Skip to main content

General

Kubernetes High Availability Kurulumu

Proxus'u Kubernetes üzerinde HA PostgreSQL, replikalı ClickHouse, NATS JetStream, çoklu UI ve singleton gateway yapısıyla kurun.

Bu rehber, Proxus'u Kubernetes üzerinde yüksek erişilebilirlik hedefiyle kurmak için hazırlanmıştır. Docker Compose tek sunucu kurulumları için uygundur; bu rehber ise production ortamda arıza toleransı, kontrollü güncelleme ve operasyonel bakım isteyen ekipler içindir.

warning
Production için çok node'lu cluster gerekir

Manifestler lokal Kubernetes ortamında test edilebilir, ancak gerçek HA production kurulum için çok node'lu Kubernetes cluster, güvenilir persistent storage, izleme ve yedekleme politikası gerekir. Tek node'lu cluster topolojiyi doğrular, fakat node kaybına dayanıklı değildir.

Bu Kurulum Ne Sağlar?

HA kurulum Proxus'u veri katmanı ve uygulama katmanı olarak ayırır:

KatmanBileşenHA davranışı
VeriPostgreSQL3 instance, tek read-write endpoint ve otomatik failover
VeriClickHouse Keeper3 pod koordinasyon quorum'u
VeriClickHouseReplikalı telemetri depolama için 1 shard, 2 replica
MesajlaşmaNATS JetStream3 node mesajlaşma hub'ı, üç replikalı stream'lerle
UygulamaProxus UINode'lara dağıtılmış 2 replica, Kubernetes Service arkasında
EdgeProxus GatewayHer GatewayID için 1 pod, hata durumunda Kubernetes yeniden başlatır
OperasyonPod Disruption BudgetNATS ve UI için drain koruması
OperasyonPrometheus metrikleriHer NATS pod'unda NATS exporter sidecar
OperasyonKubernetes SecretNATS ve PostgreSQL kimlik bilgileri plaintext manifest'lerden çıkarıldı
info
Gateway ölçekleme kuralı

Gateway workload'ları singleton'dır. Aynı GatewayID için replica sayısını artırmayın. Ayrı saha veya hat için kapasite eklemek istiyorsanız farklı GatewayID ile ayrı bir gateway deployment oluşturun.

Hızlı HA Kurulumu

Gerekenler: Kubernetes cluster, varsayılan StorageClass, kubectl erişimi, operator kurma yetkisi, Proxus lisansı ve kullanacağınız release'e ait Proxus container imajlarına erişim.

Tam HA paketi şunları ayağa kaldırır:

  • CloudNativePG ile yönetilen 3 PostgreSQL instance
  • 3 ClickHouse Keeper pod ve 2 replikalı ClickHouse cluster
  • Üç replikalı stream'lerle JetStream çalıştıran 3 NATS pod
  • Sticky-session ingress arkasında 2 Proxus UI pod
  • 1 Proxus Gateway pod
  • Pod Disruption Budget'lar, Prometheus metrikleri ve kimlik bilgisi Secret'ları
warning
Varsayılan değerler yalnız ilk kurulum içindir

Paket iki Kubernetes Secret'ında varsayılan kimlik bilgileriyle gelir (nats-credentials, postgres-credentials). Aşağıdaki Hızlı Kurulum ile birkaç dakikada çalışan bir cluster elde edersiniz; ancak ortamı ekibiniz dışına açmadan önce bu varsayılanları değiştirin. Rotasyon prosedürü için Güvenlik ve Secret'lar bölümüne bakın.

Tüm HA kurulumu çalıştırın:

mkdir -p proxus-kubernetes-ha
cd proxus-kubernetes-ha
curl -L https://proxus.io/deployment/kubernetes-ha/proxus-kubernetes-ha.tar.gz | tar xz

kubectl apply --server-side -f https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.29/releases/cnpg-1.29.0.yaml
kubectl -n cnpg-system rollout status deployment/cnpg-controller-manager --timeout=300s

curl -s https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator-web-installer/clickhouse-operator-install.sh | OPERATOR_NAMESPACE=clickhouse bash
kubectl -n clickhouse rollout status deployment/clickhouse-operator --timeout=300s

kubectl apply -k ha-data
kubectl -n proxus-data wait --for=jsonpath='{.status.phase}'='Cluster in healthy state' cluster/postgresql-ha --timeout=600s
kubectl -n clickhouse wait --for=jsonpath='{.status.status}'=Completed chi/clickhouse-ha --timeout=600s
kubectl -n clickhouse wait --for=condition=complete job/clickhouse-bootstrap --timeout=180s

kubectl apply -k ha
kubectl -n proxus-ha rollout status statefulset/hub-server --timeout=300s
kubectl -n proxus-ha rollout status deployment/proxus-ui --timeout=300s
kubectl -n proxus-ha rollout status deployment/proxus-server-gateway-1 --timeout=300s

Sağlıklı bir cluster üzerinde toplam süre 5-10 dakikadır; çoğunluğu CloudNativePG'nin PostgreSQL primary'sini ayağa kaldırması ve ClickHouse Keeper quorum'unun başlamasıdır.

Kurulum Doğrulaması

Cluster'ın sağlıklı geldiğini ve JetStream stream'lerinin üç replikalı çalıştığını doğrulayın:

kubectl -n proxus-ha get pods,pdb
kubectl run -n proxus-ha nats-tmp --rm -i --restart=Never --image=natsio/nats-box:0.18.0 -- \
  nats --server="nats://acc:acc@hub-server:4222" stream report

Rapordaki her JetStream stream'i R=3 göstermelidir. Herhangi bir stream R=1 görünüyorsa Sorun Giderme bölümüne bakın.

İlk Giriş

Tarayıcıda http://127.0.0.1:30080/ adresini açın. Remote cluster'da 127.0.0.1 yerine erişilebilir Kubernetes node adresini kullanın veya verilen ingress'i load balancer arkasında yayınlayın.

Varsayılan giriş:

  • Kullanıcı adı: Admin
  • Şifre: ortamınızda değiştirilmediyse boş bırakın

İlk girişten sonra Proxus lisansınızı UI üzerinden aktive edin. Yeni HA PostgreSQL cluster, eski Docker veya lokal test veritabanındaki lisans verisini içermez; ancak o veritabanını restore ettiyseniz durum farklıdır.

Production'a Geçmeden Önce

Varsayılan NATS ve PostgreSQL kimlik bilgilerini rotate etmek için Güvenlik ve Secret'lar prosedürünü uygulayın, ardından Production Kontrol Listesi üzerinden geçin.

Kurulumu Kontrol Etme

Hızlı kurulum bittiğinde veya wait komutlarından biri timeout alırsa şu komutlarla durumu kontrol edin:

kubectl -n proxus-data get cluster,pods,svc,pvc
kubectl -n clickhouse get pods,svc,pvc,chi
kubectl -n proxus-ha get pods,svc,endpoints

Beklenen yapı:

WorkloadBeklenen durum
hub-server3 NATS pod
proxus-ui2 UI pod
proxus-server-gateway-11 gateway pod
postgresql servicePostgreSQL read-write endpoint'ine ExternalName
clickhouse serviceClickHouse service'ine ExternalName

Production'da UI'ı ingress veya load balancer üzerinden yayınlayın. Verilen ingress örneği tarayıcı oturumları için sticky session kullanır:

kubectl -n proxus-ha get ingress

Production Konfigürasyonu

Ortamı dışa açmadan önce şu değerleri gözden geçirip değiştirin:

DosyaKontrol edilecek alan
ha/secrets.yamlNATS hesap kimlik bilgileri ve PostgreSQL kimlik bilgileri (önce burayı yapın; bkz. Güvenlik ve Secret'lar)
ha-data/postgresql-ha.yamlPostgreSQL storage boyutu ve instance sayısı
ha-data/clickhouse-ha.yamlClickHouse şifresi, storage boyutu, Keeper ve replica sayısı
ha/proxus-ui.yamlUI imaj etiketi, replica sayısı, kaynak request/limit'leri
ha/proxus-gateway-1.yamlGateway imaj etiketi, GatewayID, dışa açılan protokol portları, kaynak request/limit'leri
ha/nats-cluster.yamlJetStream storage boyutu, kaynak request/limit'leri
ha/pod-disruption-budgets.yamlİsteğe bağlı kesintilerde minimum erişilebilir pod sayısı
ha/storage.yamlPersistent volume boyutu ve access mode; çok node'lu production için ortak UI volume'leri ve nats-hub-config RWX storage kullanmalıdır
ha/ingress-nginx-sticky.yamlHost adı, ingress class, sticky session ayarları
warning
Tek dosya yerine kustomize kullanın

Manifest'leri her zaman kubectl apply -k ha (kustomize) ile uygulayın. Tek tek dosyaları kubectl apply -f ile uygulamak kustomization'da bildirilen namespace'i almaz; kaynaklar yanlış namespace'te oluşabilir.

Güvenlik ve Secret'lar

Varsayılan NATS ve PostgreSQL kimlik bilgileri plaintext manifest argümanları olarak değil, proxus-ha namespace'inde iki Kubernetes Secret içinde tutulur.

SecretAnahtarlar
nats-credentialsusers-user, users-password, sys-user, sys-password
postgres-credentialsuser, password, database

NATS sunucusu accounts.conf içinde environment variable interpolation ile bu değerleri başlangıçta okur. UI ve Gateway pod'ları aynı değerleri ortam değişkeni olarak alır ve bağlantı argümanları pod başlatılırken $(VAR_NAME) ikamesi kullanır.

Manifest düzenlemeden değer rotasyonu:

kubectl -n proxus-ha edit secret nats-credentials
kubectl -n proxus-ha edit secret postgres-credentials
kubectl -n proxus-ha rollout restart statefulset/hub-server
kubectl -n proxus-ha rollout restart deployment/proxus-ui deployment/proxus-server-gateway-1

postgres-credentials değişikliğinden önce yeni kimlik bilgilerinin PostgreSQL cluster tanımına (ha-data/postgresql-ha.yaml) yansıdığından emin olun. ClickHouse kimlik bilgileri ha-data/clickhouse-ha.yaml üzerinden yönetilir; henüz postgres-credentials üzerinden geçmez.

Gözlenebilirlik

Her NATS pod'u 7777 portunda Prometheus formatında metrik sunan bir sidecar çalıştırır. Standart scrape annotation'larıyla bir headless servis bu uç noktayı yayar:

kubectl -n proxus-ha get svc hub-server-metrics
kubectl -n proxus-ha get pods -l app.kubernetes.io/name=hub-server -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

Prometheus instance'ınızı bu headless servise yönlendirin. Faydalı metrikler arasında JetStream stream/consumer sayıları, route durumu ve stream başına mesaj throughput'u bulunur.

Ölçekleme Kuralları

UI

UI yatay ölçeklenebilir:

kubectl -n proxus-ha scale deployment/proxus-ui --replicas=3
kubectl -n proxus-ha rollout status deployment/proxus-ui --timeout=300s

Ortamınız sticky session olmadan doğrulanmadıysa ingress katmanında sticky session açık kalsın.

Gateway'ler

Bir gateway deployment'ını birden fazla replica'ya çıkarmayın:

kubectl -n proxus-ha scale deployment/proxus-server-gateway-1 --replicas=1

Başka bir gateway eklemek için farklı GatewayID ile ayrı deployment oluşturun.

PostgreSQL

PostgreSQL tek writable primary kullanır. Uygulama bağlantısı read-write service'e gider:

postgresql-ha-rw.proxus-data.svc.cluster.local:5432

Read-only service'i yalnızca replica üzerinde çalışması güvenli olan iş yükleri için kullanın:

postgresql-ha-ro.proxus-data.svc.cluster.local:5432

ClickHouse

Paket 1 shard ve 2 replica ile başlar. Bu yapı replica erişilebilirliği sağlar. Daha yüksek analitik kapasite için shard sayısı, tablo motorları ve distributed table stratejisi birlikte planlanmalıdır.

Proxus'u Güncelleme

  1. Yedek alın veya son başarılı yedekleri doğrulayın.
  2. ha/proxus-ui.yaml ve ha/proxus-gateway-1.yaml içindeki imaj etiketini değiştirin.
  3. Manifestleri uygulayın:
kubectl apply -k ha
  1. Rollout'u izleyin:
kubectl -n proxus-ha rollout status deployment/proxus-ui --timeout=300s
kubectl -n proxus-ha rollout status deployment/proxus-server-gateway-1 --timeout=300s

UI güncellemeleri rolling yapılır. Gateway singleton olduğu için gateway güncellemesi sırasında o gateway'e bağlı cihazlar kısa süreli kopup yeniden bağlanabilir.

NATS Control-Plane Stream Güncellemesi

Eski bir HA paketinden güncelliyorsanız legacy license_stream var mı kontrol edin. Proxus license ve license.health konularını core NATS request/reply olarak kullanır; bu konular JetStream stream arkasında olmamalıdır.

nats stream info license_stream
nats stream rm license_stream --force

Bu stream'i yalnızca mevcut paket sürümünüzün artık license_stream oluşturmadığını ve üzerinde özel consumer olmadığını doğruladıktan sonra kaldırın.

Operator Güncellemeleri

Operator güncellemelerini altyapı bakım işi olarak planlayın:

  1. Operator release notlarını okuyun.
  2. Yedeklerin hazır olduğunu doğrulayın.
  3. Bakım penceresinde operator güncellemesini uygulayın.
  4. Veritabanı ve ClickHouse cluster sağlığını kontrol edin.

PostgreSQL:

kubectl -n proxus-data get cluster,pods

ClickHouse:

kubectl -n clickhouse get chi,pods

Yedekleme ve Geri Yükleme

PostgreSQL

Storage snapshot sisteminizi veya PostgreSQL operator'ünün backup konfigürasyonunu kullanın. En azından şunları kontrol edin:

kubectl -n proxus-data get cluster postgresql-ha
kubectl -n proxus-data get pvc

Production'da zamanlanmış yedek oluşturun ve bu yedeği ayrı bir namespace'e restore ederek test edin.

ClickHouse

Tüm replica'ları ve Keeper metadata gereksinimlerini kapsayan storage snapshot veya ClickHouse backup süreci kullanın. Data PVC'leri ve Keeper PVC'lerinin korunduğunu doğrulayın:

kubectl -n clickhouse get pvc

Proxus Konfigürasyonu ve Modüller

Proxus UI ve gateway PVC'lerini yedekleyin:

kubectl -n proxus-ha get pvc

Önemli volume'ler:

  • UI config
  • UI modules
  • her gateway'in config volume'ü
  • NATS JetStream verisi

Arıza Testleri

Arıza testlerini bakım penceresinde çalıştırın.

UI Pod Arızası

kubectl -n proxus-ha delete pod -l app.kubernetes.io/name=proxus-ui
kubectl -n proxus-ha rollout status deployment/proxus-ui --timeout=300s

Kubernetes silinen podu yeniden oluştururken service sağlıklı UI poduna trafik vermeye devam etmelidir.

Gateway Pod Arızası

kubectl -n proxus-ha delete pod -l app.kubernetes.io/name=proxus-server,proxus.io/gateway-id=1
kubectl -n proxus-ha rollout status deployment/proxus-server-gateway-1 --timeout=300s

Bağlı cihazlar yeni pod başladıktan sonra yeniden bağlanabilir.

PostgreSQL Primary Arızası

PostgreSQL operator'ünün dokümante ettiği switchover veya failover prosedürünü kullanın. Failover sonrasında şunları doğrulayın:

kubectl -n proxus-data get cluster postgresql-ha
kubectl -n proxus-ha logs deploy/proxus-ui --tail=100

ClickHouse Replica Arızası

kubectl -n clickhouse delete pod chi-clickhouse-ha-proxus-0-0-0
kubectl -n clickhouse get pods,chi

Kalan replica erişilebilir kalmalı, silinen pod yeniden oluşturulmalıdır.

Sorun Giderme

UI Açılmıyor

Service ve podları kontrol edin:

kubectl -n proxus-ha get pods,svc,endpoints
kubectl -n proxus-ha logs deploy/proxus-ui --tail=100

HA paketi UI service'ini NodePort 30080 olarak açar. Lokalde http://127.0.0.1:30080/ adresini açın; remote cluster'da 127.0.0.1 yerine erişilebilir node adresini kullanın.

Login Sayfası Açılıyor ama Gateway Aktif Değil

Gateway loglarını kontrol edin:

kubectl -n proxus-ha logs deploy/proxus-server-gateway-1 --tail=150

Lisans mevcut veritabanında aktive edilmediyse UI üzerinden lisansı aktive edin.

PostgreSQL Hazır Değil

kubectl -n proxus-data get cluster,pods,pvc
kubectl -n proxus-data describe cluster postgresql-ha

Yaygın nedenler:

  • storage class volume oluşturamıyor
  • database imajı çekilemiyor
  • cluster CPU veya memory kaynağı yetersiz
  • küçük cluster'da pod anti-affinity karşılanamıyor

ClickHouse Hazır Değil

kubectl -n clickhouse get chi,pods,svc,pvc
kubectl -n clickhouse logs deploy/clickhouse-operator --tail=150
kubectl -n clickhouse logs statefulset/clickhouse-keeper --tail=150

Yaygın nedenler:

  • ClickHouse imajı çekilemiyor
  • Keeper quorum sağlıklı değil
  • PVC'ler pending durumda
  • bootstrap job tamamlanmadı

NATS Hazır Değil

kubectl -n proxus-ha get pods -l app.kubernetes.io/name=hub-server
kubectl -n proxus-ha logs statefulset/hub-server --tail=150

Üç NATS podunun çalıştığını ve PVC'lerinin bound olduğunu kontrol edin.

Temizlik

Yalnızca test ortamı için:

kubectl delete -k ha
kubectl delete -k ha-data
warning
Veri silme riski

Namespace, PVC veya storage snapshot silmek production verisini kalıcı olarak silebilir. Test edilmiş geri dönüş planı ve onaylı bakım süreci olmadan production ortamda temizlik komutları çalıştırmayın.

Production Kontrol Listesi

Canlıya çıkmadan önce:

  • Çok node'lu Kubernetes cluster kullanın.
  • Storage class ve backup politikalarını doğrulayın.
  • Çok node'lu production için ortak UI volume'leri ve nats-hub-config üzerinde RWX destekli storage kullanın.
  • nats-credentials ve postgres-credentials Secret'larındaki varsayılan değerleri değiştirin.
  • Ingress TLS yapılandırın.
  • UI'ın http://<node-address>:30080/ veya ingress/load balancer üzerinden erişilebilir olduğunu doğrulayın.
  • Proxus lisansını aktive edin.
  • Her gateway deployment'ını singleton bırakın.
  • JetStream stream'lerinin üç replikalı çalıştığını doğrulayın (nats stream report çıktısında her stream R=3 görünmeli).
  • Pod Disruption Budget'ların node drain sırasında en az iki NATS pod'u ve bir UI pod'u erişilebilir tuttuğunu doğrulayın.
  • Prometheus'un 7777 portundaki NATS metrik uç noktasını topladığını doğrulayın.
  • UI failover testini yapın.
  • PostgreSQL failover testini yapın.
  • ClickHouse replica recovery testini yapın.
  • NATS pod recovery testini yapın.
  • Restore prosedürünüzü dokümante edin.
  • Pod sağlığı, storage kullanımı, database sağlığı ve uygulama loglarını izleyin.