r3v3rs3'ü cluster içinde çalıştırın, proxy'leri Ingress ve R3v3rs3Proxy ile tanımlayın

Kubernetes'te r3v3rs3

r3v3rs3 cluster içinde bir ingress controller olarak çalışır. Kendi class'ındaki Ingress kaynaklarını ve R3v3rs3Proxy custom resource'larını okur, Service'lerinin hazır endpoint'lerini izler ve proxy'leri yaklaşık bir saniye içinde günceller.

Bu rehber r3v3rs3'ü kurar, bir proxy'yi Ingress ile, bir proxy'yi custom resource ile tanımlar ve ikisini de kontrol eder.

Bu rehberin uyguladığı üç manifest deponun deploy/kubernetes dizinindedir: rbac.yaml, crd.yaml ve deployment.yaml.

Başlamadan önce

Adım 1: Service account'u ve definition'ı kurun

$ kubectl apply -f deploy/kubernetes/rbac.yaml
$ kubectl apply -f deploy/kubernetes/crd.yaml
$ kubectl wait --for condition=established --timeout=60s crd/r3v3rs3proxies.r3v3rs3.io

rbac.yaml dosyası r3v3rs3 namespace'ini, service account'u ve beş kaynakta get, list, watch yapabilen bir ClusterRole'ü oluşturur: ingresses, services, secrets, endpointslices ve r3v3rs3proxies.

Provider yalnız kubernetes.io/tls tipindeki secret'ları okur, ama Kubernetes RBAC list iznini tipe göre sınırlayamaz. Bu yüzden role, namespace'lerdeki bütün secret'lara izin verir. Bunu daraltmak için Adım 3'te namespaces alanını doldurun ve ClusterRole yerine her namespace'te bir Role kullanın.

Adım 2: r3v3rs3'ü çalıştırın

$ kubectl apply -f deploy/kubernetes/deployment.yaml
$ kubectl -n r3v3rs3 rollout status deployment/r3v3rs3

Manifest /root/.config/r3v3rs3 için 1 Gi'lik bir PersistentVolumeClaim, tek replikalı ve Recreate stratejili bir Deployment ve 80 ile 443 portları için bir LoadBalancer Service oluşturur.

Deployment serviceAccountName: r3v3rs3 kullanır, bu yüzden provider'ın pod içinde kubeconfig'e ihtiyacı yoktur. Container image --webui 0.0.0.0:46492 ile başlar.

Panele, onu dışarı açmadan ulaşın:

$ kubectl -n r3v3rs3 port-forward deployment/r3v3rs3 46492:46492

http://localhost:46492/ adresini açın ve admin hesabını oluşturun:

$ kubectl -n r3v3rs3 exec deployment/r3v3rs3 -- r3v3rs3 add-user admin

Adım 3: Kubernetes provider'ını açın

  1. Menüde Ayarlar linkine tıklayın.
  2. Kubernetes Servis Keşfi bölümünü bulun ve Proxy'leri Kubernetes'ten oku seçeneğini açın.
  3. Kubeconfig Dosyası alanını boş bırakın. Pod kendi service account'unu kullanır.
  4. Ingress kaynaklarını oku ve R3v3rs3Proxy kaynaklarını oku seçeneklerini açın.
  5. Ingress Class alanına r3v3rs3 yazın.
  6. Varsayılan Portlar alanına http yazın.
  7. Kaydedin.
[discovery.kubernetes]
enabled = true
namespaces = []
ingress = true
crd = true
ingress_class = "r3v3rs3"
ports = ["http"]

R3v3rs3Proxy kaynaklarını oku seçeneği varsayılan olarak kapalıdır. Onu yalnız Adım 1'den sonra açın, çünkü provider cluster'ın tanımadığı bir kaynağı izleyemez.

Varsayılan Portlar, r3v3rs3.io/ports annotation'ı taşımayan bir Ingress'in r3v3rs3 portlarını yazar. Önce o portları bağlayın: discovery provider'ı hiç port açmaz. http adıyla 80 portunda bir HTTP portu, https adıyla 443 portunda bir TLS portu ekleyin. Böylece Deployment'ın container port'larıyla eşleşirler.

Adım 4: Ingress ile bir proxy tanımlayın

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami
  namespace: default
  annotations:
    r3v3rs3.io/ports: https
    r3v3rs3.io/rate_limit.requests: "100"
    r3v3rs3.io/rate_limit.per: minute
spec:
  ingressClassName: r3v3rs3
  tls:
    - hosts: [whoami.example.com]
      secretName: whoami-tls
  rules:
    - host: whoami.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  name: http

Adım 5: Custom resource ile bir proxy tanımlayın

Ingress yalnız HTTP'yi anlatır. R3v3rs3Proxy kaynağı proxy modelinin bütün alanlarını, TCP ve UDP dahil, ayarlar.

apiVersion: r3v3rs3.io/v1
kind: R3v3rs3Proxy
metadata:
  name: whoami
  namespace: default
spec:
  ports: [https]
  vhosts: [crd.example.com]
  routes:
    - path: /
      service:
        name: whoami
        port: http
---
apiVersion: r3v3rs3.io/v1
kind: R3v3rs3Proxy
metadata:
  name: postgres
  namespace: default
spec:
  protocol: tcp
  ports: [postgres]
  service:
    name: postgres
    port: 5432
$ kubectl get rproxy
NAME       AGE
whoami     20s
postgres   20s

Adım 6: Sonucu kontrol edin

Proxy'ler sayfası iki proxy'yi de kaynağı kubernetes olarak listeler ve düzenleme butonu göstermez, çünkü onların sahibi cluster'dır.

$ curl -b session.txt http://127.0.0.1:46492/api/discovery
[{"provider":"kubernetes","state":"running","proxies":2,"updated_at":1789643174}]

r3v3rs3'ün kullanamadığı bir kaynak proxy yerine issue olur. Sık görülenler:

IssueNedeni
port not foundIngress, var olmayan bir r3v3rs3 portunu yazıyordur. Portu Portlar sayfasında bağlayın.
Sunucusuz routeService yoktur, port adı yanlıştır veya hazır pod yoktur. Böyle bir route hata döndürür ve request başka bir route'a geçmez.
Eksik secretspec.tls, var olmayan bir secret'ı gösteriyordur ya da sertifikası veya key'i geçersizdir.

Bir Ingress'i sildiğinizde proxy'si kaybolur. Custom resource'lar proxy'lerini korur.

Nelere dikkat etmeli

Sonraki adımlar