LVS+OSPF IPV6 部署

 【背景】html

       今年ipv6的事情再次提上議程,工信部一直在強推,不知道你們都開搞沒有?咱們這邊收到的要求是這樣的:
node


image.png


        一開始只是說Q4只要保證測試環境下主要業務功能能夠在ipv6 環境下順利運做便可,忽然就變成至少灰度10%的線上流量到ipv6環境ubuntu

        這段時間都在折騰ipv6 的事情,各類環境部署聯調什麼的,翻閱很多資料,但網上關於這塊的資料實在太少了,環境部署期間踩過很多坑,這裏簡單記錄下。c#


【部署】
bash



lb-01網絡

lb-02curl

rs-01tcp

rs-02ide

vipoop

ipv4

10.1.1.111

10.1.1.112

10.1.1.113

10.1.1.114

10.21.5.7

ipv6

240e:45e:1111:1ff::1

240e:45e:1111:1ff::2

240e:45e:1111:1ff::3

240e:45e:1111:1ff::4

240e:97d:1111:2ff::2



1、ospf

一、打開ospf6d進程監聽

ipv6環境下相比原來ipv4,須要額外打開ospf6d

root@node-01:/etc/quagga# cat  daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=yes
ripd=no
ripngd=no
isisd=no


二、配置ospf

root@node-01:/etc/quagga#  cat /etc/quagga/ospf6d.conf
!
! Zebra configuration saved from vty
!   2019/11/21 11:55:20
!
hostname ospf6d
password zebra
log stdout
log file /var/log/quagga/ospf6d.log
!
!

interface eth0
ipv6 ospf6 hello-interval 1
ipv6 ospf6 dead-interval 3
ipv6 ospf6 priority 0
ipv6 ospf6 instance-id 0

interface lo
ipv6 ospf6 hello-interval 1
ipv6 ospf6 dead-interval 3
ipv6 ospf6 priority 0
ipv6 ospf6 instance-id 0

router ospf6
 router-id 10.1.1.111
 interface eth0 area 0.0.0.0
 interface lo area 0.0.0.0
!
line vty


如下是ipv4的ospf 配置,能夠對比下配置之間的差別

!
! Zebra configuration saved from vty
!   2019/10/15 16:51:09
!
hostname ospfd
password zebra
log stdout
log file /var/log/quagga/ospf.log
!
!

interface eth0
!
ip ospf hello-interval 1
ip ospf dead-interval 3
ip ospf priority 0

interface eth1
!
ip ospf hello-interval 1
ip ospf dead-interval 3
ip ospf priority 0

!
router ospf
ospf router-id 10.1.1.111

network 10.21.5.7/32 area 0.0.0.0
network 10.1.1.0/24 area 0.0.0.0
!
line vty


注意事項:

  • log file 建議設置一個額外的日誌路徑,跟原來ipv4 ospfd 日誌分開打印,方便往後排查問題

  • router ospf 配置改爲router ospf6

  • ospf 進程id通常使用機器IP(保證惟一便可)

  • 還有一個最大的不一樣就是機器IP網段跟VIP不須要在router ospf 裏面宣告,ipv6只須要指定哪些接口須要對外宣告便可


三、啓動quagga

root@node-01:/etc/quagga# /etc/init.d/quagga restart
[ ok ] Restarting quagga (via systemctl): quagga.service.


啓動後會看到多watch 了一個ospf6d進程

root@node-01:/etc/quagga# ps aux|grep quagga
quagga   25820  0.0  0.0  24496   616 ?        Ss   15:15   0:00 /usr/lib/quagga/zebra --daemon -A 127.0.0.1
quagga   25824  0.0  0.0  26980  2732 ?        Ss   15:15   0:00 /usr/lib/quagga/ospfd --daemon -A 127.0.0.1
quagga   25828  0.0  0.0  24556   628 ?        Ss   15:15   0:00 /usr/lib/quagga/ospf6d --daemon -A ::1
root     25833  0.0  0.0  15428   168 ?        Ss   15:15   0:00 /usr/lib/quagga/watchquagga --daemon zebra ospfd ospf6d


telnet 本地2606 端口

root@node-01:/etc/quagga# telnet ::1 2606
Trying ::1...
Connected to ::1.
Escape character is '^]'.
Hello, this is Quagga (version 0.99.24.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
ospf6d> show ipv6 ospf6 neighbor
Neighbor ID     Pri    DeadTime  State/IfState         Duration I/F[State]
10.1.1.1   255    00:00:02   Full/DR              00:00:09 eth0[DROther]


注:這裏遇到一個坑,因爲咱們跑的是TUNNEL模式的LVS,須要將MTU設小,在ospf起來後,發現沒辦法跟交換機創建鄰居,交換機側日誌顯示須要將交換機接口MTU設成同樣的值(咱們的環境下是1440)

而ipv4 環境下交換機側並不須要設置MTU。


四、配置VIP

LB 上面啓動ipv6 vip

有兩種配置方式:(IPV6相關操做命令見文末)

方式一:

root@node01:/etc/quagga#  ip addr add 240E:97D:1111:2FF::2/64 dev lo:vip1 label lo:vip1


方式二:

root@node01:/etc/quagga#  /sbin/ifconfig lo:vip3 inet6 add 240E:97D:1111:2FF::2/64



五、測試ipv6 vip連通性

root@ubuntu:/usr/local/named/etc# ping6 240e:97d:1111:2ff::2 -c 3
PING 240e:97d:1111:2ff::2(240e:97d:1111:2ff::2) 56 data bytes
64 bytes from 240e:97d:1111:2ff::2: icmp_seq=1 ttl=51 time=28.4 ms
64 bytes from 240e:97d:1111:2ff::2: icmp_seq=2 ttl=51 time=28.4 ms
64 bytes from 240e:97d:1111:2ff::2: icmp_seq=3 ttl=51 time=28.3 ms


注意:

測試的機器必須也有ipv6地址,不然會返回網絡不可達


2、配置LVS

一、編譯安裝較新版本keepalived(這裏我編譯的是keepalived-2.0.18)

注:建議在 ubuntu16.04 以上版本環境下編譯,嘗試過在12.04 跟 14.04等低版本下ubuntu有些包找不到

root@ubuntu:/usr/local/src/keepalived-2.0.18# apt-get install libnftnl-dev libmnl-dev

root@ubuntu:/usr/local/src/keepalived-2.0.18# apt-get install iptables-dev libipset-dev libnl-3-dev libnl-genl-3-dev libssl-dev

root@ubuntu:/usr/local/src/keepalived-2.0.18# ./configure --prefix=/usr/local/keepalived

root@ubuntu:/usr/local/src/keepalived-2.0.18#  make && make install



二、keepalived配置

方式一:命令行

root@node-01:/etc/quagga# ipvsadm -A -t [240e:97d:2014:1ff::2]:80 -s rr
root@node-01:/etc/quagga# ipvsadm -a -t [240e:97d:2014:1ff::2]:80 -r 10.21.41.43:80 -i
root@node-01:/etc/quagga# ipvsadm -a -t [240e:97d:2014:1ff::2]:80 -r 10.21.41.44:80 -i



方式二:

virtual_server 240e:97d:1111:2ff::2 80 {
    delay_loop 6
    lb_algo  wrr
    lb_kind TUN
    persistence_timeout 0
    protocol TCP

    real_server 240e:45e:1111:1ff::3 80 {
        weight 10
        TCP_CHECK {
            connect_port 80
            connect_timeout 8
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 240e:45e:1111:1ff::4 80 {
        weight 10
        TCP_CHECK {
            connect_port 80
            connect_timeout 8
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


root@node-01:/etc/quagga# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=1048576)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  [240e:97d:1111:2ff::2]:80 rr
  -> [240e:45e:1111:1ff::3]:80    Tunnel  1      0          0         
  -> [240e:45e:1111:1ff::4]:80    Tunnel  1      0          0


三、配置RS VIP

LVS tunnel模式下,RS上面須要作2個事情,一個是起VIP,一個是跟LB間創建TUN隧道

root@node-03:~ # ip -6 tunnel add lvs6tun0 mode ip6ip6 local 240e:45e:1111:1ff::3 remote 240e:45e:1111:1ff::2 dev eth0
root@node-03:~ # ip link set dev lvs6tun0 up
root@node-03:~ # ip -6 addr add 240e:97d:1111:2ff::2/64 dev lvs6tun0


建立ipv6 tunnel 命令說明,因爲是點對點tunnel,這裏須要指明local 即本地RSIP,remote 對端IP,也就是LB的IP

ip -6 tunnel add lvs6tun0 mode ip6ip6 local $rs-ip remote $lb-ip dev $interface


點對點顧名思義就是每一個節點之間須要創建peer,n個LB節點,m個RS節點,最終須要創建 n * m 個tunnel


這裏跟ipv4 比較大的區別是,ipv6沒有廣播地址,沒辦法創建一個一對多的tunnel,只能基於ip6ip6協議創建一個點對點的tunnel,下面是ipv4環境下tunnel 建立的方式,能夠對比下:

/sbin/ifconfig tunl0 $vip broadcast $vip netmask 255.255.255.255 up
/sbin/route add -host $vip dev tunl0


四、服務測試

在一臺擁有ipv6 的機器上(不能是上述集羣中的機器),嘗試經過ipv6 vip 訪問

root@ubuntu:~ # for i in {0..999};do nc -6 -v -w 1 240e:97d:1111:2ff::2 80;done
Connection to 240e:97d:1111:2ff::2 80 port [tcp/http] succeeded!
Connection to 240e:97d:1111:2ff::2 80 port [tcp/http] succeeded!
Connection to 240e:97d:1111:2ff::2 80 port [tcp/http] succeeded!
... ...

root@ubuntu:~ # curl http://[240e:97d:1111:2ff::2]/ -H"Host:ipv6-test.aaa.com"
Test Page


至此,測試環境能夠正常通訊。


另外說明一點,測試的時候也驗證了LVS NAT/DR模式,均可以原生支持,不像TUNNEL 這麼麻煩,像DR模式,RS上配置個VIP上去就完事了。之因此沒采用DR,是由於DR模式存在LB跟RS必須在同個網段的限制,咱們生產環境沒法保證LB跟RS必定在同網段。而NAT性能較差,FullNAT 也有一部分業務在用,性能不是特別好,依賴nf_conntrack 表,最後選擇了TUNNEL模式。



注意:

部署過程當中ipv6 tunnel 的配置最費勁,嘗試過各類方式,都不行。現象是LB 給RS 發了SYN包,但收不到ACK, LB上鍊接處於一個SYNC_RECV狀態(經過ipvsadm -lnc 能夠看到鏈接狀態)

最後經過上面的點對點tunnel方式解決,暫時沒有其餘更合適的方式,後續發現了再更新下。

上述只是一個基本可用的測試環境,要正式上線的話還須要進行各類性能、參數調優才行。


ipv6 其實涉及的東西很是多,並不只僅只有上面提到的,還有DNS、GSLB、業務、網絡、CDN等等各個層面都會涉及相關的改造。測試的話能夠玩一玩,但正式上線仍是得謹慎,畢竟據我瞭解國內不少運營商對ipv6 支持還不是特別好,據上次跟阿里雲的同窗交流,在相同場景下,從ipv4 切到 ipv6 性能會降20%-40%,須要靠後期不斷優化,總的來講任重道遠。



附:

一、IPV6環境測試網站

純ipv6環境請使用:http://ipv6.test-ipv6.com

雙棧環境請使用:http://www.test-ipv6.com/


二、ipv6相關指令

http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch06s02.html

http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch07s02.html

http://tldp.org/HOWTO/Linux+IPv6-HOWTO/ch04s03.html

相關文章
相關標籤/搜索