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
- Bir cluster ve çalışan bir
kubectl. - r3v3rs3'ün pod adreslerine ulaşması gerekir, bu yüzden onu bu rehberdeki gibi cluster içinde çalıştırın.
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
- Menüde Ayarlar linkine tıklayın.
- Kubernetes Servis Keşfi bölümünü bulun ve Proxy'leri Kubernetes'ten oku seçeneğini açın.
- Kubeconfig Dosyası alanını boş bırakın. Pod kendi service account'unu kullanır.
- Ingress kaynaklarını oku ve R3v3rs3Proxy kaynaklarını oku seçeneklerini açın.
- Ingress Class alanına
r3v3rs3yazın. - Varsayılan Portlar alanına
httpyazın. - 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
- Her host, o host'u virtual host olarak taşıyan bir HTTP proxy olur. Her path bir route olur. Proxy adı
<namespace>/<name> <host>biçimindedir. - Bir route'un sunucuları, Service port'unun hazır endpoint'leridir. Bunlar Service'in EndpointSlice'larından gelir. Hazır olan yeni bir pod yaklaşık bir saniye içinde katılır.
PrefixveImplementationSpecificpath'i ön ek olarak eşler. r3v3rs3'te tam eşleşme yoktur, bu yüzdenExactbir issue'dur ve o path route olmaz.- Diğer bütün proxy alanları
r3v3rs3.io/<alan>annotation'ı olarak çalışır.routes,vhosts,portveschemeIngress'in kendisinden gelir, bu yüzden onlar için yazılan bir annotation issue olur. - r3v3rs3,
spec.tlsalanındaki herkubernetes.io/tlssecret'ının sertifikasını sertifika listesine ekler. TLS portu onu server name ile seçer. r3v3rs3 böyle bir sertifikayı saklamaz; Ingress veya secret silinince sertifikayı da kaldırır.
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
spec.protocoldeğerihttp(varsayılan),tcpveyaudpolur.service, aynı namespace'teki bir Service'i gösterir. Onun hazır endpoint'leri bir HTTP route'unun sunucuları veya bir TCP ya da UDP proxy'sinin upstream sunucuları olur.serversveyaupstream_serversile birlikte kullanılamaz.- Varsayılan proxy adı
<namespace>/<name>biçimindedir. speciçindeki bir key.taşıyamaz.
$ 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:
| Issue | Nedeni |
|---|---|
port not found | Ingress, var olmayan bir r3v3rs3 portunu yazıyordur. Portu Portlar sayfasında bağlayın. |
| Sunucusuz route | Service 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 secret | spec.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
- Tek replika. Deployment
Recreatestratejisini ve ReadWriteOnce bir volume'ü kullanır, çünkü iki replika config'in iki kopyasını tutardı. Tek state'i paylaşan birkaç replika için cluster mode kullanın. - r3v3rs3 pod adreslerine ulaşabilmelidir. Cluster dışındaki bir r3v3rs3 kaynakları okur, ama endpoint'lere bağlanamaz.
- Provider hiç port açmaz. Her Ingress ve her custom resource var olan r3v3rs3 portlarını yazar.
Sonraki adımlar
- Kubernetes: bütün ayarlar, bütün annotation'lar ve RBAC manifest'i.
- Label'lar: annotation'ların ve
specalanlarının kullandığı alan adları. - Yüksek erişilebilirlik: tek bir state paylaşan birkaç node.