HAProxy容器化实践
关注「开源Linux」,选择“设为星标”
回复「学习」,有我为您特别筛选的学习资料~
您可以将 HAProxy 作为 Docker 容器运行吗?是的!这还需要问吗?如今 Docker 无处不在,您会发现许多应用程序都已被 Docker 化;HAProxy 负载均衡器也不例外,但 HAProxy 就是为此而生的。作为在 Linux 上运行的独立服务,将其移植到 Docker 似乎很自然。
为什么要在 Docker 容器内运行负载均衡器?这样做性能会有折扣么?它会引入任何安全问题吗?
在这篇博文中,您将了解为什么要考虑在容器内运行 HAProxy 以及可能产生的后果。然后你会看到如何去做。请注意,我们介绍的是如何运行 HAProxy,而不是 HAProxy Kubernetes Ingress Controller。
HAProxy Technologies 在其命名空间 haproxytech 下构建自己的一组 Docker 镜像。这些会定期更新最新的补丁和安全更新。我将在这篇博文中使用这些镜像。你会在这里找到它们:
HAProxy(Alpine Linux 基础)- https://hub.docker.com/r/haproxytech/haproxy-alpine
HAProxy (Ubuntu 基础) – https://hub.docker.com/r/haproxytech/haproxy-ubuntu
HAProxy (Debian 基础) – https://hub.docker.com/r/haproxytech/haproxy-debian
我演示的命令是在 Linux 工作站上执行的,如果您在使用 Docker Desktop for Windows 或 Docker Desktop for Mac 时也能正常工作。
使用 Docker 的好处
您是否希望能够运行 HAProxy 而无需编译、安装依赖项或以其他方式更改您的系统?
Docker 容器带来了可观的好处,其中最主要的是安装和执行的操作较少。Docker 允许您将容器放到主机系统上并立即获得正在运行的服务——无需安装脚本,无需安装 C 库。该服务完全包含在容器中,您需要做的就是启动它,然后将 TCP 端口映射到它。当您部署一个容器时,您可以获得运行完整的应用程序及其运行时环境的能力,而无需将其实际安装到主机系统上。
生命周期管理也变得标准化。启动、停止和删除容器就像调用一行 docker 命令一样简单。这反过来又使部署成为一个可重复和可测试的过程。它还有助于更轻松地进行软件升级。
使用 Docker 的性能影响
您希望您的负载均衡器运行速度快,且不会增加环境延迟。那么,问题是,在容器内运行 HAProxy 有什么影响?
在 CPU 开销方面,记住,与虚拟机不同,Docker 不需要在主机操作系统之上的虚拟化层。容器在主机的内核上运行,基本上只是另一个进程,尽管它与主机上运行的其他进程具有更好的隔离性(它使用命名空间来实现这一点)。IBM 研究人员的一项研究发现,使用 Docker 的 CPU 开销可以忽略不计,这应该不足为奇。
网络是另一回事。默认情况下,Docker 允许您通过创建到主机的桥接网络来访问在容器内运行的服务。由于必须在容器的本地网络和主机的桥接网络之间发生的网络地址转换 (NAT),这确实会导致延迟。在之前引用的同一 IBM 研究中,研究人员发现 Docker 的 NAT 将来自客户端的 100 字节请求和来自应用程序的 200 字节响应的延迟从大约 35 微秒增加到 70 微秒。
另一方面,桥接网络很有用,因为它们允许您将容器组隔离到容器网络中,并且仅将其中一些容器暴露给主机,这对于减少主机网络所需的 IP 地址数量非常方便(想想运行数百甚至数千个容器所需的 IP 数量)。如果您有兴趣了解有关 Docker 中网络如何工作的更多信息,可以在 YouTube 上观看 Docker 团队提供的深入探讨。
如果您需要非常低的延迟,您可以切换到使用 Docker 的主机网络功能,它允许您的容器与主机共享相同的网络,从而无需 NAT。再说一次,如果你想运行 Docker Swarm 或 Kubernetes,它们使用覆盖网络,对于不同的网络驱动程序,如 Project Calico 和 Cilium 有解决方案,本篇文章文章并不涉及该怎么做。
简而言之,除非您需要非常低的延迟,否则您应该坚持使用默认的桥接网络选项。请务必对其进行测试,看看您是否达到了所需的吞吐量。
使用 Docker 的安全考虑
您可能会担心许多 Docker 容器以 root 身份运行他们的服务,而这个 root 用户与主机系统上的 root 用户相同。对容器突破的担忧是合理的。HAProxy 也以 root 身份运行。但是,让您放心:HAProxy 需要 root 访问权限,因为它需要绑定到受限制的 TCP 端口,如 80 和 443。但是,一旦完成启动,它就会放弃其 root 权限并以非特权用户身份运行。
人们还会权衡容器可能是恶意的风险。这是坚持使用由 HAProxy Technologies 制作的 haproxytech Docker 镜像的一个很好的理由。
使用 Docker 运行 HAProxy
我们将创建一个 Web 应用程序的三个实例、一个 HAProxy 实例和一个将它们连接在一起的桥接网络。因此,一旦您安装了 Docker,请使用以下命令在 Docker 中创建一个新的桥接网络:
$ sudo docker network create --driver=bridge mynetwork
然后使用该 docker run 命令创建并运行 Web 应用程序的三个实例。在此示例中,我使用 Docker 镜像 jmalloc/echo-server https://hub.docker.com/r/jmalloc/echo-server
。这是一个简单的 Web 应用程序,可返回您发送给它的 HTTP 请求的详细信息。
$ sudo docker run -d \--name web1 --net mynetwork jmalloc/echo-server:latest$ sudo docker run -d \--name web2 --net mynetwork jmalloc/echo-server:latest$ sudo docker run -d \--name web3 --net mynetwork jmalloc/echo-server:latest
请注意,我们为每个服务分配了一个唯一名称并将其附加到我们创建的桥接网络。您现在应该运行了三个 Web 应用程序,您可以通过调用以下 docker ps 命令进行验证:
$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98216bb8c5ff jmalloc/echo-server:latest "/bin/echo-server" About a minute ago Up About a minute 8080/tcp web3
ae6accc111d9 jmalloc/echo-server:latest "/bin/echo-server" About a minute ago Up About a minute 8080/tcp web2
554fafbc2b3b jmalloc/echo-server:latest "/bin/echo-server" About a minute ago Up About a minute 8080/tcp web1
这些容器监听自己的端口 8080,但我们没有将这些端口映射到主机,因此它们不可路由。我们将通过 HAProxy 负载均衡器将流量中继到这些容器。接下来,让我们在它们前面添加 HAProxy。在当前目录中创建一个名为 haproxy.cfg 的文件,并在其中添加以下内容:
globalstats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listenerslog stdout format raw local0 infodefaultsmode httptimeout client 10stimeout connect 5stimeout server 10stimeout http-request 10slog globalfrontend statsbind *:8404stats enablestats uri /stats refresh 10sfrontend myfrontendbind :80default_backend webserversbackend webserversserver s1 web1:8080 checkserver s2 web2:8080 checkserver s3 web3:8080 check
需要注意的几点:
在该 global 部分中,该 stats socket 行启用了 HAProxy 运行时 API,还启用了 HAProxy 的无缝重新加载。
第一个前端监听端口 8404 并启用 HAProxy Stats 仪表板,该仪表板显示有关您的负载均衡器的实时统计信息。
另一个前端监听端口 80,并将请求分派到 Web 服务器后端中列出的三个 Web 应用程序之一。
我们没有使用每个 Web 应用程序的 IP 地址,而是使用它们的主机名 web1、web2 和 web3。当您像我们一样创建 Docker 桥接网络时,您也可以使用这种基于 DNS 的路由。
接下来,创建并运行一个 HAProxy 容器,并通过包含-p 参数将其端口 80 映射到主机上的相同端口。还要为 HAProxy Stats 页面映射端口 8404:
$ sudo docker run -d \--name haproxy \--net mynetwork \-v $(pwd):/usr/local/etc/haproxy:ro \-p 80:80 \-p 8404:8404 \haproxytech/haproxy-alpine:2.4
docker ps 之后调用显示 HAProxy 正在运行:
$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d734d0ef2635 haproxytech/haproxy-alpine:2.4 "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:8404->8404/tcp haproxy
您可以通过http://localhost访问echo-server Web 应用程序。每个对它的请求都将由 HAProxy 进行负载平衡。此外,您可以在http://localhost:8404看到 HAProxy Stats 页面。
如果您对 haproxy.cfg 文件进行了更改,则可以通过调用以下 docker kill 命令重新加载负载均衡器,而不会损失流量:
$ sudo docker kill -s HUP haproxy
要删除容器和网络,运行 docker stop,docker rm 和 docker network rm 命令:
$ sudo docker stop web1 && sudo docker rm web1
$ sudo docker stop web2 && sudo docker rm web2
$ sudo docker stop web3 && sudo docker rm web3
$ sudo docker stop haproxy && sudo docker rm haproxy
$ sudo docker network rm mynetwork
总结
在这篇博文中,您了解了如何在 Docker 容器内运行 HAProxy 简化其部署和生命周期管理。Docker 提供了一种用于部署应用程序的标准化方法,使该过程具有可重复性和可测试性。虽然运行 Docker 的 CPU 开销可以忽略不计,但它可能会导致额外的网络延迟,但其影响取决于您的场景和吞吐量需求。
要运行 HAProxy,只需创建一个 HAProxy 配置文件,然后使用 docker run 命令调用 HAProxy Docker 镜像的名称。HAProxy Technologies 在 Docker Hub 上提供最新的 Docker 镜像。
往期推荐
万字长文:Kubernetes 创建 Pod 时,背后到底发生了什么?
从容器到容器云,什么才是 Kubernetes 的本质?
Kubernetes 核心组件原理梳理,运维必备~
手把手教你如何给 Docker 开启 IPv6 网络支持
深入研究Docker联合文件系统
干货|最全的Tomcat漏洞复现
Nginx 常用配置清单分享
万字长文,从基础到高级,一文搞懂 Kafka
你不好奇Linux文件系统是怎么工作的?
小知识点:Linux删除‘-’开头的文件
开源~新款装机神器!启动 U盘 告别格式化,直接挂载多 ISO
Linux 服务器日常巡检脚本分享
终于有人把Prometheus入门讲明白了
Redis中主、从库宕机如何恢复?
讲讲 Linux 下的一些资源限制
有收获,点个在看
HAProxy容器化实践相关推荐
- 《docker+k8s微服务容器化实践》笔记2
5-3 集群环境搭建_A 5-4 集群环境搭建_B 5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...
- 工行分布式数据库选型与大规模容器化实践
来自:DBAplus社群 本文根据顾龚磊老师在[2019 DAMS中国数据智能管理峰会]现场演讲内容整理而成. 讲师介绍 顾龚磊,工商银行开源数据库运维牵头人,带领团队管理上千个MySQL节点的日常维 ...
- Spring Cloud Kubernetes容器化实践
随着公司业务量和产品线的增加,项目越来越多,普通运维系统架构对整个软件研发生命周期的管理越来越难,效率低下,难以统一管理.近年来Docker统一了容器标准,对于软件开发流程产生了深远的影响,Docke ...
- 运营商业务系统基于 KubeSphere 的容器化实践
本篇文章是 KubeSphere 2020 年度 Meetup 上讲师宋磊分享内容整理而成. 大家好,我是宋磊,在运营商的一个科技子公司任职,主要做大数据业务.我主要负责公司的 IaaS 层和 Paa ...
- 亿级音乐服务容器化实践
作者:李乾坤 来源:qiankunli.github.io/2021/08/02/kubernetes_xima_practice.html 喜马的容器化历程伴随着公司的发展,并带有很深刻的喜马的烙印 ...
- 基于Kubernetes的云平台存储容器化实践
本文根据蔡逸煌老师在[Deeplus直播第214期]线上分享演讲内容整理而成. 蔡逸煌 OPPO云平台高级后端工程师 主要从事云平台开发工作,擅长K8S.容器网络.存储等领域. 今天分享的主题是OPP ...
- Python项目容器化实践 - 编排方案: Mesos+Marathon
在生产环境中不用 Docker Compose 如果想在生产中使用容器,应该选择 21云盒子來部署 为什么呐?其实也蛮好理解的: Docker Compose 是单机版的开发套件,类似于容器环境下的 ...
- 降本40%!Redis多租户集群的容器化实践
本文转载自dbaplus社群 本文根据石鹏老师在[deeplus直播第260期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的方式,不要错过) 石鹏 VIPKID基础架构存储平台负责 ...
- ansible 建 kubernetes 证书签名请求_基于Kubernetes的云平台存储容器化实践
本文根据蔡逸煌老师在[Deeplus直播第214期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的途径,不要错过) 蔡逸煌 OPPO云平台高级后端工程师 主要从事云平台开发工作,擅长 ...
最新文章
- kali linux samba,Kali Linux 渗透测试:SMB、SMTP扫描工具(14)
- java verbose gc_jvm参数-verbose:gc和-XX:+PrintGC有区别?
- 由树先序遍历和中序遍历输出其后续遍历
- consul 1.2 支持service mesh
- 问题 I: 成对最小公倍数(数学)
- python如何绘制两点间连线_如何利用Python的pyecharts绘制3d柱形图?
- 前端新手程序员不知道的 20个小技巧
- ZT:公司绝对不会告诉你的潜规则(何杨)
- Adrian Cole发布JClouds 1.0
- Sprintboot 解压Zip文件,ZipEntry的zipEntry.getSize()为-1的问题
- HikariCP配置手册
- ADPRL - 近似动态规划和强化学习 - Note 1 - Introduction
- 婆媳兵法之——短兵相接15天
- 升级版飞机大战来袭,手把手教学,万字详解,你还学不会嘛?
- 怎么修改我的世界服务器封面,《我的世界:初识服务器》
- pk+uk+fk+index
- 2019 年第 10 周 DApp 影响力排行榜 | TokenInsight
- 单人被罩标准的尺寸是多少
- mysql脚本文件生成工具_SqlDataToScript(sql脚本生成工具)
- 中南大学计算机学硕毕业要求,中南大学研究生在学期间发表学术论文规定