Linux Virtual Server

Konfiguracja reczna

  • Założenia:
    1. Mamy trzy maszyny wirtualne, które otrzymały od VMWare adresy DHCP - 192.168.47.128, 192.168.47.129, 192.168.47.130.
    2. Jedna maszyna będzie pełniła rolę serwera glownego - SG (adres zewnętrzny 192.168.47.129)
    3. Dwie maszyny będą pełniły rolę serwerów WWW - SW1 (adres zewnętrzny 192.168.47.128) i SW2 (adres zewnętrzny 192.168.47.130)
    4. SG to nasz Director (inne oznaczenia VS - virtual server/ VR - virtual ruter), a jego VIP to 192.168.47.128,
    5. SW1 i SW2 to RS (real servery), ich RIP1 i RIP2 to 192.168.1.100 i 192.168.1.200,
  • Konfiguracja LVS:
    1. Ustawiamy numery IP wewnetrzne na serwerach
    2. Ustaw na serwerze SG adres wewnętrzny 192.168.1.1, maska 255.255.255.0 (/24):
      root@asl244:~# ip a a 192.168.1.1/24 dev eth0 label eth0:1
      
      Ustaw na serwerze SW1 adres wewnętrzny 192.168.1.100, maska 255.255.255.0 (/24):
      root@asl244:~# ip a a 192.168.1.100/24 dev eth0 label eth0:1
      
      Ustaw na serwerze SW2 adres wewnętrzny 192.168.1.200, maska 255.255.255.0 (/24):
      root@asl244:~# ip a a 192.168.1.200/24 dev eth0 label eth0:1
      
    3. Instalujemy na serwerach niezbedne aplikacje
    4. Wykonaj na SG, SW1, SW2 aktualizację informacji o repozytoriach z oprogramowaniem:
      apt-get update
      
      Zainstaluj na SG program ipvsadm:
      apt-get install ipvsadm
      
      Zainstaluj na SW1 program apache2 oraz biblioteki php5:
      apt-get install apache2
      apt-get install php5 php5-mysql
      
      Zainstaluj na SW2 program apache2, biblioteki php5 oraz serwer mysql:
      apt-get install apache2
      apt-get install php5 php5-mysql
      apt-get install mysql-server
      
    5. Konfigurujemy interfejsy sieciowe na SG oraz dzialanie LVS
    6. Ustaw na SG (najlepiej utworz to w formie skryptu o nazwie lvs-rso.sh):
      echo "1" > /proc/sys/net/ipv4/ip_forward
      echo "0" > /proc/sys/net/ipv4/conf/all/send_redirects
      echo "0" > /proc/sys/net/ipv4/conf/default/send_redirects
      echo "0" > /proc/sys/net/ipv4/conf/eth0/send_redirects
      # IP_SG_ZEWN oznacza uzyskany od VMWARE dla interfejsu eth0  
      # sprawdzamy go np. poleceniem ip a s dev eth0 - linia "inet"
      # UWAGA 192.168.47.129 trzeba podmienić na adres zewnętrzny SG!. 
      IP_SG_ZEWN=192.168.47.129
      IP_SW1=192.168.1.100
      IP_SW2=192.168.1.200
      ipvsadm -A -t $IP_SG_ZEWN:www -s rr			
      ipvsadm -a -t $IP_SG_ZEWN:www -r $IP_SW1:www -m -w 1
      ipvsadm -a -t $IP_SG_ZEWN:www -r $IP_SW2:www -m -w 1
      ipvsadm
      
    7. Na serwerach tresci wylaczamy przekazywanie pakietow
    8. Ustaw na SW1 i SW2:
      echo "0" > /proc/sys/net/ipv4/ip_forward
      
    9. Na serwerach SW1 i SW2 strony www znajduja sie w /var/www/ - ustaw ich zawartosc tak by sie roznily, zeby sprawdzic czy klaster dziala..
      Jeśli niedostępny najpierw zainstaluj links: apt-get install links Na SG wykonaj kilkukrotnie polecenie (uwaga: 192.168.47.129 należy podmienić na swój adres zewnętrzny serwera głównego):
      links 192.168.47.129
      
      Uwaga: w powyższym przykładzie nie została skofigurowana pełna usługa dostępna z sieci zewnętrznej (można sprawdzić np. w przeglądarce wpisując adres zewnętrzny serwera SG: http://192.168.47.129). Do tego celu niezbędne jest wykonanie kroków poniżej.
    10. Testowanie z zewnętrznych sieci
      (Uwaga: w sieci zewnętrznej jest również maszyna na której uruchominy jest VMWare Player - posiadaja podsieć 192.168.47.0/24, czyli zewnętrzna sieć z której łączy się klient - CLI.)

      W celu obsługi ruchu z sieci zewnętrznych np. z przeglądarki WWW dostęnej w maszynie hostującej (tj. tej na której jest uruchomiony VMWare Player) należy wykonać kilka zmian.

      Na serwerach SW1 i SW2 sprawdzić jaki adres został nadany karcie sieciowej (eth0), poleceniem ip a, oraz jaki jest adres domyslnej bramy sieciowej. Realizujemy to na sw2 (należy zrobić również na SW1):
      
      root@asl-client2:~# ip a
      1: lo:  mtu 16436 qdisc noqueue state UNKNOWN
           link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
           inet 127.0.0.1/8 scope host lo
           inet6 ::1/128 scope host
                valid_lft forever preferred_lft forever
      2: eth0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
           link/ether 00:0c:29:f6:51:b5 brd ff:ff:ff:ff:ff:ff
           inet 192.168.1.200/24 brd 192.168.1.255 scope global eth0:1		#to jest adres na interfejsie eth0:1 nadany przez nas (wewnetrzny)
           inet 192.168.47.130/24 brd 192.168.47.255 scope global eth0		#to jest adres na interfejsie eth0 nadany przez dhcp vmware
           inet6 fe80::20c:29ff:fef6:51b5/64 scope link
                valid_lft forever preferred_lft forever
      root@asl-client2:~#
      root@asl-client2:~# ip r
      192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.200		#to jest trasa dodana przez interfejs eth0:1 (nasze - ip a a)
      192.168.47.0/24 dev eth0  proto kernel  scope link  src 192.168.47.130		#to jest trasa dodana przez interfejs eth0 z vmware
      default via 192.168.47.2 dev eth0						#domyślna brama sieciowa skonfigurowana przez dhcp vmware
      root@asl-client2:~#
      
      Powyżej poznaliśmy adres kart sieciowych (jest to 192.168.47.130), sprawdziliśmy jakie są wpisy w tablicy routingu (domyślna trasa rutingu przez 192.168.47.2).

      Chcemy by nasz serwer SW1 i SW2 komunikował się z sieciami zewnętrznymi korzystając z SG jako bramy (przy czym komunikacja SW-SG odbywa się po adresach IP lokalnych).

      W tym celu:
      Usuń domyślną brame sieciowa (ustawiona przez VMWare -uwaga 192.168.47.2 należy podmienić).
      root@asl-client2:~# ip r d default via 192.168.47.2				#usunięcie domyślej trasy rutingu
      root@asl-client2:~# ip r
      192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.132
      192.168.47.0/24 dev eth0  proto kernel  scope link  src 192.168.47.130
      root@asl-client2:~#
      
      dodaj domyslna bramem przez 192.168.1.129 (adres SG)
      root@asl-client2:~# ip r a default dev eth0 via 192.168.1.131			#dodanie domyślnej trasy rutingu przez podsieć wewnętrzną
      
      Usuń adres przydzielony do naszego serwera.
      root@asl-client2:~# ip a d 192.168.47.130/24 dev eth0				#usunięcie komunikacji maszyny SW2 z siecią zewnętrzną
      root@asl-client2:~#
      
      Serwer SG działa teraz jako domyślny ruter dla SW2.
      Zadanie:
      • zrealizuj analogiczna konfiguracje dla SW1.
      Konfiguracja ta nie zapewnia jeszcze NATowania adresów źródłowych komunikacji od SW1 do CLI, realizowanej przez SG (pamiętajmy klient wysłał pytanie HTTP do VIP i nie może otrzymać odpowiedzić na to pytanie od RIP1 lub RIP2).
    11. Zrealizujemy natowanie adresów źródłowych na serwerze SG:
      root@asl244:~# iptables -t nat --flush											#czyszczenie wpisów tablicy NAT
      root@asl244:~# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 0.0.0.0/0 -j SNAT --to-source 192.168.47.129	#dodanie regułki podmiany adresu źródłowego na 192.168.47.129 dla pakietów o adresie źródłowym 192.168.1.0/24 
      root@asl244:~# iptables -L -t nat -n											#sprawdzenie zawartości tablicy NAT
      Chain PREROUTING (policy ACCEPT)
      target     prot opt source               destination
      
      Chain POSTROUTING (policy ACCEPT)
      target     prot opt source               destination
      SNAT       all  --  192.168.1.0/24       0.0.0.0/24          to:192.168.47.129
      
      Chain OUTPUT (policy ACCEPT)
      target     prot opt source               destination
      root@asl244:~#
      
      Od teraz powinna działać komunikacja sieci zewnętrznej z naszym VIP na port 80.

UWAGA: konfiguracje wykonane powyżej są ulotne (tzn. po restarcie maszyny są nadpisywane).



Server keepalived - konfiguracja automatyczna

Usługa keepalived automatyzuje proces - sprawdza czy Real Servery są dostępne i jeśli tak konfiguruje lokalnie ipvsadm.

  • Instalujemy na SG paczke keepalived.
    apt-get install keepalived
    
    Keepalived bedzie automatyzowal dzialanie konfiguracji LVS.
  • W pliku /etc/keepalived/keepalived.conf
    global_defs {
    	notification_email {
    		kalkos@centuria.pl
    	}
    	notification_email_from keepalived@asl24.pl
    	smtp_server localhost
    	smtp_connect_timeout 30
    	lvs_id LVS_MAIN
    }
    
    
    virtual_server 192.168.47.129 80 {
    	delay_loop 30
    	#lb_algo wrr
    	lb_algo rr
    	lb_kind NAT
    	persistence_timeout 50
    	protocol TCP
    	sorry_server 150.254.78.2 80
    	real_server 192.168.1.100 80 {
    		weight 1
    		HTTP_GET {
    			url {
    				path /
    				digest 21dde95d9d269cbb2fa6560309dca40c
    			}
    			connect_timeout 3
    			nb_get_retry 3
    			delay_before_retry 2
    		}
    	}
    	real_server 192.168.1.200 80 {
    		weight 1
    		HTTP_GET {
    			url {
    				path /
    				digest a3e7e4327f095161ca14b98296a162c9
    			}
    			connect_timeout 3
    			nb_get_retry 3
    			delay_before_retry 2
    		}
    	}
    }
    
    Wartość digest możemy uzyskać łącząc się na port 80 odpowiedniego serwera i pobierając konkretną stronę (ścieżka: / podana również w konfiguracji keekaplived):
    root@asl244:~# genhash -s 192.168.1.100 -p 80 -u /
    MD5SUM = 21dde95d9d269cbb2fa6560309dca40c
    
    root@asl244:~# genhash -s 192.168.1.200 -p 80 -u /
    MD5SUM = a3e7e4327f095161ca14b98296a162c9
    
    root@asl244:~#