您好,登錄后才能下訂單哦!
?【背景】
???????今年ipv6的事情再次提上議程,工信部一直在強推,不知道大家都開搞沒有?我們這邊收到的要求是這樣的:
????????一開始只是說Q4只要保證測試環境下主要業務功能可以在ipv6 環境下順利運作即可,突然就變成至少灰度10%的線上流量到ipv6環境
????????這段時間都在折騰ipv6 的事情,各種環境部署聯調什么的,翻閱不少資料,但網上關于這塊的資料實在太少了,環境部署期間踩過不少坑,這里簡單記錄下。
【部署】
lb-01 | lb-02 | rs-01 | rs-02 | vip | |
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 |
一、ospf
1、打開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
2、配置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?eth2 ! 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只需要指定哪些接口需要對外宣告即可
3、啟動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。
4、配置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
5、測試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地址,否則會返回網絡不可達
二、配置LVS
1、編譯安裝較新版本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
2、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
3、配置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
4、服務測試
在一臺擁有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%,需要靠后期不斷優化,總的來說任重道遠。
附:
1、IPV6環境測試網站
純ipv6環境請使用:http://ipv6.test-ipv6.com
雙棧環境請使用:http://www.test-ipv6.com/
2、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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。