etcd veya Consul ile yüksek erişilebilirlik

Cluster

Birden fazla r3v3rs3 node'u etcd'de veya Consul'un key-value store'unda tek bir state paylaşabilir. Her node aynı portlar, proxy'ler, erişim listeleri, sertifikalar, ACME kayıtları, admin hesapları ve ayarlarla trafik alır. Bir node'daki değişiklik restart olmadan diğer node'lara ulaşır.

Bu sayfa referanstır. Sıfırdan kuruyorsanız Yüksek erişilebilirlik sayfasını izleyin: store'un kurulumundan load balancer'a kadar bütün adımları anlatır.

Mimari

WebUI'daki Ayarlar sayfası node'un durumunu, rolünü ve uyguladığı revision'ı gösterir. GET /api/cluster/status aynı veriyi döner.

DurumAnlamı
disabledNode cluster store kullanmıyor.
syncingNode store'u ilk kez okuyor.
syncedNode store'daki değişiklikleri uyguluyor.
degradedNode store bağlantısını kaybetti. Son uygulanan state ile trafik alır ve değişiklikleri reddeder.

Cluster kurulumu

Bir cluster'ı dört komut kurar: r3v3rs3 cluster keygen encryption key'i yazar, config.toml dosyasındaki [cluster] bölümü her node'da store'u tanımlar, r3v3rs3 cluster import bir node'un dosyalarını boş bir prefix'e kopyalar ve r3v3rs3 start her node'u çalıştırır.

Yüksek erişilebilirlik sayfası her adımı komutlarıyla, store kurulumuyla, kimlik bilgileriyle ve load balancer ile birlikte anlatır.

Ayarlar

Bu alanları yalnız config.toml belirler.

AlanVarsayılanAçıklama
enabledfalseCluster'ı açar.
backendetcdetcd veya consul.
endpointsyokStore'un HTTP API adresleri: http://<host>:<port>, https://<host>:<port> veya unix://<path>. Bağlantı hatası bir sonraki adresi seçer.
username, passwordboşetcd kullanıcısı. Kullanıcı boşsa credential gönderilmez.
tokenyokConsul ACL token'ı.
datacenterboşConsul datacenter'ı. Boşsa agent'ın datacenter'ı kullanılır.
prefixr3v3rs3Cluster'ın her key'i <prefix>/v1/ ile başlar. Farklı prefix'lerle birden fazla cluster aynı store'u paylaşabilir.
node_nameyokNode'un adı. Zorunludur ve her node'un adı farklı olmalıdır.
tlsyokca_file store'u doğrular. Bu alan yoksa sistemin root sertifikaları store'u doğrular. cert_file ve key_file client sertifikası gönderir.
encryption_key_filesyokKey dosyaları. İlk key şifreler. Her key çözer.
lock_ttl15sLeader lock'unun ve node varlık kaydının TTL'i. etcd en az 1s, Consul en az 10s ister.
startup_timeout30sNode başlarken store için en uzun bekleme süresi.
rate_limit_sync_interval1sNode'un rate limit sayılarını yayınlama sıklığı. En düşük değer 100ms'dir.
share_cachefalseCache'lenen response'ları diğer node'lar için store'a yazar.
cache_max_value_size1048576Node'un diğer node'lar için store'a yazdığı en büyük cache'lenmiş response'un byte cinsinden boyutu.

Admin API password ve token değerlerini döndürmez.

Store'daki key'ler

Her key <prefix>/v1/ ile başlar.

KeyİçerikŞifreli
schemaVeri düzeninin sürümü. Import bu key'i en son yazar.hayır
state/configAyarlar.evet
state/ports/<id>Portlar.hayır
state/proxies/<id>Proxy'ler.evet
state/access-lists/<id>Parola hash'leri ve token digest'leriyle erişim listeleri.evet
state/certs/<kind>/<id>Sertifikalar ve private key'leri.evet
state/acme/<id>Account key'leri ve DNS provider credential'larıyla ACME kayıtları.evet
state/accounts/<hex ad>Admin hesapları.evet
state/cdnCDN IP aralıkları.hayır
state/challenges/http/<hex token>, state/challenges/tls-alpn/<hex domain>Her node'un sunduğu ACME challenge'ları. ACME sunucusu bu değerleri zaten yayınlar.hayır
state/cache-purges/<proxy id>Bir proxy'nin son cache purge zamanı.hayır
lock/leaderLeader'ın lease'ine bağlı leader lock'u.evet
nodes/<hex ad>Bir node'un lease'ine bağlı varlık kaydı.hayır
acks/<hex ad>Bir node'un sunduğu challenge'ların digest'i.hayır
sessions/<scope>/<token'ın SHA-256'sı>Admin ve proxy session'ları. Store hiçbir zaman token'ın kendisini tutmaz.evet
ratelimit/<hex ad>Bir node'un client IP adresleriyle rate limit sayıları.evet
cache/<proxy id>/<cache key'in SHA-256'sı>Paylaşılan bir cache'lenmiş response.evet
audit/<YYYY-MM-DD>/<Unix ms>-<rastgele>Gününün key'i altındaki bir audit log kaydı.evet
notifyWebhook'un aldığı sertifika olayları. Bu key'i yalnız leader yazar.evet

Şifreleme

Node her değeri yazmadan önce AES-256-GCM ile şifreler. Değerin KV key'i associated data olarak kullanılır. Bu yüzden başka bir key'e taşınan değer çözülmez. Şifreli değer, key'inin id'si ile başlar: key'in SHA-256 digest'inin ilk 8 byte'ı.

Bir key'i değiştirmek için:

  1. r3v3rs3 cluster keygen ile yeni bir key dosyası oluşturun.
  2. Yeni dosyayı encryption_key_files listesinin başına koyun ve eski dosyayı listede bırakın. Bunu her node'da yapın ve node'ları yeniden başlatın. Node key dosyalarını başlarken okur.
  3. Bir node'da r3v3rs3 cluster rekey --config-dir <dir> komutunu çalıştırın. Komut her değeri ilk key ile yeniden şifreler ve değiştirdiği değerleri raporlar.
  4. Eski dosyayı her node'da encryption_key_files listesinden çıkarın ve node'ları yeniden başlatın.

Store'u da koruyun. Şifreleme değerleri gizler, ama key adları portların, proxy'lerin ve sertifikaların id'lerini gösterir.

etcd izinleri

Node'ların kullanıcısı prefix'in altındaki key'leri okuyup yazabilmelidir:

$ etcdctl role add r3v3rs3
$ etcdctl role grant-permission --prefix=true r3v3rs3 readwrite r3v3rs3/
$ etcdctl user add r3v3rs3
$ etcdctl user grant-role r3v3rs3 r3v3rs3

Başka bir prefix kullanıyorsanız izni <prefix>/ için verin. etcd authentication token'ını iptal ederse node yeni bir token alır.

Consul izinleri

Node'ların token'ı prefix'in altındaki key'lere yazabilmeli ve session oluşturabilmelidir:

key_prefix "r3v3rs3/" {
  policy = "write"
}

session_prefix "" {
  policy = "write"
}
$ consul acl policy create -name r3v3rs3 -rules @r3v3rs3.hcl
$ consul acl token create -description "r3v3rs3 nodes" -policy-name r3v3rs3

make test-cluster-e2e hedefi node'ları tam olarak bu izinlerle çalıştırır.

Leader ve ACME

Leader, lock_ttl süreli bir lease ile lock/leader key'ini tutar. Lease'i her lock_ttl süresinde üç kez yeniler. Leader'ın bir store çağrısı en fazla lock_ttl süresinin üçte biri kadar bekler. Bu yüzden leader, lease'i store'da bitmeden leader'lığı bırakır. Leader dururken lock'u bırakır ve başka bir node bir sonraki kontrolünde leader olur.

HTTP-01 veya TLS-ALPN-01 challenge'ında leader challenge'ı store'a yazar. Her node challenge'ı sunar. Her node, sunduğu challenge'ların digest'ini acks/ altına yazar. Leader, var olan her node yeni challenge'ları bildirene kadar en fazla 10 saniye bekler. Sonra ACME sunucusundan doğrulama ister.

Hata durumları

Session'lar

Admin session'ları ve proxy authentication session'ları store'da durur. Bu yüzden bir node'un başlattığı session her node'da geçerlidir. Logout session'ı her node için siler. Node, session taşıyan her request için store'u okur. Store yoksa proxy session'ı geçersiz sayılır ve admin API 503 cluster_unavailable döner.

Rate limit doğruluğu

Node her request için store'u okumaz. Her node her client'ın request'lerini sayar. Her rate_limit_sync_interval sürede her limit için en yoğun 2048 client'ın sayılarını yayınlar. Node, diğer node'ların yeni sayılarını kendi sayılarına ekler. Üç interval'dan eski sayılar sayılmaz. Üç interval 2 saniyeden kısaysa sınır 2 saniyedir.

Paylaşılan cache

share_cache = true iken node, en az 60 saniye fresh kalan her cache'lenmiş response'u store'a yazmak için kuyruğa koyar. Node yazmayı beklemez. Yerel miss durumunda node store'u en fazla 100 milisaniye okur.

Saatler

Node'lar session süresi, rate limit pencereleri, rate limit sayılarının yeniliği ve paylaşılan response'ların süresi için Unix zamanlarını karşılaştırır. Node'ların saatlerini NTP ile senkron tutun. Saniyeler düzeyinde ileride veya geride olan bir saat rate limit kararlarını ve cache sürelerini değiştirir.