如何使用DigitalOcean负载平衡器使用Doctl

DigitalOcean负载平衡器是在多个后端服务器之间分发HTTP,HTTPS和TCP流量的简单方法。在本教程中,我们将使用doctl - DigitalOcean API的官方命令行客户端来创建和配置多个...的负载均衡器

介绍

DigitalOcean负载平衡器是在多个后端服务器之间分发HTTP,HTTPS和TCP流量的简单方法。 在本教程中,我们将使用doctl (DigitalOcean API的官方命令行客户端)为多个后端Web服务器创建和配置负载均衡器。

先决条件

在开始本教程之前,您应该熟悉doctl和DigitalOcean负载平衡器。 以下文章将会有所帮助:

您应该确保在继续之前安装并验证了doctl 1.6.0或更高版本。 通过运行doctl version来检查你的doctl version 您还需要在您的DigitalOcean帐户中添加一个SSH密钥。

第1步 - 设置后端Web服务器

首先,我们将使用doctl创建我们的负载均衡器将引导流量的两个Web服务器。 我们将从预装有LAMP(Linux,Apache,MySQL,PHP)的两台服务器开始,并将它们更新为每个服务器提供唯一的网页。 这将有助于我们验证负载平衡器确实在多个服务器之间分配连接。

为了创建两个服务器,我们首先需要知道我们想要的区域,以及要使用的SSH密钥的指纹。 本教程将使用nyc1区域。 您可以使用doctl列出所有地区及其缩短的doctl

doctl compute region list
Slug    Name               Available
nyc1    New York 1         true
sfo1    San Francisco 1    true
nyc2    New York 2         true
ams2    Amsterdam 2        true
sgp1    Singapore 1        true
lon1    London 1           true
nyc3    New York 3         true
ams3    Amsterdam 3        true
fra1    Frankfurt 1        true
tor1    Toronto 1          true
sfo2    San Francisco 2    true
blr1    Bangalore 1        true

选择您要使用的区域的s。。

注意:您的负载平衡器及其目标Droplet必须位于同一区域。

要找到您的SSH密钥指纹,再次使用doctl

doctl compute ssh-key list
ID         Name          FingerPrint
7738555    sammy@host    your_ssh_key_fingerprint

在输出中,记下要使用的SSH密钥的指纹。 我们需要下一个命令。

我们将使用运行Ubuntu 16.04的一键式LAMP映像,我们将把它放在512mb的Droplet上。 使用list命令,可以使用doctl列出图像和Droplet大小的不同选项。 您可以在Prequisite文章的“ 创建,删除和检查Droplet”部分阅读更多信息。

现在我们有了所有的信息,我们可以在一个命令中创建两个服务器:

doctl compute droplet create web-1 web-2 \
    --region nyc1 \
    --image lamp-16-04 \
    --ssh-keys your_ssh_key_fingerprint \
    --enable-private-networking \
    --size 512mb

web-1web-2将是服务器的名称。 我们还选择了--enable-private-networking 这将确保从负载平衡器到目标Droplet的流量将保留在DigitalOcean的未计量的专用网络上。

create命令将输出有关新的Droplet的信息:

ID          Name     Public IPv4    Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48463543    web-1                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new
48463544    web-2                                                  512       1        20      nyc1      Ubuntu LAMP on 16.04    new

我们的两台服务器现在正在供应。 等待几分钟的时间完成,然后列出你的网络Droplet:

doctl compute droplet list web-*

list命令接受*通配符。 在这种情况下,我们只会以他们的名字显示至少web-的“Droplet”:

ID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111     111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

注意,Droplet现在已经分配了IPv4地址,并被列为active 如果您浏览到Web浏览器中的任一个Droplet的公共地址,将会加载默认的Apache占位符页面。 我们为每个添加一个新的唯一页面,所以我们可以将web-1web-2分开。

我们可以通过doctl SSH到我们的服务器:

doctl compute ssh web-1

这将使用您在创建时指定的SSH密钥连接并以root身份登录。 在服务器上打开一个新的HTML文件。 我们将使用nano文本编辑器:

nano /var/www/html/test.html

粘贴到以下HTML代码段中:

/var/www/html/test.html
<h1 style="color:blue">Hello from web-1!</h1>

保存文件并退出文本编辑器。 这不是一个完整的HTML文件,但浏览器是宽恕的,这对我们的目的是足够的。

导航到以下地址,以确保新页面正常投放。 请确保将正确的IP替换为突出显示的部分:

http://web-1_public_ip_address/test.html

在页面上,您应该看到web-1的标题Hello! 我们刚刚创建。

退出SSH会话:

exit

现在,SSH进入第二台服务器,并重复该过程,在HTML页面中使用不同的消息:

doctl compute ssh web-2

打开新的HTML文件:

nano /var/www/html/test.html

粘贴内容:

/var/www/html/test.html
<h1 style="color: orange">Hello from web-2!</h1>

保存并退出文本编辑器,然后退出SSH会话:

exit

使用浏览器检查web-2是否正确地为新网页提供服务。 如果是这样,我们已经准备好创建一个负载平衡器来在我们的两台服务器之间分配负载。

第2步 - 创建负载平衡器

我们将在nyc1区域中创建新的负载均衡器。 再次注意,负载平衡器及其目标Droplet需要位于相同的区域,因此请务必使用您的Droplet所在的区域:

doctl compute load-balancer create \
    --name load-balancer-1 \
    --region nyc1 \
    --forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:80

此命令在nyc1区域中创建名为load-balancer-1 每个负载均衡器需要至少一个规则,在--forwarding-rules标志下。 这些规则描述了负载平衡器如何接受流量以及如何将其转发到目标上。 上述转发规则表示我们正在将端口80上的HTTP流量直接传递到目标服务器。

其他 - --forwarding-rules协议选项是httpstcp ,您可以为入口和目标选择任何有效的端口。 如果需要指定多个转发规则,请使用引号将整个规则列表环绕起来,并在每条规则之间使用空格。 以下示例将启用HTTP和HTTPS转发:

--forwarding-rules "entry_protocol:http,entry_port:80,target_protocol:http,target_port:80 entry_protocol:https,entry_port:443,target_protocol:https,target_port:443"

我们刚刚运行的create命令将输出有关我们新的负载平衡器的信息:

ID                                      IP    Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs    SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd2-5e94-b564-c352fc6874ef          load-balancer-1    new       2017-05-10T19:28:30Z    round_robin    nyc1                            false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

注意上面突出显示的负载均衡器的ID,我们将在下一步中使用它来添加我们的目标Droplet。 还有一些我们没有设置的默认配置的信息,如健康检查规则和粘性会话。 您可以在必备的负载均衡器文章中找到有关这些选项的更多信息。 要了解有关如何使用doctl设置这些选项的详细信息,可以始终使用--help标志运行create命令。 对于负载均衡器的创建,这将是这样的:

doctl compute load-balancer create --help

这将输出所有可用的命令行标志和选项的列表。 您可以在任何doctl命令上使用--help标志。

现在我们的Load Balancer已经创建,我们需要添加目标Droplet。 我们将在下一节中做。

第3步 - 将Droplet添加到负载平衡器

我们再次列出我们两个Droplet的信息,所以我们可以得到他们的ID:

doctl compute droplet list web-*
ID          Name      Public IPv4        Private IPv4    Public IPv6    Memory    VCPUs    Disk    Region    Image                   Status    Tags
48603683    web-1    111.111.111.111    111.111.111.333                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active
48603684    web-2    111.111.111.222     111.111.111.444                   512       1        20      nyc1      Ubuntu LAMP on 16.04    active

ID在上面的示例输出中突出显示。 确保使用您的实际ID,而不是示例。

现在我们使用add-droplets命令将目标add-droplets添加到我们的负载平衡器。 指定我们在上一步中创建的负载平衡器的ID:

doctl compute load-balancer add-droplets  
    ae3fa042-bfd1-4e94-b564-c352fc6874ef \
    --droplet-ids 48463543,48463544

我们现在可以使用get命令来检索我们的负载均衡器的更新信息:

doctl compute load-balancer get ae3fa042-bfd1-4e94-b564-c352fc6874ef
ID                                      IP                Name               Status    Created At              Algorithm      Region    Tag    Droplet IDs          SSL      Sticky Sessions                                Health Check                                                                                                                   Forwarding Rules
ae3fa042-bfd1-4e94-b564-c352fc6874ef    111.111.111.555    load-balancer-1    active    2017-05-10T19:28:30Z    round_robin    nyc1             48603683,48603684    false    type:none,cookie_name:,cookie_ttl_seconds:0    protocol:http,port:80,path:/,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:5,unhealthy_threshold:3    entry_protocol:http,entry_port:80,target_protocol:http,target_port:80,certificate_id:,tls_passthrough:false

请注意,状态现在已active ,我们分配了IP,并列出了我们的目标Droplet。 在浏览器中浏览此新的负载平衡IP,再次加载test.html页面。 网址将如下所示:

http://load-balancer-1_ip_address/test.html

您的浏览器将从web-1web-2加载消息。 刷新页面,您应该看到其他服务器的消息。 我们的负载平衡器处于循环模式,这意味着它会向每个请求列表中的下一个Droplet发送连接。 替代方案是最小连接模式,其中负载平衡器将新的流量发送到具有最少活动连接的目标。

现在我们知道我们的负载均衡器正在工作,我们来禁用服务器,看看它如何处理中断。

第4步 - 测试失败

负载平衡器的一大优点是增加了对各个后端Web服务器的问题的容忍度。 负载均衡器以预定的间隔运行运行状况检查(默认情况下每隔10秒)。 默认运行状况检查是在目标服务器上获取网页。 如果此检查连续几次失败,目标将被取出旋转,并且在其恢复之前不会发送流量。

我们来测试故障切换功能,通过健康检查失败。 SSH回到web-2

doctl compute ssh web-2

现在关闭Apache Web服务器:

systemctl stop apache2

返回浏览器并刷新负载平衡页面几次。 起初你可能会得到一些503服务不可用的错误。 默认情况下,从池中删除服务器之前,负载平衡器等待三次运行状况检查失败。 这将需要大约30秒钟。 之后,您只会看到web-1的响应。

启动Apache备份web-2

systemctl start apache2

再次,在短时间之后,负载平衡器将检测到web-2已经启动,并且它将被添加回池中。 刷新页面时,您将开始看到web-2响应。

您的负载平衡器现在恢复健康。

继续阅读可以采取的一些后续步骤,使您的负载平衡器生产就绪。

结论

在本教程中,我们使用doctl创建一个DigitalOcean负载平衡器和一些后端Web服务器,配置了负载均衡器以向后端服务器发送HTTP流量,并测试了负载平衡器的运行状况检查功能。 您可以采取以下几个步骤来使您的负载平衡器准备投入生产:

  • 您需要在负载均衡器上指定一个域名,因此您的用户不会输入不友好的IP地址。 您可以通过我们的教程如何使用DigitalOcean设置主机名来学习如何做到这一点
  • DigitalOcean可以让您标记您的Droplet,以便您可以保持它们的组织,并将一组滴滴作为一组。 您可以配置负载平衡器,以将流量发送到特定标签中的所有Droplet,而不是单独添加Droplet。 这将允许您更加动态地向池添加新的后端服务器。 您可以了解DigitalOcean标签如何标记DigitalOcean Droplet
  • 如果您需要将HTTPS安全性添加到负载平衡网站,我们将通过以下两种不同的方式实现教程SSL通过SSL终止