分享

如何在 UStack 上实现虚拟机高可用

xioaxu790 发表于 2014-10-27 19:57:21 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 14247
问题导读
1、如何验证高可用性呢?
2、在 UStack 上建立环境,需要哪些环节?
3、通过 什么来实现高级控制?






UStack 为所有用户提供可靠、安全的云服务,但是如果用户希望在其上实现更加高可用的虚拟机来保证一些关键业务,在 UStack 上也同样可以方便快捷的完成。
@陈沙克 在他的博客里曾讲述了如何在 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)。

1.jpg

两个节点都没有分配浮动 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。

1.png
2. 记录你的 User ID 和 Project ID:在 UOS 的 API中,每个用户都用其 User ID 和 Project ID 来做识别和资源的隔离,这两个 ID 可以将鼠标悬停在右上角后点击“个人设置”查看。

获得 Token

下面就可以进入 API 的操作了,首先获取一个 token:
  1. curl -i -X POST https://identity.api.ustack.com/v3/auth/tokens \
  2. -H "Content-Type: application/json" \
  3. -H "Accept: application/json" \
  4. -d '{"auth": {"scope": {"project": {"id": "{PROJECT_ID}"}}, "identity": {"password": {"user":{ "password": "{PASSWORD}", "id": "{USER_ID}"}}, "methods": ["password"]}}}'
复制代码



注意将里面的 {PROJECT_ID}、{PASSWORD}、{USER_ID} 替换成你自己的真实信息,下面的命令也做类似处理。
在终端运行后,我们可以获得一个 token:

1.png

图中第一个红框部分为我们输入的代码,第二个红框部分为我们获得的 Token,接下来每一步都需要用到这个 Token,请记住这个 Token。

将公网 IP 绑定到虚拟网卡

首先我们将前边的 Floating IP 绑定到 vrrp-port 上:
  1. curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/floatingips/{FLOATING_IP_UUID} \
  2. -H "X-Auth-Token: {TOKEN}" \
  3. -H "Content-Type: application/json" \
  4. -H "Accept: application/json" \
  5. -d '{"floatingip": {"port_id": "{VRRP-PORT-UUID}"}}'
复制代码



将其中的 {FLOATING_IP_UUID}、{TOKEN}、{VRRP-PORT-UUID} 换成我们前面查的真实的 UUID。

1.png

第一个红框内为运行的 curl 命令,第二个红框内可以看到“Fixed IP”已经成功变成 vrrp-port 的 IP 了。或者进入Ustack控制台 ,此时应能看到本来 “Available” 的公网 IP 此时已变成了 “In Use”

添加 Allowed address pairs

然后我们再添加 Allowed address pairs:
  1. curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/ports/{NODE-1-PORT-UUID} \
  2. -H "X-Auth-Token: {TOKEN}" \
  3. -H "Content-Type: application/json" \
  4. -H "Accept: application/json" \
  5. -d '{"port": {"allowed_address_pairs": [{"ip_address": "{VRRP-FLOATING-IP}"}]}}'
复制代码



将其中的 {NODE-1-PORT-UUID}、{TOKEN}、{VRRP-FLOATING-IP} 换成我们前面查的真实的 UUID。改完 Node-1 后同样处理 Node-2 即可。

1.png

第一个红框内为运行的 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:
  1. sudo apt-get install keepalive
复制代码



然后是 Master 节点的设置:
  1. $ cat /etc/keepalived/keepalived.conf
  2. vrrp_instance vrrp_group_1 {
  3.    state MASTER
  4.    interface eth0
  5.    virtual_router_id 1
  6.    priority 100
  7.    authentication {
  8.        auth_type PASS
  9.        auth_pass password
  10.    }
  11.    virtual_ipaddress {
  12.        10.10.0.200/24 brd 10.0.0.255 dev eth0
  13.    }
  14. }
复制代码



Slave 节点的设置:
  1. $ cat /etc/keepalived/keepalived.conf
  2. vrrp_instance vrrp_group_1 {
  3.     state BACKUP
  4.     interface eth0
  5.     virtual_router_id 1
  6.     priority 50
  7.     authentication {
  8.         auth_type PASS
  9.         auth_pass password
  10.     }
  11.     virtual_ipaddress {
  12.         10.10.0.200/24 brd 10.0.0.255 dev eth0
  13. }
复制代码



修改完配置后需要重启 keepalived:
  1. service keepalived restart
复制代码



配置 Apache

为了演示高可用,我们需要安装一个 Web 服务器,比如 Apache:
  1. sudo apt-get install apache2
复制代码



分别将两个虚拟机的主页设置成 “VRRP-node1″ 和 “VRRP-node2″:
  1. $ sudo echo "VRRP-node1" > /var/www/index.html
  2. $ sudo echo "VRRP-node2" > /var/www/index.html
复制代码



验证高可用

此时我们尝试访问 42.62.73.143:
  1. $ curl 42.62.73.143
  2. VRRP-node1
复制代码



现在我们让 VRRP-node1 的“虚拟网卡”转为关闭状态,这个可以通过设置虚拟网卡的 admin_state_up 来实现:
  1. curl -s -X PUT https://bj1.network.api.ustack.com/v2.0/ports/{NODE-1-PORT-UUID} \
  2. -H "X-Auth-Token: {TOKEN}" \
  3. -H "Content-Type: application/json" \
  4. -H "Accept: application/json" \
  5. -d '{"port": {"admin_stat_up": [{"ip_address": "false"}]}}'
复制代码



再尝试访问 42.62.73.143:
  1. $ curl 42.62.73.143
  2. VRRP-node2
复制代码



此时 respone 已由 VRRP-node2 来发出了。

实际上,keepalived 还有很多配置,比如检查指定端口等,具体可以查阅 keepalived 的文档:Keepalived for Linux

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条