@陈沙克 在他的博客里曾讲述了如何在 UStack 上通过 API 使用 Allowed address pairs,这里我们将同样通过 Allowed address pairs 来实现 VRRP 完成虚拟机的高可用。
VRRP 全称虚拟路由器冗余协议,通过 VRRP 我们可以将一些虚拟机配成一个备份组,然后指定一个 master 节点,当 master 节点失效时,备份组将会根据 VRRP 协议进行选举,选举后一个 slave 节点将代替原失效的 master 节点对外提供服务,在提高可靠性的同时,简化了主机的配置,避免了单点故障,是常见的高可用方案。
实现 VRRP 协议,我们可以使用开源的 keepalived 软件,优点是配置简单,功能也颇为强大,下面我就以 keepalived 来实现一个简单的双机热备对外提供 HTTP 服务。
在 UStack 上建立环境
创建虚拟网络与云主机
首先我们建立一个 VRRP 用的网络和子网,且将其命名为 vrrp-net 和 vrrp-subnet(10.10.0.0/24),然后在上面建立两个虚拟机,我将其命名为 vrrp-node-1(10.10.0.4)和 vrrp-node-2(10.10.0.5)。
两个节点都没有分配浮动 IP,只是将其通过一个 router 连接到外网,为了能够 ssh 登录到这两个虚拟机,我们可以在路由器上设置转发规则,指向各自的 22 端口,方便我们管理。
创建公网IP和虚拟网卡
然后我们需要申请一个公网 IP 作为这两个虚拟机对外服务的出口 IP,当然,如果你的虚拟机不需要对外提供服务的话就不必申请公网 IP 了。
再在 vrrp-subnet 上新建一个虚拟网卡,只需要进入左侧边栏”虚拟数据中心”的“虚拟网卡”,再点击“新建虚拟网卡”,在“选择子网”里选择 vrrp-subnet,我们可以在这里指定一个 IP,比如 10.10.0.200,再指定一个名字,比如 vrrp-port。
通过 API 实现高级控制
下面我们需要将前面申请的公网 IP 关联到这个虚拟网卡上,这个操作我们目前不支持在界面上操作,需要用 API 完成,首先我们做一些准备工作。
准备工作
1. 记录 Floating IP 的 UUID、两个虚拟机上的虚拟网卡的 UUID 和 vrrp-port 的 UUID:Floating IP 的 UUID 可以在”公网 IP“页点开具体的 IP 即可看到,虚拟网卡的 UUID 则是在“虚拟数据中心”的“虚拟网卡”页里,通过“关联云主机”这一栏去查这个虚拟网卡属于哪个云主机,然后点击这个虚拟网卡,记录其 UUID。
2. 记录你的 User ID 和 Project ID:在 UOS 的 API中,每个用户都用其 User ID 和 Project ID 来做识别和资源的隔离,这两个 ID 可以将鼠标悬停在右上角后点击“个人设置”查看。
获得 Token
下面就可以进入 API 的操作了,首先获取一个 token:
curl -i -X POST https://identity.api.ustack.com/v3/auth/tokens \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"auth": {"scope": {"project": {"id": "{PROJECT_ID}"}}, "identity": {"password": {"user":{ "password": "{PASSWORD}", "id": "{USER_ID}"}}, "methods": ["password"]}}}'
复制代码
注意将里面的 {PROJECT_ID}、{PASSWORD}、{USER_ID} 替换成你自己的真实信息,下面的命令也做类似处理。
在终端运行后,我们可以获得一个 token:
图中第一个红框部分为我们输入的代码,第二个红框部分为我们获得的 Token,接下来每一步都需要用到这个 Token,请记住这个 Token。
将公网 IP 绑定到虚拟网卡
首先我们将前边的 Floating IP 绑定到 vrrp-port 上:
curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/floatingips/{FLOATING_IP_UUID} \
-H "X-Auth-Token: {TOKEN}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"floatingip": {"port_id": "{VRRP-PORT-UUID}"}}'
复制代码
将其中的 {FLOATING_IP_UUID}、{TOKEN}、{VRRP-PORT-UUID} 换成我们前面查的真实的 UUID。
第一个红框内为运行的 curl 命令,第二个红框内可以看到“Fixed IP”已经成功变成 vrrp-port 的 IP 了。或者进入Ustack控制台 ,此时应能看到本来 “Available” 的公网 IP 此时已变成了 “In Use”
添加 Allowed address pairs
然后我们再添加 Allowed address pairs:
curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/ports/{NODE-1-PORT-UUID} \
-H "X-Auth-Token: {TOKEN}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"port": {"allowed_address_pairs": [{"ip_address": "{VRRP-FLOATING-IP}"}]}}'
复制代码
将其中的 {NODE-1-PORT-UUID}、{TOKEN}、{VRRP-FLOATING-IP} 换成我们前面查的真实的 UUID。改完 Node-1 后同样处理 Node-2 即可。
第一个红框内为运行的 curl 命令,第二个红框内可以看到“allowed address pairs”已经成功变成了 vrrp-port 的 IP 了。
至此,UOS 上的准备就完成了,下面我们 ssh 到虚拟机去配置 keepalived。
配置虚拟机
配置 keepalived
keepalived 的配置可以做很多,他可以用来做3层及以上的高可用(TCP Check、HTTP Get、SSL Get、MISC Check), 参考 Keepalived 的 User Guide,里面详细介绍了 Keepalived 的使用方法。这里我们不做详细的 Health check,仅保证虚拟机连接正常,即当虚拟机网络断开时将流量切换到其他虚拟机。
首先在节点中安装 keepalived:
sudo apt-get install keepalive
复制代码
然后是 Master 节点的设置:
$ cat /etc/keepalived/keepalived.conf
vrrp_instance vrrp_group_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
10.10.0.200/24 brd 10.0.0.255 dev eth0
}
}
复制代码
Slave 节点的设置:
$ cat /etc/keepalived/keepalived.conf
vrrp_instance vrrp_group_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 50
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
10.10.0.200/24 brd 10.0.0.255 dev eth0
}
复制代码
修改完配置后需要重启 keepalived:
service keepalived restart
复制代码
配置 Apache
为了演示高可用,我们需要安装一个 Web 服务器,比如 Apache:
sudo apt-get install apache2
复制代码
分别将两个虚拟机的主页设置成 “VRRP-node1″ 和 “VRRP-node2″:
$ sudo echo "VRRP-node1" >/var/www/index.html
$ sudo echo "VRRP-node2" >/var/www/index.html
复制代码
验证高可用
此时我们尝试访问 42.62.73.143:
$ curl 42.62.73.143
VRRP-node1
复制代码
现在我们让 VRRP-node1 的“虚拟网卡”转为关闭状态,这个可以通过设置虚拟网卡的 admin_state_up 来实现:
curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/ports/{NODE-1-PORT-UUID} \
-H "X-Auth-Token: {TOKEN}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"port": {"admin_stat_up": [{"ip_address": "false"}]}}'
复制代码
再尝试访问 42.62.73.143:
$ curl 42.62.73.143
VRRP-node2
复制代码
此时 respone 已由 VRRP-node2 来发出了。
这个问题 我其实三个月前已经解决了,但是那云服务器内存实在太小,后来重新安装了一个centos镜像用了,但是没有可视化界面的确不好操作。因为那电脑是99买的学生优惠 1H2G内存。再装虚拟机就直接暴毙了,卡的要死。
不过装了CENTOS后还是很好用的,这点还是点个赞,对了我在华为买的。
说下重点的吧
坑一:双核以上包括双核的虚拟机,记住了创建虚拟机时候先选择256内存,单核,记住这个配置。不然肯定会报无法虚拟化。
坑二:请使用VMBOX这个软件,vmware就不要想了 啥版本都用不了。
坑三:启动不了要看看系统说明那里是不是显示kvm半架构,只要是这个就肯定能成功,只是你选的某些选项不对。
百度的都是一些物理机器然后不能安装,要你重启BIOS设置啥的,很明显,我们云服务器不存在这个东西。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)