# Kubernetes

> Proxus'u hazır manifestlerle Kubernetes'e kurun. Yerel, yüksek erişilebilirlikli ve veri çeşitleri, HA'nın kapsamı ve uygulama adımları.

Kaynak: https://proxus.io/tr/docs/operate/kubernetes

Bu kılavuzu tamamladığınızda Proxus, Kubernetes kümenizde çalışır. Test için tek kopya ya da yüksek erişilebilirlikli
(HA) bir kurulum seçebilirsiniz. Proxus'u çalıştırmanın standart yolu yine Docker Compose'dur. Tesis iş yüklerini
Kubernetes üzerinde çalıştırıyorsa bu kılavuzu kullanın.

## Başlamadan önce

- Bir Kubernetes kümesi ve bu kümeye erişebilen `kubectl` gerekir.
- Proxus 2.0.0 sürümündeki `Deployment/kubernetes` klasörünü hazır bulundurun.
- HA için en az üç düğüm, `ReadWriteMany` birim sunan bir depolama sınıfı, NGINX ingress denetleyicisi ve aşağıda
  adı geçen iki veritabanı operatörü gerekir.

## Çeşitler

| Klasör | Kurduğu bileşenler | Namespace |
| --- | --- | --- |
| `local/` | Docker Compose yığını gibi her hizmetten bir kopya. HA değildir; test ve geliştirme için kullanılır. | `proxus` |
| `ha/` | HA uygulaması: iki merkez sunucu kopyası, üç düğümlü NATS kümesi, her Edge Gateway için bir pod, Secret'lar, kesinti bütçeleri (PodDisruptionBudget) ve bir ingress. | `proxus-ha` |
| `ha-data/` | `ha/` için HA veritabanları: üç örnekli PostgreSQL kümesi (CloudNativePG) ve üç düğümlü Keeper ile çalışan iki kopyalı ClickHouse kümesi (Altinity operatörü). | `proxus-data`, `clickhouse` |
| `nats-trust/` | Diğer klasörlerin ortak kullandığı bölüm. NATS kimlik bilgilerini ve TLS sertifikasını bir kez oluşturur ve bir Secret olarak yayımlar. | (diğerlerine dahil) |

> **Uyarı:**
Klasörleri her zaman `kubectl apply -k <folder>` ile uygulayın. Manifestler namespace bilgisini klasördeki
`kustomization.yaml` dosyasından alır. Tek bir dosyayı `kubectl apply -f` ile uygularsanız kaynaklar yanlış
namespace'e kurulur.

## Yüksek erişilebilirliğin Proxus için anlamı

| Bileşen | `ha/` içindeki kurulum | Bir pod ya da düğüm çökerse |
| --- | --- | --- |
| Merkez sunucu (`proxus-ui`) | 2 kopya, aktif-aktif, yapışkan oturumlu (sticky session) bir ingress arkasında | Diğer kopya hizmet vermeye devam eder. Çöken kopyadaki kullanıcılar diğer kopyaya geçer; yeniden oturum açmaları gerekebilir. |
| NATS sunucusu (`hub-server`) | 3 düğümlü küme. Her akış üç düğümde de tutulur (`NATS__Replicas=3`). Sunucular birbirine pod adıyla, TLS üzerinden bağlanır (`6222` portu). | Bir pod çökse de mesaj kaybolmaz. |
| Edge Gateway (`proxus-server-gateway-1`) | Yalnızca 1 pod, `Recreate` stratejisi | Kubernetes podu yeniden başlatır. Pod ayağa kalkana kadar cihazlar okunmaz. |
| PostgreSQL | CloudNativePG'nin işlettiği 3 örnek | Operatör kopyalardan birini birincil sunucu yapar. |
| ClickHouse | 3 düğümlü Keeper ile 2 kopya | Sorgulara diğer kopya yanıt verir. |

Bir Edge Gateway hiçbir zaman iki kopya halinde çalışmaz. Aynı Edge Gateway kimliğine sahip iki pod, aynı cihazları iki kez
okur. Bu yüzden Edge Gateway deployment'larında `replicas` değerini 1'in üstüne çıkarmayın. Edge Gateway için yüksek
erişilebilirlik, ikinci bir kopya değil, hızlı yeniden başlatma anlamına gelir.

## `local/` ile deneyin

```bash
kubectl apply -k Deployment/kubernetes/local
kubectl -n proxus get pods,svc,pvc
kubectl -n proxus port-forward svc/proxus-ui 8080:8080
```

Ardından `http://localhost:8080` adresini açın. İlk başlatmada `hub-server` ve `proxus-server`,
`ContainerCreating` durumunda bekler. Merkez sunucu, NATS kimlik bilgilerini içeren
`proxus-nats-trust` Secret'ını oluşturunca bu podlar başlar. Bu bekleme normaldir. Merkez sunucu HTTPS'i `8443`
portundan da sunar.

Yerel çeşitte veritabanı parolaları manifestlerin içinde yazılıdır ve her bileşenin tek kopyası vardır. Bu çeşidi
üretimde kullanmayın. Birimleriyle birlikte kaldırmak için şu komutu çalıştırın:

```bash
kubectl delete -k Deployment/kubernetes/local
```

## HA çeşidini kurun

1. İki veritabanı operatörünü (CloudNativePG ve Altinity ClickHouse operatörü) kendi belgelerindeki adımlarla
   kurun. Test edilen sürümler `Deployment/kubernetes` klasöründeki README dosyasında yazılıdır.
2. Veritabanı parolalarını belirleyin. `ha/secrets.yaml` dosyasında `postgres-credentials` Secret'ının `user`,
   `password` ve `database` değerlerini değiştirin. Hazır dosyada üçü de `proxus`'tur. `ha-data/` içindeki
   PostgreSQL kümesine de aynı değerleri yazın ve oradaki ClickHouse kimlik bilgilerini de değiştirin.
3. Depolamayı kontrol edin. Merkez sunucu kopyaları farklı düğümlerde çalışacaksa `ha/storage.yaml` dosyasındaki
   ortak birimler (`proxus-ui-config-rwx`, `proxus-ui-modules-rwx`, `nats-hub-config`), bunu destekleyen bir
   depolama sınıfında `ReadWriteMany` olarak tanımlanmalıdır.
4. Sunucu adını girin. `ha/ingress-nginx-sticky.yaml` dosyasında `proxus.local` yerine kendi DNS adınızı yazın ve
   sertifika Secret'ınızı içeren bir `tls` bölümü ekleyin. Çerez benzeşimi (cookie affinity) ek açıklamalarını
   silmeyin. Bu ek açıklamalar her tarayıcıyı aynı merkez sunucu kopyasına yönlendirir.
5. `ha-data/` yerine bulut hizmeti olarak alınan ya da mevcut veritabanlarını kullanıyorsanız
   `ha/external-data-services.yaml` dosyasındaki iki ExternalName hizmetini bu veritabanlarına yönlendirin.

Ardından önce veri katmanını, sonra uygulamayı uygulayın:

```bash
kubectl apply -k Deployment/kubernetes/ha-data
kubectl apply -k Deployment/kubernetes/ha
```

Tüm bileşenlerin çalıştığını kontrol edin:

```bash
kubectl -n proxus-ha get pods,pdb,svc
```

İki `proxus-ui` podu, üç `hub-server` podu ve bir `proxus-server-gateway-1` podu `Running` durumunda olmalıdır.

Merkez sunucu, NATS kimlik bilgilerini ve TLS sertifikasını (`proxus-nats-trust` Secret'ı) ilk başlatmada
oluşturur. NATS sunucusuna yapılan her bağlantı TLS kullanır ve sunucu sertifikası platform CA'sına göre
doğrulanır. Merkez sunucu, sertifikanın süresi dolmadan yenisini üretir. Bu Secret'ı elle oluşturmayın,
düzenlemeyin.

Sertifika deposu anahtarı, merkez sunucunun ortak yapılandırma diskinde (`proxus-ui-config-rwx`)
`keys/STORE/certificate-store.key` dosyasında durur. Bu diski yedeklerken anahtar da yedeklenir. Dilerseniz
anahtarı kendi Secret'ınızdan `PROXUS_CERTIFICATE_STORE_KEY` ortam değişkeniyle de verebilirsiniz (32 baytlık bir
base64 değeri). Ayrıntılar için
[Sertifikalar](https://proxus.io/tr/docs/administer/certificates#deponun-özel-anahtarlarını-koruyun) sayfasına bakın.

> **Not:**
Manifestlerdeki imajlar `latest-arm64` etiketini kullanır. Düğümleriniz başka bir işlemci mimarisindeyse imaj
etiketlerini bu mimariye uygun Proxus imajlarıyla değiştirin. Bunun için hazır klasörü temel alan kendi
kustomization dosyanızda bir `images:` girdisi tanımlayabilirsiniz.

## Küme dışındaki Edge Gateway'leri bağlayın

Uzak Edge Gateway'ler NATS sunucusuna `7422` portundan bağlanır. Hazır manifestlerde `hub-server` hizmetine
yalnızca küme içinden ulaşılır. `7422` portunu Edge Gateway'lerin bulunduğu ağlara açın, örneğin bir `LoadBalancer`
hizmetiyle. [Edge Gateway kurarken](https://proxus.io/tr/docs/connect/edge-gateways/install-a-gateway) bu adresi kullanın. NATS
sunucusunun sertifikası, kurulum komutunun üretildiği her adresi kapsar. Edge Gateway'ler sunucuya başka bir adla
ulaşıyorsa bu adı `[NATS]` `TlsHostNames` ya da `[Service]` `PublicHostNames` ayarına ekleyin.

## Mevcut manifestlerin sınırları

- `ha-data/` içindeki ClickHouse kimlik bilgileri bir Secret'ta değil, doğrudan manifestte yazılıdır.
- Manifestlerde NetworkPolicy yoktur. Kümeniz varsayılan olarak tüm trafiği engelliyorsa (default-deny) kendi
  NetworkPolicy'nizi ekleyin.
- Kubernetes'te merkez sunucuya Docker soketi bağlanmaz. Bu yüzden **Yapılandırma düzenleyici** ekranındaki
  **Yeniden başlat** düğmesi bir şey yapmaz. Yeniden başlatmak için
  `kubectl -n proxus-ha rollout restart deployment/proxus-ui` komutunu kullanın.
- 2.0.0'a yükselttikten sonra, merkez sunucu başlayınca `hub-server` podlarını bir kez yeniden başlatın
  (`kubectl -n proxus-ha rollout restart statefulset/hub-server`). Ardından her uzak Edge Gateway'in kurulum komutunu
  yeniden çalıştırın. Ayrıntılar için [Yükseltme](https://proxus.io/tr/docs/operate/upgrade#200a-yükseltme) sayfasına bakın.
- Merkez sunucunun ve her Edge Gateway'in yapılandırma birimlerini yedekleyin. Ayrıntılar için
  [Yedekleme ve geri yükleme](https://proxus.io/tr/docs/operate/backup-and-restore) sayfasına bakın.

## Sonraki adımlar

- [Yükseltme](https://proxus.io/tr/docs/operate/upgrade): kümedeki imajları yeni sürüme geçirme.
- [İzleme](https://proxus.io/tr/docs/operate/monitoring): çalışma durumu denetimleri, metrikler ve günlükler.
- [Güvenlik](https://proxus.io/tr/docs/operate/security): portları, parolaları ve HTTPS'i üretime hazırlama.
