deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Docker Engine 29.7, IPv6 yığını olmayan hostlarda Swarm overlay servislerini bozuyor

dev.to üzerindeki bir rapor, Docker Engine 29.7'den 29.8.2'ye kadar olan sürümlerin, IPv6 yığını bulunmayan hostlarda tüm Swarm overlay servislerinin sıfır çalışan task ile kalmasına neden olduğunu ve baytak seviyesinde bir çözüm bulunmadığını ortaya koyuyor.

Docker Engine 29.7, IPv6 yığını olmayan hostlarda Swarm overlay servislerini bozuyor

dev.to üzerindeki bir geliştirici raporuna göre Docker Engine 29.7, IPv6 yığıtı hiç bulunmayan hostlarda bir overlay ağına bağlı her Swarm servisinin sıfır çalışan task ile sonuçlanmasına yol açan bir regresyon getirdi. Bozulma, yazının yazıldığı sırada download.docker.com üzerinden edinilebilen en yeni statik build olan 29.8.2'de de devam ediyor.

Alexgeorgiev17 takma adıyla yazan yazar, bu hatayı aramıyordu. Daemon'un periyodik overlay ağ gossip trafiğini yaymasına dair küçük bir 29.8.0 changelog maddesini ölçmek için bir test düzeneği kurmuştu; henüz hiçbir şey ölçmeden, 29.8.2 üzerinde oluşturulan her overlay'e bağlı servis, istenen replica sayısı yerine 0 çalışan task ile geldi.

Sıfır replica, aynı komut

Engine 29.6.2'de temel davranış doğruydu: bir overlay ağında uyuyan bir Alpine container'dan yirmi replica talebi 20/20 çalışan task üretti ve yazar, container'ların içine girip overlay üzerinden ping atarak VXLAN tüneli üzerinden gerçek trafik aktığını doğruladı. 29.8.2'de ise aynı host ve image ile birebir aynı komut dizisi 0/5 döndü; docker service ps gerekçeyi şöyle açıklıyordu: "network sandbox join failed ... overlay: cannot determine address family of transport: the local data-plane address is not currently known".

Sürümleri hafızadan değil doğrudan karşılaştırmak için yazar, her engine'i — 29.6.2, 29.7.0, 29.7.2 ve 29.8.2 — kendi veri dizini ve Unix socket'i ile ayrı bir dockerd olarak çalıştırdı. Sonuçlar bozulmayı net biçimde daraltıyor: 29.6.2 çalışıyor; 29.7.0, 29.7.2 ve 29.8.0'dan 29.8.2'ye kadar olan sürümler aynı hatayla başarısız oluyor. Dolayısıyla regresyon 29.8'de yeni değil; son çalışan sürümün hemen ardından gelen 29.7.0'da ortaya çıkmış. Yazar tek bir commit'e kadar inmedi, ancak resmi 29.7.0 ve 29.8.0 sürüm notlarının bu aralıkta birkaç Swarm ağ değişikliği listelediğini, bunlardan birinin de service-mesh üzerinden yayınlanan portların yerel olarak yayınlanan portlarla altyapı paylaşmasına dair olduğunu ve bunun başarısız olan kod yoluna dokunduğunu belirtiyor.

Olmayan ihtimaller

İki makul açıklama elendi. İlk şüpheli bir VXLAN port çakışmasıydı; çünkü yan yana çalışan engine'lere farklı veri yolu portları verilmişti, ancak daha eski engine'in overlay'i tamamen kaldırıldıktan sonra 29.8.2 varsayılan UDP portu 4789 ile yeniden çalıştırıldığında hata birebir yeniden üretildi. İkinci ihtimal genel bir ağ bozulmasıydı: aynı 29.8.2 kurulumunda yayınlanmış bir portla basit bir docker run ile nginx sorunsuz çalıştı; yani bridge sürücüsü ve genel ağ yığını sağlıklıydı. Hata, Swarm overlay sürücüsünün VXLAN veri düzlemine özgü.

IPv6 korelasyonu

Hostun öne çıkan tek özelliği, IPv6 yığınının tamamen bulunmaması — devre dışı bırakılmamış, sadece yok; /proc/sys/net/ipv6 ve /proc/net/if_inet6 dosyaları bütünüyle eksik. Gönderiye göre 29.6.2 ve daha yeni engine'lerin tümü başlangıçta aynı IPv6 ile ilgili okuma hatalarını logluyor; fark, bir container bir overlay sandbox'ına katıldığında ortaya çıkıyor. 29.6.2 devam ediyor ve katılımı IPv4 üzerinden tamamlıyor; 29.7.0 ve sonrası ise görünüşe göre yanıt alamadıkları bir şey soruyor ve bunu ölümcül sayıyor.

Yazar buradaki sınırlar hakkında açık: overlay sürücüsünün kaynak kodunu okumadı, bu yüzden IPv6 yığınının yokluğu kanıtlanmış bir neden değil, yalnızca bir korelasyon; yine de hata metni adres ailesi tespitini doğrudan zikrediyor. Docker'ın kendi swarm ağ dokümantasyonu da soruyu iki yönden cevaplamıyor: hostlarda açık olması gereken portları listeliyor (overlay trafiği için 2377 TCP, 7946 TCP/UDP ve 4789 UDP) ve IPv6'nın gerekli ya da hariç tutulmuş olduğu konusunda hiçbir şey söylemiyor. Bu dokümantasyona göre aynı test, 29.8.2 üzerinde de tam olarak 29.6.2'deki gibi çalışmalıydı.

Baytak seviyesinde çözüm yok

Overlay ağını docker network create -d overlay --ipv6=false ile oluşturmak yardımcı olmadı; servis aynı hatayla yine 0/5 bildirdi. Yanlış giden şeyin neyse, ağ başına alınan IPv6 bayrağının altında yer alıyor ve yazar, IPv6'sız bir hostu yeniden çalıştıran belgelenmiş bir seçenek bulamadı.

Neden önemli

Çekirdekleri IPv6 olmadan derlenmiş hostlarda Swarm çalıştıran operatörler — bazı budanmış sanal makineleri ve minimal cihaz imajlarını kapsayan niş ama gerçek bir kategori — 29.7 veya sonrasına yükseltmeden sonra tüm overlay'e bağlı servislerin tek bir task bile planlamamasını görebilir ve elinde yalnızca anlaşılmayan bir scheduler hatası kalır. Docker'ın dokümantasyonu IPv6'yı ön koşul olarak listelemediğinden, bu değişiklik desteklenen yapılandırmalarda bir kayma değil, belgelenmemiş bir davranış bozulması olarak okunuyor. Upstream bir neden doğrulayana kadar bu rapordan çıkarılacak pratik ders, dağıtıma çıkmadan önce IPv6'sız bir host üzerinde tam yükseltme yolunu test etmek ve regresyonun yeniden üretildiği yerlerde 29.6.x'i sabit tutmaktır. Bu, kabul görmüş bir Docker hatası değil tek bir birinci elden anlatı; bu yüzden doğrulama beklenirken güçlü bir uyarı olarak ele almak en doğrusu.

  • #docker
  • #swarm
  • #containers
  • #networking
  • #cloud

İlgili yazılar