准备工作
关闭控制节点和计算节点的安全组配置,修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件中配置为enable_security_group = false
下面以控制节点为例
[root@openstack1 ~]# grep -v '^#\|^$' /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[agent]
[linux_bridge]
physical_interface_mappings = default:eth1,external:eth2
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = false
[vxlan]
enable_vxlan = false
[root@openstack1 ~]# systemctl restart neutron-linuxbridge-agent.service
....做实验的过程中我们发现光重启服务是不行了,VIP还是不能ping通,最后我们在变更配置后重启了所有服务器,而且要注意各个云主机的selinux和iptables是否关闭,最好在各个云主机上都执行setenforce 0 && iptables -F


nova list
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
|
5e507e85-5410-4c30-91c2-276e990423c4 | keepalived+haproxy-vm-1 | ACTIVE | - | Running | vlan99=172.16.99.114; vlan809=192.168.9.111 |
|
d4ab2215-c0e0-4825-9a41-b84815de52d6 | keepalived+haproxy-vm-2 | ACTIVE | - | Running | vlan99=172.16.99.115; vlan809=192.168.9.107 |
| 457c1731-52b4-4e2a-838e-1b04b0637589 | web-vm-3 | ACTIVE | - | Running | vlan99=172.16.99.110; vlan809=192.168.9.102 |
| 3bb1f179-de99-4272-80ad-c1bd425750b5 | web-vm-4 | ACTIVE | - | Running | vlan99=172.16.99.111; vlan809=192.168.9.103 |
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
15.3:keepalived+haproxy VIP配置:
新创建两台虚拟机,本次一台虚拟机IP地址为 172.16.99.114主机名为bj-test-114,另外一台为 172.16.99.115主机名为bj-test-115
15.3.1:安装haproxy+keepalived:
[root@bj-test-114 ~]# yum install haproxy keepalived haproxy –y #IP地址为 172.16.99.114
[root@bj-test-115 ~]# yum install haproxy keepalived haproxy –y #IP地址为 172.16.99.115
15.3.3:关联VIP指定实例:
15.3.3.1:将VIP关连至安全组:
[root@node1 ~]# neutron port-create --fixed-ip ip_address=172.16.99.210 --security-group 安全组ID或者名称 网络ID或名称
[root@node1 ~]# neutron port-create --fixed-ip ip_address=172.16.99.210 --security-group 5bb5f2b1-9210-470f-a4a7-2715220b2920 5ac5c948-909f-47ff-beba-a2ffaf917c5f
[root@node1 ~]# openstack subnet list
+--------------------------------------+-------------+--------------------------------------+----------------+
| ID | Name | Network | Subnet |
+--------------------------------------+-------------+--------------------------------------+----------------+
| bbd536c6-a975-4841-8082-35b28de16ef0 | vlan99_sub |
5ac5c948-909f-47ff-beba-a2ffaf917c5f | 172.16.99.0/24 |
| ffc3c430-e551-4c78-be5e-52e6aaf1484d | vlan809_sub | 98f5d807-80e0-48a3-9f40-97eb6ed15f33 | 192.168.9.0/24 |
+--------------------------------------+-------------+--------------------------------------+----------------+
[root@node1 ~]# openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+---------+--------------------------------------+
|
5ac5c948-909f-47ff-beba-a2ffaf917c5f | vlan99 | bbd536c6-a975-4841-8082-35b28de16ef0 |
| 98f5d807-80e0-48a3-9f40-97eb6ed15f33 | vlan809 | ffc3c430-e551-4c78-be5e-52e6aaf1484d |
+--------------------------------------+---------+--------------------------------------+
[root@node1 ~]# openstack security group list
+--------------------------------------+-----------+------------------------+----------------------------------+
| ID | Name | Description | Project |
+--------------------------------------+-----------+------------------------+----------------------------------+
|
5bb5f2b1-9210-470f-a4a7-2715220b2920 | allow all | | 75aed7016c86445198356e78dddde4ba |
| cc779678-573e-4b06-aa60-9ac3d86dded0 | default | Default security group | 75aed7016c86445198356e78dddde4ba |
| dc241f97-0099-448f-8be4-8a41f1a6a806 | default | Default security group | 15897818eb0a42a382b75bbeefb14983 |
+--------------------------------------+-----------+------------------------+----------------------------------+






15.3.3.3:列出各实例的port ID:
[root@node1 ~]# openstack port list | grep 172.16.99.114
| 227caaa0-4421-44f3-8205-a6497404991e | | fa:16:3e:70:4f:38 | ip_address='172.16.99.114', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |


[root@node1 ~]# openstack port list | grep 172.16.99.115
|bbe39d0c-a961-4246-9238-a2fe5a6e4113 | | fa:16:3e:75:a7:c5 | ip_address='172.16.99.115', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |


[root@node1 ~]# openstack port list
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
| ID | Name | MAC Address | Fixed IP Addresses | Status |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
| 1160e836-afe5-4fb3-9180-52519a0a0c12 | | fa:16:3e:7c:6c:ac | ip_address='192.168.9.107', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 1b8ca8ce-8a5c-456c-a9c7-d18c234bd2e1 | | fa:16:3e:d3:90:3b | ip_address='192.168.9.102', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 227caaa0-4421-44f3-8205-a6497404991e | | fa:16:3e:70:4f:38 | ip_address='172.16.99.114', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| 37db309b-1904-4f9e-8a15-ea0fe22f3687 | | fa:16:3e:09:65:63 | ip_address='192.168.9.100', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 602c1c9b-9023-4ea2-a9b1-db1f0936afba | | fa:16:3e:9d:e6:5e | ip_address='192.168.9.103', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 6ccab393-d169-4117-9bdc-ac1b223d531f | | fa:16:3e:20:06:3e | ip_address='172.16.99.210', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | DOWN |
| 73fc7edc-39a5-4c48-988a-e007fc785d3d | | fa:16:3e:de:90:1c | ip_address='172.16.99.100', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| 77c530af-bdd0-4ce1-a183-a72e61b57fa1 | | fa:16:3e:aa:6b:e6 | ip_address='192.168.9.111', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| b655881f-d149-44fb-a42c-5060a904ae0c | | fa:16:3e:6f:24:f1 | ip_address='172.16.99.111', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| b6bcbadf-a5e6-47c6-b783-72842eb8c77d | | fa:16:3e:00:28:9d | ip_address='172.16.99.110', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| bbe39d0c-a961-4246-9238-a2fe5a6e4113 | | fa:16:3e:75:a7:c5 | ip_address='172.16.99.115', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
15.3.3.3:将VIP关联到实例:
[root@node1 ~]# neutron port-update 227caaa0-4421-44f3-8205-a6497404991e --allowed_address_pairs list=true type=dict ip_address=172.16.99.210
[root@node1 ~]# neutron port-update bbe39d0c-a961-4246-9238-a2fe5a6e4113 --allowed_address_pairs list=true type=dict ip_address=172.16.99.210
15.3.4:配置keepalived及组策略:
15.3.4.1:master配置:
[root@bj-test-114 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from
Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
interface eth0
virtual_router_id 1
priority 100
advert_int 1
virtual_ipaddress {
172.16.99.210
}
}
15.3.4.2:slave配置:
[root@bj-test-115 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
notification_email_from
Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
interface eth0
virtual_router_id 1
priority 50
advert_int 1
virtual_ipaddress {
172.16.99.210
}
}
15.3.5:配置安全组策略:
#keepalived给予vrrp协议进行报文的传播,需要在openstack组策略单独进行放开。
15.3.5.1:入口协议配置:
15.3.5.2:出口配置
15.3.5.3:最终状态:
15.3.6:启动keepalived并验证:
15.3.6.1:各实例启动keepalived:
[root@bj-test-114 ~]# systemctl start keepalived
[root@bj-test-114 ~]# systemctl enable keepalived
[root@bj-test-115 ~]# systemctl start keepalived
[root@bj-test-115 ~]# systemctl enable keepalived
15.3.6.2:验证VIP:
#master:


#backup:


15.3.6.3:验证VIP 通信:


15.3.6.4:验证VIP 切换:
#master停止VIP,在backup查看日志


15.3.7:haproxy配置:
15.3.7.1:配置haproxy:
[root@bj-test-114 ~]# cat /etc/haproxy/haproxy.cfg
global
maxconn 100000
uid 99
gid 99
daemon
nbproc 1
log 127.0.0.1 local0 info
defaults
option redispatch
option abortonclose
option http-keep-alive
option forwardfor
maxconn 100000
mode http
listen admin_stats
bind 0.0.0.0:1080
mode http
maxconn 10
stats refresh 30s
stats uri /stats
stats auth admin:admin
stats hide-version
#wen-port================================================================
frontend web
bind 172.16.99.210:80
mode http
default_backend web_http_nodes
backend web_http_nodes
mode http
balance roundrobin
server web1 172.16.99.110:8090 check inter 2000 fall 3 rise 5
server web2 172.16.99.111:8090 check inter 2000 fall 3 rise 5
15.3.7.2:配置内核参数:
各虚拟机配置允许监听非本地IP并开启转发
[root@bj-test-114 ~]# vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
[root@bj-test-115 ~]# sysctl -p
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
两台虚拟机分别安装haproxy,结合keepalived实现高可用负载均衡。
15.3.8:配置web服务:
再次新建两台虚拟机
172.16.99.110 web1
172.16.99.111 web2
15.3.8.1:安装web服务
[root@bj-test-110 ~]# yum install httpd –y
[root@bj-test-110 ~]# echo "172.16.99.110" > /var/www/html/index.html
[root@bj-test-110 ~]# sed -i 's/Listen 80/Listen 8090/g' /etc/httpd/conf/httpd.conf
[root@bj-test-110 ~]# systemctl start httpd
[root@bj-test-111 ~]# yum install haproxy httpd -y
[root@bj-test-111 ~]# echo " 172.16.99.111" > /var/www/html/index.html
[root@bj-test-111 ~]# sed -i 's/Listen 80/Listen 8090/g' /etc/httpd/conf/httpd.conf
[root@bj-test-111 ~]# systemctl start httpd
15.3.8.2:启动http并验证访问:
[root@bj-test-114 ~]# systemctl start httpd
[root@bj-test-115 ~]# systemctl start httpd






报错:一切正常,但是ping不通VIP,通过抓包定位到问题应该在虚机中,到虚机中排查发现iptables不知道什么时候多了一条防火墙规则,删除后恢复正常


扩展:关于底层本质(openstack将VIP关连至安全组和实例)
VIP关连至安全组
neutron port-create --fixed-ip ip_address=172.16.99.210 --security-group 安全组ID或者名称 网络ID或名称
neutron port-create --fixed-ip ip_address=172.16.99.210 --security-group 5bb5f2b1-9210-470f-a4a7-2715220b2920 5ac5c948-909f-47ff-beba-a2ffaf917c5f
15.3.3.3:将VIP关联到实例:
[root@node1 ~]# neutron port-update 227caaa0-4421-44f3-8205-a6497404991e --allowed_address_pairs list=true type=dict ip_address=172.16.99.210
[root@node1 ~]# neutron port-update bbe39d0c-a961-4246-9238-a2fe5a6e4113 --allowed_address_pairs list=true type=dict ip_address=172.16.99.210
底层原理剖析如下:
[root@node1 ~]# nova list
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
|
5e507e85-5410-4c30-91c2-276e990423c4 | keepalived+haproxy-vm-1 | ACTIVE | - | Running | vlan99=172.16.99.114; vlan809=192.168.9.111 |
|
d4ab2215-c0e0-4825-9a41-b84815de52d6 | keepalived+haproxy-vm-2 | ACTIVE | - | Running | vlan99=172.16.99.115; vlan809=192.168.9.107 |
| 457c1731-52b4-4e2a-838e-1b04b0637589 | web-vm-3 | ACTIVE | - | Running | vlan99=172.16.99.110; vlan809=192.168.9.102 |
| 3bb1f179-de99-4272-80ad-c1bd425750b5 | web-vm-4 | ACTIVE | - | Running | vlan99=172.16.99.111; vlan809=192.168.9.103 |
+--------------------------------------+-------------------------+--------+------------+-------------+---------------------------------------------+
[root@node4 ~]# virsh list --uuid --name
457c1731-52b4-4e2a-838e-1b04b0637589 instance-00000027
5e507e85-5410-4c30-91c2-276e990423c4 instance-00000023
[root@node4 ~]# virsh domiflist 5e507e85-5410-4c30-91c2-276e990423c4
Interface Type Source Model MAC
-------------------------------------------------------
tap227caaa0-44 bridge brq5ac5c948-90 virtio fa:16:3e:70:4f:38
tap77c530af-bd bridge brq98f5d807-80 virtio fa:16:3e:aa:6b:e6
[root@node4 ~]# ebtables-save | grep tap227caaa0-44
:neutronMAC-tap227caaa0-44 DROP
:neutronARP-tap227caaa0-44 DROP
-A PREROUTING -i tap227caaa0-44 -j neutronMAC-tap227caaa0-44
-A PREROUTING -p ARP -i tap227caaa0-44 -j neutronARP-tap227caaa0-44
-A neutronMAC-tap227caaa0-44 -i tap227caaa0-44 --among-src fa:16:3e:70:4f:38, -j RETURN
-A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.114 -j ACCEPT
-A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.210 -j ACCEPT

[root@node1 ~]# openstack port list
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
| ID | Name | MAC Address | Fixed IP Addresses | Status |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
| 1160e836-afe5-4fb3-9180-52519a0a0c12 | | fa:16:3e:7c:6c:ac | ip_address='192.168.9.107', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 1b8ca8ce-8a5c-456c-a9c7-d18c234bd2e1 | | fa:16:3e:d3:90:3b | ip_address='192.168.9.102', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 227caaa0-4421-44f3-8205-a6497404991e | | fa:16:3e:70:4f:38 | ip_address='172.16.99.114', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| 37db309b-1904-4f9e-8a15-ea0fe22f3687 | | fa:16:3e:09:65:63 | ip_address='192.168.9.100', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 602c1c9b-9023-4ea2-a9b1-db1f0936afba | | fa:16:3e:9d:e6:5e | ip_address='192.168.9.103', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| 73fc7edc-39a5-4c48-988a-e007fc785d3d | | fa:16:3e:de:90:1c | ip_address='172.16.99.100', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| 77c530af-bdd0-4ce1-a183-a72e61b57fa1 | | fa:16:3e:aa:6b:e6 | ip_address='192.168.9.111', subnet_id='ffc3c430-e551-4c78-be5e-52e6aaf1484d' | ACTIVE |
| b655881f-d149-44fb-a42c-5060a904ae0c | | fa:16:3e:6f:24:f1 | ip_address='172.16.99.111', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| b6bcbadf-a5e6-47c6-b783-72842eb8c77d | | fa:16:3e:00:28:9d | ip_address='172.16.99.110', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
| bbe39d0c-a961-4246-9238-a2fe5a6e4113 | | fa:16:3e:75:a7:c5 | ip_address='172.16.99.115', subnet_id='bbd536c6-a975-4841-8082-35b28de16ef0' | ACTIVE |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------+--------+
嗯,我们发现通过平台删除端口并没有什么用,不过是openstack port list中少了一个数据,VIP还是通的,于是我们直接删除ebtables规则,发现ping不通了,于是我们发现了openstack VIP底层的原理其实就是ebtables规则而已,
[root@node4 ~]#
ebtables -t nat -D neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.210 -j ACCEPT
[root@node4 ~]# ebtables-save | grep tap227caaa0-44
:neutronMAC-tap227caaa0-44 DROP
:neutronARP-tap227caaa0-44 DROP
-A PREROUTING -i tap227caaa0-44 -j neutronMAC-tap227caaa0-44
-A PREROUTING -p ARP -i tap227caaa0-44 -j neutronARP-tap227caaa0-44
-A neutronMAC-tap227caaa0-44 -i tap227caaa0-44 --among-src fa:16:3e:70:4f:38, -j RETURN
-A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.114 -j ACCEPT


于是我们尝试直接插入ebtables规则,发现可以恢复ping通
[root@node4 ~]# ebtables -t nat -A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.210 -j ACCEPT
[root@node4 ~]# ebtables-save | grep tap227caaa0-44
:neutronMAC-tap227caaa0-44 DROP
:neutronARP-tap227caaa0-44 DROP
-A PREROUTING -i tap227caaa0-44 -j neutronMAC-tap227caaa0-44
-A PREROUTING -p ARP -i tap227caaa0-44 -j neutronARP-tap227caaa0-44
-A neutronMAC-tap227caaa0-44 -i tap227caaa0-44 --among-src fa:16:3e:70:4f:38, -j RETURN
-A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.114 -j ACCEPT
-A neutronARP-tap227caaa0-44 -p ARP --arp-ip-src 172.16.99.210 -j ACCEPT


关于以前维护Zstack放开VIP访问的处理办法
[sys_admin@ph_ph_r730_6 ~]$ sudo ebtables-save | grep vnic10341
-A FORWARD -p IPv4 -i vnic10341.0 --ip-src 0.0.0.0 -j ACCEPT
-A FORWARD -p IPv4 -i vnic10341.0 --ip-src ! 45.113.33.6 -j DROP
[sys_admin@ph_ph_r730_6 ~]$ sudo ebtables -D FORWARD -p IPv4 -i vnic10341.0 --ip-src ! 45.113.33.6 -j DROP
作者:Dexter_Wang 工作岗位:某互联网公司资深云计算与存储工程师 联系邮箱:993852246@qq.com