Servis keşfi

Servis keşfi

Bir servis keşfi sağlayıcısı, dış sistemdeki proxy tanımlarını okur ve proxy listesine ekler. Bir tanım değişince r3v3rs3 route'ları yeniden başlatmadan günceller.

Bu sayfa referanstır. Docker etiketleriyle çalışan bir kurulum için Docker'dan proxy'ler rehberini izleyin.

Keşfedilen proxy'ler

Sağlayıcı durumu

Proxy listesi her sağlayıcının durumunu, eklediği proxy sayısını ve proxy olamayan tanımları gösterir. Yönetim API'si aynı veriyi GET /api/discovery adresinde döndürür.

DurumAnlamı
connectingSağlayıcı kaynaklarını henüz okumadı.
runningSağlayıcı kaynaklarını okudu ve değişiklikleri izliyor.
errorSağlayıcı kaynaklarını okuyamıyor. Son okumasındaki proxy'ler aktif kalır.

Deploy platformu çalışırken liste, deploy edilen uygulamaların proxy'lerini yayınlayan platform sağlayıcısını da içerir.

Her sorun, kaynağı ve sebebi gösterir, örneğin web-1: http.app: port not found: https.

Etiketler

Docker etiketleri, Consul etiketleri ve key-value kayıtları aynı key'leri kullanır. Her key şu biçimdedir:

r3v3rs3.<protocol>.<name>.<field>=<value>

Proxy key'leri

KeyDeğer
r3v3rs3.enableSağlayıcı her kaynağı okumuyorsa true kaynağı seçer. Başka her değer, örneğin false, kaynağı exposed_by_default = true iken de atlar.
portsZorunlu. Virgülle ayrılmış port adları veya port id'leri.
nameProxy listesindeki ad. Varsayılan değer <name> olur.
activefalse proxy'yi pasif olarak ekler. Varsayılan değer true olur.
portKaynağın adresindeki upstream sunucunun portu.
schemeHTTP proxy'nin port alanı için http veya https. Varsayılan değer http olur.
acmeHTTP proxy'nin vhosts alanı için sertifika alan ACME kaydının id'si. ACME sertifikaları bölümüne bakın.

Değerler

HTTP proxy'ler

port ve scheme, / yoluna tek sunuculu bir route tanımlar. routes ile birlikte kullanılamaz.

r3v3rs3.http.app.ports=https
r3v3rs3.http.app.vhosts=app.example.com
r3v3rs3.http.app.port=8080

Bir route da port ve scheme kullanabilir. Aynı route'un servers veya response alanıyla birlikte kullanılamaz.

r3v3rs3.http.app.ports=http,https
r3v3rs3.http.app.vhosts=app.example.com
r3v3rs3.http.app.routes.0.path=/
r3v3rs3.http.app.routes.0.port=8080
r3v3rs3.http.app.routes.1.path=/api
r3v3rs3.http.app.routes.1.port=9443
r3v3rs3.http.app.routes.1.scheme=https

Sunucuya açık bir URL ve ağırlık verilebilir:

r3v3rs3.http.app.routes.0.servers.0.url=http://10.0.0.5:8080
r3v3rs3.http.app.routes.0.servers.1.url=http://10.0.0.6:8080
r3v3rs3.http.app.routes.0.servers.1.weight=3
r3v3rs3.http.app.load_balancing=round_robin

Diğer alanlar yönetim API'sinin adlarını kullanır:

r3v3rs3.http.app.upgrade_insecure=true
r3v3rs3.http.app.ip_filter.allow=10.0.0.0/8,192.168.0.0/16
r3v3rs3.http.app.rate_limit.requests=100
r3v3rs3.http.app.rate_limit.per=minute
r3v3rs3.http.app.rate_limit.burst=20
r3v3rs3.http.app.timeouts.connect=3s
r3v3rs3.http.app.timeouts.request=30s
r3v3rs3.http.app.health_check.interval=10s
r3v3rs3.http.app.health_check.path=/healthz
r3v3rs3.http.app.compression.algorithms=br,gzip
r3v3rs3.http.app.cache.enabled=true
r3v3rs3.http.app.cache.default_ttl=1m
r3v3rs3.http.app.headers.response.0.action=set
r3v3rs3.http.app.headers.response.0.name=X-Frame-Options
r3v3rs3.http.app.headers.response.0.value=DENY
r3v3rs3.http.app.auth.type=basic
r3v3rs3.http.app.auth.realm=Staff
r3v3rs3.http.app.auth.users.0.username=alice
r3v3rs3.http.app.auth.users.0.password=change-me

r3v3rs3, proxy'yi kullanmadan önce düz metin password ve token değerlerini hash'e çevirir. Kaynak düz metin değeri tutmaya devam eder. Bu yüzden etiketlerde password_hash ve token_hash tercih edin.

TCP ve UDP proxy'ler

port, kaynağın adresinde tek bir upstream sunucu tanımlar. upstream_servers ile birlikte kullanılamaz.

r3v3rs3.tcp.db.ports=postgres
r3v3rs3.tcp.db.port=5432

r3v3rs3.udp.dns.ports=dns
r3v3rs3.udp.dns.upstream_servers.0.addr=/ip4/10.0.0.53/udp/53
r3v3rs3.udp.dns.session_idle_timeout=30s

ACME sertifikaları

acme, sertifika listesindeki mevcut bir ACME kaydını verir. r3v3rs3, kaydın hesabı, challenge'ı ve DNS sağlayıcısı ile proxy'nin virtual host'ları için sertifika alır.

r3v3rs3.http.app.ports=https
r3v3rs3.http.app.vhosts=app.example.com,www.example.com
r3v3rs3.http.app.port=8080
r3v3rs3.http.app.acme=abc-def

Docker

Docker sağlayıcısı, çalışan container'ların etiketlerini Docker Engine API ile okur. Container olaylarını izler. Başlayan, duran veya değişen bir container proxy'leri yaklaşık bir saniye içinde günceller.

Ayarlar

"Ayarlar" sayfasında "Docker Servis Keşfi" bölümünü doldurun veya config.toml dosyasını düzenleyin:

[discovery.docker]
enabled = true
endpoint = "unix:///var/run/docker.sock"
network = "proxy"
exposed_by_default = false
AyarAnlamı
enabledSağlayıcıyı başlatır.
endpointunix://<path>, tcp://<host>:<port>, http://<host>:<port> veya https://<host>:<port>. Varsayılan değer unix:///var/run/docker.sock olur.
client_certr3v3rs3'ün https endpoint'ine gönderdiği istemci sertifikasının id'si. Sunucu sertifikasını bir sistem kök sertifikası veya r3v3rs3'teki bir kök sertifika imzalamalıdır.
networkUpstream adreslerinin alındığı Docker ağı. Her container tek ağa bağlıysa boş bırakın. Bu ağda olmayan veya ayar boşken birden fazla ağa bağlı container sorun sayılır.
exposed_by_defaulttrue, r3v3rs3. etiketi olan her container'ı okur. false yalnız r3v3rs3.enable=true olan container'ları okur.

Ayar değişikliği yalnız sağlayıcıyı yeniden başlatır, sunucu yeniden başlamaz. Sağlayıcının proxy'leri ve sertifikaları hemen kaldırılır ve ilk okumasıyla geri gelir. Sağlayıcıyı kapatmak onları kaldırır. Sağlayıcının kullandığı sertifika silinemez.

Container'lar

Compose örneği

r3v3rs3 host'ta çalışır ve /var/run/docker.sock dosyasını okur. Compose dosyası etiketli container'ları taşır:

services:
  whoami:
    image: traefik/whoami
    networks: [proxy]
    labels:
      r3v3rs3.enable: "true"
      r3v3rs3.http.whoami.ports: http
      r3v3rs3.http.whoami.vhosts: whoami.example.com
      r3v3rs3.http.whoami.port: "80"

networks:
  proxy:
    name: proxy

"Portlar" sayfasında http adında bir port ekleyin, sağlayıcıyı proxy ağı ile açın ve servisi başlatın. Ağ name alanını vermezse Compose ağ adının başına proje adını ekler.

Docker socket erişimi Docker host'unun tam kontrolünü verir. Bu yetki root erişimine eşittir. :ro seçeneği yalnız socket dosyasına uygulanır ve API'yi salt okunur yapmaz. Yönetim paneline veya host'a güvenilmeyen ağlardan erişilebiliyorsa r3v3rs3'ü yalnız GET /containers/json ve GET /events isteklerine izin veren bir Docker socket proxy'sine bağlayın.

etcd

etcd sağlayıcısı, bir önekin altındaki key'leri etcd v3 HTTP API'si ile okur. Değişiklikleri bir watch stream'i ile izler. Değişen bir key proxy'leri yaklaşık bir saniye içinde günceller.

Ayarlar

"Ayarlar" sayfasında "etcd Servis Keşfi" bölümünü doldurun veya config.toml dosyasını düzenleyin:

[discovery.etcd]
enabled = true
endpoints = ["http://10.0.0.1:2379", "http://10.0.0.2:2379"]
username = "r3v3rs3"
password = "<password>"
prefix = "r3v3rs3"
AyarAnlamı
enabledSağlayıcıyı başlatır.
endpointsCluster üyelerinin HTTP API adresleri: http://<host>:<port>, https://<host>:<port> veya unix://<path>. Bağlantı başarısız olunca r3v3rs3 sıradaki adrese bağlanır. Varsayılan değer http://127.0.0.1:2379 olur.
client_certr3v3rs3'ün https endpoint'ine gönderdiği istemci sertifikasının id'si.
usernameetcd kimlik doğrulamasının kullanıcısı. Kimlik doğrulama kapalıysa boş bırakın.
passwordKullanıcının parolası. username ile birlikte verin.
prefixKey öneki. Varsayılan değer r3v3rs3 olur.

endpoints en az bir adres içermelidir ve prefix boş olamaz.

Yönetim API'si parolayı döndürmez. Kayıtlı bir parola varsa GET /api/config yanıtında password_set: true döner. password alanı olmayan bir PUT /api/config isteği kayıtlı parolayı korur. "password": "" parolayı siler. config.toml parolayı düz metin olarak saklar. Bu yüzden yapılandırma dizinini yalnız r3v3rs3 kullanıcısı okuyabilmelidir.

Kimlik doğrulama açıksa r3v3rs3 kullanıcı adı ve parola ile bir token alır. etcd süresi dolmuş bir token'ı reddedince r3v3rs3 yeni bir token alır ve isteği yeniden gönderir. Kullanıcının önek üzerinde okuma izni olan bir rolü olmalıdır:

etcdctl role add r3v3rs3-reader
etcdctl role grant-permission r3v3rs3-reader --prefix=true read r3v3rs3/
etcdctl user add r3v3rs3
etcdctl user grant-role r3v3rs3 r3v3rs3-reader

Key'ler

etcdctl put r3v3rs3/http/app/ports https
etcdctl put r3v3rs3/http/app/vhosts app.example.com
etcdctl put r3v3rs3/http/app/routes/0/servers/0/url http://10.0.0.5:8080