用 Docker 在卡片机上打造经济、高效的家用服务器集群(二)

出品丨Docker公司(ID:docker-cn)

编译丨小东

每周一、三、五晚6点10分 与您不见不散

说在前面

今天我将继续为大家带来系列教程中的第二篇内容,上一篇我为大家介绍了打造家用服务器集群的背景、物理服务器和集群这三部分内容,详情请参考文章用 Docker 在卡片机上打造经济、高效的家用服务器集群(一)。今天我将就HTTP 访问、监控和CI/CD 这三部分内容继续为大家介绍。

HTTP访问

有些服务是从互联网上进行外部访问的。我使用功能强大的 Nginx 来为我处理正确应用程序的路由请求。但是对于 Docker 来说,容器一直都在运行,并且它们每次都会在内部覆盖的网络上获取新的IP地址。我使用的是docker-pygen工具来监听 Docker 引擎事件,并在每次配置需要使用新的上游目标进行更新时重新配置 Nginx 实例。配置模板不仅可以处理 IP 地址。通过 Docker 服务标签,我可以将如选择服务器、基础身份验证或允许上传的大小等各种设置更改为默认设置。我可以通过不同的 URI 前缀或不同的子域来处理单个服务。

docker-pygen 工具 :

(下载地址:https://github.com/rycus86/docker-pygen);

我希望将我的服务器安全端点公开,因此80端口上的 HTTP 访问基本上是重定向到 HTTPS 的。我从“Let's Encrypt”处获取了子域的 SSL 证书(Let's Encrypt 的使命是保护每一个人的互联网安全,为此它们会提供一个有效期为三个月的信任证书)。使用certbot工具就可以自动获取和更新证书了。

Let's Encrypt :

(浏览 https://letsencrypt.org 查看详情);

certbot 工具 :

(下载地址:https://certbot.eff.org);

我的服务器性能不是很强大,所以我做了一些工作来让终端响应速度变得更快一些。我想使用 HTTP/2 访问它们,但是这个功能不在 Nginx 开源版本之中,它是需要付费使用的。我也想过添加缓存这个方法,而且在 Nginx 上也很容易做到。但是我已经找到了一个更好的、免费的替代方案,它就是Cloudflare—— 一款免费的全局 CDN (Content delivery network)。它不仅提供了前面提到的 HTTP/2 和缓存功能,而且它们自己的证书还提供了通过 HTTP 或 HTTPS 进行访问、威胁防护、动态 JavaScript、CSS 和 HTML 缩小等功能。使用全局 CDN 意味着在远离我服务器的位置上也可以快速的提取(缓存)内容。

Cloudflare :

(浏览 https://www.cloudflare.com 查看详情);

监 控

通过 SSH 访问和跟踪 Docker 日志来监控服务,在短时间内可以完成的很好,但是随着数量越来越多,我觉得为它添加适当的工具是有意义的。我的 Twitter 时间线上有很多来自CNCF landscape新系统的帖子,这让我感到很兴奋,所以我主要是为了收集那些帖子。

指标使用的是Flask应用程序中的 Prometheus (使用我的导出程序)来收集的,您也可以使用一些其它的可以在本地显示兼容指标的服务,例如 Docker 引擎或 Prometheus 。

Flask :

导出程序 :

(下载地址:https://github.com/rycus86/prometheus_flask_exporter);

Prometheus 的节点导出器可以显示主机级指标,如 CPU 负载,可用内存或空闲磁盘。即使在资源受限的服务器上,它也能很好的工作(从 v2.0 更新之后)。我还可以使用超级Grafana 可视化平台来看到这些指标。对于本地网络的一次性检查,可以查看Portainer 仪表板,它还可以提供控制堆栈、启动和停止容器或删除镜像等功能。

Prometheus 节点导出器 :

(下载地址:https://github.com/prometheus/node_exporter);

Grafana 可视化平台 :

Portainer仪表板 :

(浏览 https://portainer.io 查看详情);

我使用Fluentd作为容器的日志驱动程序,将日志发送到Elasticsearch实例。可视化由Kibana来完成。将Logstash切换到 Fluentd 的部分原因是因为它需要稍多一些的内存来运行,这是我的设备中最受限制的因素。

Fluentd :

(浏览 https://www.fluentd.org 查看详情);

Elasticsearch :

(浏览 https://www.elastic.co/products/elasticsearch 查看详情) ;

Kibana :

(浏览 https://www.elastic.co/products/kibana 查看详情);

Logstash :

(浏览 https://www.elastic.co/products/logstash 查看详情);

我有来自Uptime Robot的外部监控来获取数据。它性能很强大,并且是免费的。您可以使用 HTTP 请求或 ping 信号来监控50个端点。他们甚至可以在您的自定义域名上为您提供一个公共页面,如上图所示。这真的是太棒了!默认情况下,当某些服务宕机时,就会收到提醒邮件,还有很多其他的选项供您选择,现在Slack通知是我最喜欢的提醒服务了。

Uptime Robot :

(浏览 https://uptimerobot.com 查看详情);

Slack :

(浏览 https://slack.com 查看详情);

CI /CD

这一小节我将详细介绍如何自动部署我所做的更改,这部分也是我最感兴趣的内容,而且我也一直在寻找更好的方法来优化它。简而言之,前文提到的3个 CPU 架构上的 Docker 镜像,将它们上传到 Docker Hub 或我的私有镜像仓库中,确保将所有应用程序都构建在Travis上。这就触发了一些 webhook ,它们主要被我的webhook处理器所忽略,等待关于推送多架构清单的事件。这部分是由 Phil Estes 提供的清单工具来完成的。

Travis :

(浏览 https://travis-ci.org 查看详情);

我的webhook处理器 :

(下载地址:https://github.com/rycus86/webhook-proxy);

清单工具 :

(下载地址:https://github.com/estesp/manifest-tool);

当最终的 webhook 到达时, Docker 镜像已经准备就绪并上传到 Docker Hub 了,并将清单指向目标 CPU 架构的实际镜像,具体到我的服务器就是 arm64 。Webhook 接收器将下载镜像(使用最新的标签,很容易)并请求 Docker 更新相关的服务。有了这一点,Docker 将自动安排应用程序的更新和重启等操作,到目前为止效果很好。

结 语

这一章节的内容已经完结了,通过这两篇文章,我主要想为大家介绍在家中用卡片机搭建服务器所需的一些设备和原理,让大家对这个事有一个大概的了解,接下来我将为大家带来例如安装 Docker 、集群配置 、监控设置等具体的实操部分,希望大家都能够动手尝试一番。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180209G0ZV5K00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券