【背景】html
今年ipv6的事情再次提上議程,工信部一直在強推,不知道你們都開搞沒有?咱們這邊收到的要求是這樣的:
node
一開始只是說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