
Merhabalar,
Bu makalemde, bana çokça danışılan bir konu olan network teaming konusunu özetleyerek aktarmak istiyorum. Bildiğiniz gibi teaming, hem yedeklilik hem de bant genişliğini arttırmak için kullanılan bir özellik. Fakat yine de tam olarak tanımını yaparak başlamak istiyorum…
Network teaming, daha yüksek verim veya yedeklilik sağlamak amacıyla, mantıksal bir arabirim oluşturmak için, network arabirimlerini birleştiren ve tek bir arabirim olarak kullanılmasını sağlayan özelliktir.

Network teaming oluşturma, paket akışlarının hızlı bir şekilde işlenmesinin yanı sıra, diğer görevler için kullanıcı alanı kitaplıkları ve hizmetleri uygulamak için bir çekirdek sürücüsü kullanır. Bu şekilde, network teaming oluşturma, yük dengeleme ve yedeklilik gereksinimleri için kolayca genişletilebilir ve ölçeklenebilir bir çözümdür.
Aşağıdakiler gibi farklı cihaz türlerinde network team’leri oluşturabilirsiniz:
- Fiziksel ve sanal ethernet aygıtları
- Network bond
- Network bridge
- VLAN aygıtları
NetworkManager hizmetini kullanarak, team’i yönetirken, sorun giderirken veya port arabirimlerini bağlarken, aşağıdaki varsayılan davranışları göz önünde bulundurmanız gerekmektedir.
- Denetleyici arabirimini başlatmak, port arabirimlerini otomatik olarak başlatmaz
- Bir port arabiriminin başlatılması, her zaman denetleyici arabirimini başlatır
- Denetleyici arabiriminin durdurulması, port arabirimini de durdurur
- Portları olmayan bir denetleyici, statik IP bağlantılarını başlatabilir
- Portları olmayan bir denetleyici, DHCP bağlantılarını başlatırken port bağlantılarını bekler
- Bir taşıyıcı ile port noktası eklediğinizde, DHCP bağlantısına sahip bir denetleyici, port noktalarının hazır olmasını bekler
- Bir taşıyıcı olmadan port noktası eklediğinizde, DHCP bağlantısına sahip bir denetleyici, port noktalarının hazır olmasını beklemeye devam eder
Teaming, genelde windows sistemler üzerinde telaffuz edilirken, linux sistemler için daha ziyade bonding kullanılır. Fakat nmtui ile network yönetim arayüzüne baktığınızda, linux için de team gibi seçenekler olduğunu göreceksiniz.
Teaming ile bonding arasındaki farkları da aşağıdaki tablodan görebilirsiniz.

teamd service, runners ve link-watchers temellerini anlama
Team servisi (teamd), team driver’ının bir örneğini kontrol eder. Bu driver örneği, bir network arabirimleri takımı (team) oluşturmak için, donanım aygıt sürücüsünün örneklerini ekler. Team sürücüsü çekirdeğe bir network arabirimi, örneğin team0 gibi bir arabirim sunar.
runners nedir?
Teamd hizmeti, tüm teaming oluşturma yöntemleri için ortak bir mantığı uygular. Bu işlevler, round-robin gibi farklı yük paylaşımı ve yedekleme yöntemlerine özgüdür ve runners (koşucular) olarak adlandırılan ayrı kod birimleri tarafından uygulanır.
Sistem yöneticileri, koşucuları JavaScript Object Notation (JSON) biçiminde belirtir ve JSON kodu, örnek oluşturulduğunda, bir teamd örneğinde derlenir. Alternatif olarak, NetworkManager’ı kullanırken, koşucuyu team.runner parametresinde ayarlayabilirsiniz. Böylece NetworkManager, karşılık gelen JSON kodunu otomatik olarak oluşturur.
Kullanılabilecek runners çeşitleri (koşucular) şunlardır:
- broadcast : Verileri, tüm bağlantı noktaları (portlar) üzerinden iletir
- roundrobin : Verileri, sırayla tüm bağlantı noktaları üzerinden iletir
- activebackup : Diğerleri yedek olarak tutulurken, verileri sadece bir bağlantı noktası üzerinden iletir
- loadbalance : Etkin Tx yük dengeleme ve Berkeley Packet Filter (BPF) tabanlı Tx bağlantı noktası seçicilerle, var olan tüm portlar üzerinden veri iletilir
- random : Verileri, rastgele seçilen bir bağlantı noktasından iletir
- Lacp : 802.3ad Link Aggregation Control Protocol (LACP) uygular
link-watchers nedir?
Teamd hizmetleri, alt cihazların durumunu izlemek için bir bağlantı izleyici kullanır. Bunlara link-watchers nedir.
Aşağıdaki bağlantı izleyicileri kullanılmaktadır:
- ethtool : Bağlantı durumu değişikliklerini izlemek için ethtool yardımcı programını kullanır. Bu, varsayılan bağlantı izleyicisidir
- arp_ping : Address Resolution Protocol (ARP) kullanarak, bir uzak uç donanım adresinin varlığını izlemek için arp_ping yardımcı programını kullanır
- nsna_ping : IPv6 bağlantılarında libteam kitaplığı, bir komşunun arayüzünün varlığını izlemek için IPv6 Neighbor Discovery (Komşu Bulma) protokolünden, Komşu Bildirimi ve Komşu Talep özelliklerini kullanır.
NOT:
Her koşucu, LACP haricinde herhangi bir bağlantı izleyicisini kullanabilir. LACP yalnızca, ethtool bağlantı izleyicisini kullanabilir.
Linux Network Teaming Konfigürasyonu Nasıl yapılır?
Öncelikle, ortamda kullandığım arabirimlere ait özelliklere bakalım. Ben bu konfigürasyonları, hemen hemen tüm linux sistemlerde kullanabileceğiniz şekilde, çok fazla teoriye boğmadan aktarmaya çalışacağım.
Sunucu : RedHat Enterprise Linux Server 8
Ethernet arayüzleri : ens160 ve ens224
IP adreslerini görmek istersek;
ip a

Bir teaming yapılandırırken, aşağıdaki syntax ile bu arayüzü oluşturuyoruz.
nmcli con add type team con-name CNAME ifname INAME [config JSON]
CNAME: Bağlantıya atıfta bulunmak için kullanılan profil adı olacaktır,
INAME: team arayüz adı olacaktır. örneğin team0
JSON: kullanılacak (runner) koşucuyu belirtir.
JSON aşağıdaki sözdizimine sahiptir:
‘{“runner”:{“name”:”METHOD”}}’
METHOD ise, yukarıda da bahsettiğimiz gibi aşağıdakilerden herhangi biridir:
- broadcast
- roundrobin
- activebackup
- loadbalance
- lacp
nmcli ile Team arayüzü bağlantı profilini oluşturuyoruz
Şimdi isleyenteam profil ismi ve team0 teaming isminde olacak bir teaming arabirimi oluşturalım. Team modu roundrobin olacak ve ethtool bağlantı izleme kullanılacaktır.
Benim yapımda, teaming IP ve network bilgileri aşağıdaki şekilde olacaktır.
IP : 20.20.20.200
Subnet Mask : /32
Gateway : 20.20.20.1
Static IP adresiyle oluşturmak istersek;
nmcli connection add type team con-name isleyenteam ifname team0 config ‘{“runner”: {“name”: “roundrobin”}, “link_watch”: {“name”: “ethtool”}}’ ip4 20.20.20.200/32 gw4 20.20.20.1

Yukarıdaki komutu uyguladıktan sonra örnek yapılandırma dosyam aşağıdaki gibi oldu.
cat /etc/sysconfig/network-scripts/ifcfg-isleyenteam

DHCP’den otomatik IP adresiyle oluşturmak istersek;
nmcli connection add type team con-name myteam ifname team0 config ‘{“runner”: {“name”: “roundrobin”}, “link_watch”: {“name”: “ethtool”}}’
Port arabirimlerinin atamasını yapıyoruz
Tüm slave team portları için, port profilleri oluşturuyoruz. Team altında, kaç tane ethernet kartı varsa, her biri için bu şekilde tanım yapmanız gerekiyor.
ens160 ve ens224 için oluşturacağız.
nmcli connection add type team-slave con-name isleyenteam-port1 ifname ens160 master team0
nmcli connection add type team-slave con-name isleyenteam-port2 ifname ens224 master team0

Böylece, bu team altında ens160 ve ens224 bileşenleri, şu profil isimleriyle olacaktır demiş olduk.
Slave’ler için örnek konfigürasyon dosyalarımız da şu şekilde oluşturuldu.
cat /etc/sysconfig/network-scripts/ifcfg-isleyenteam-port1

cat /etc/sysconfig/network-scripts/ifcfg-isleyenteam-port2

Değişikliklerimizin doğrulamasını yapalım…
ifconfig team0

Herhangi bir sunucu ya da PC’den, team0 arabirimine ping atalım ve bu arabirimin ulaşılabilir olup olmadığını kontrol edelim.
ping 20.20.20.200

Team’in, teamdctl programıyla beklendiği gibi çalıştığını doğrulayalım. En azından, doğru runner’ın kullanımda olduğundan emin olalım. Aksi durumda, bağlantımız çalışmayabilir.
teamdctl team0 state

Bakınız roundrobin çalıştığını görüyoruz.
Tüm bağlantı durumlarını görmek için aşağıdaki komutu kullanabiliriz.
nmcli con show

Team yapılandırmak için yapacağımız tüm işlemlerimiz bu kadar. Şimdi test zamanı 🙂
VMware workstation üzerinde bu çalışmayı yapıyordum. Sanal sunucunuzun ayarlarına girip, sırasıyla network kartını disable/enable ederek bu testleri yapabilirsiniz. Öncelikle, ens160’a karşılık gelen ethernet kartımı disable edeceğim.
Disable etmeden önce, team IP adresine ping -t parametresiyle sürekli ping komutunu çalıştırın. Böylece bağlantının kopup kopmayacağını da görebiliriz.

Bağlantım kopmadı. Fakat, tam disable ettiğim zamanda TTL süresinde bir artış oldu. Bağlantı hala sağlam durumda. Yani işlem başarılı görünüyor…

ens160 ethernet kartımızın down durumda olduğunu da görebiliyoruz.

Diğer ethernet kartımızın testi öncesinde, ens160 kartımızı, sanal sunucu özelliklerinden tekrar aktif hale getiriyoruz.

Şimdi sıra, ikinci network kartımız olan ens224’e karşılık gelen network kartını disable etmede…

ens224 down duruma geldi.

Ping kaybı yine yok. Fakat tam disable ettiğim zamanda, yine TTL değerinde biraz yükseliş meydana geldi. Bağlantımızda problem yaşamadık…

Bağlantı durumuna tekrar bakabiliriz.

Runner değiştirmek istersek ne yapmalıyız?
Eğer roundrobin olacak şekilde çalıştırmak istemezseniz, mevcut runner durumunu değiştirebilirsiniz. Sonuçta artık team profili elimizde varsa ve her config için bir dosya oluşturuluyorsa, bu runner’ı değiştirmek çok kolay değil mi? 🙂
Aşağıdaki komutla ilgili config dosyasını açıyoruz.
nano /etc/sysconfig/network-scripts/ifcfg-isleyenteam

roundrobin yazan yere, örneğin activebackup yazıyoruz. Sonrasında kaydedip çıkıyoruz.

Aşağıdaki komutla da, team yapımızın son durumunu görelim.
teamdctl team0 state

Bakınız artık mevcut team, activebackup olacak şekilde kullanılıyor. Yani veriler sadece tek ethernet kartı üzerinden gönderiliyor. Bu kart arıza yaparsa ya da devre dışı kalırsa diğer karta geçiş yapılıyor. Şu anda aktif olan ve veri transferi sağlayan ethernet kartının ens224 olduğunu da bu çıktıdan görmekteyiz.
Son olarak da şunu eklemek istiyorum: Kaç tane ethernet kartı kullanıyorsanız, bunların fiziksel olarak bağlı oldukları switch üzerinde de o portların tek port olarak işlem görmesini sağlamak üzere, konfigürasyonu düzenlemeniz gerekmektedir. Özellikle fiziksel sunucular üzerinde teaming yapacaksanız, her ethernet kartı, fiziksel switch’in bir portuna bağlı olacaktır.
Linux üzerinde team oluşturma adımlarımız, en basit haliyle bu adımlardan ibarettir. Elbette ki daha ileri seviye ayarlar ve konfigleri var. Fakat giriş makalesi olarak, şimdilik bunlar gayet yeterli olacaktır. Bu konuyla ilgili daha detaylı makaleleri, ilerleyen zamanlarda da paylaşmaya devam edeceğim.
Yararlı olması dileğiyle.
Yusuf İşleyen