23

情况:许多重型 docker conainers 会定期受到攻击一段时间,然后在较长时间内保持未使用状态。

希望:按需启动容器(如 systemd 通过套接字激活启动事物)并在空闲一段时间后停止它们。最终用户没有可见的停机时间。

选项:

  • Kubernetes 具有可以扩展副本的资源控制器。我想可以将副本数保持为 0,并在需要时将其设置为 1,但是如何实现呢?用户指南说有一种叫做自动缩放控制代理的东西,但我没有看到任何进一步的信息。是否有一个可插入的、可编程的代理可以用来跟踪请求并根据用户定义的逻辑进行扩展?
  • 我在 Docker Swarm 中没有看到任何解决方案,如果我错了,请纠正我。
  • 使用以所选语言编写的自定义 http 服务器,该服务器可以访问 docker 守护进程。在路由到正确位置之前,它会检查容器是否存在并确保它正在运行。缺点 - 不是通用解决方案,必须不是容器或有权访问守护程序。
  • 如此处所述使用 systemd 。与上面相同的缺点,即不通用,必须自己处理网络任务(例如查找生成容器的 IP 并将其输入服务器/代理的配置)。

任何想法表示赞赏!

4

3 回答 3

3

您可以使用 Kubernetes 内置的Horizo​​nal Pod Autoscaling (HPA)将每个容器的 1 个实例扩展到处理负载所需的多个实例,但没有内置功能可在接收到请求,我不知道有任何广泛使用的解决方案。

于 2016-04-02T22:53:09.650 回答
2
  1. 您可以使用 systemd 来管理您的 docker 容器。见https://developer.atlassian.com/blog/2015/03/docker-systemd-socket-activation/

  2. 前段时间,我和 pantheon.io 的一位运维人员讨论了他们是如何使用 docker 做这种事情的。我想这应该是在 Kubernetes 出现之前。万神殿做drupal托管。他们设置事物的方式,他们为客户端运行的每台服务器都是容器化的,但是正如您所描述的,容器在不需要时就会消失。除了磁盘存储之外,唯一保留的资源是主机上的套接字号。

    他们有一个相当简单的守护进程,它监听所有非活动服务器的套接字。当它收到一个请求时,守护进程停止监听该套接字上的更多传入连接,启动所需的容器,并将该请求代理到新容器。随后的连接直接连接到容器,直到它空闲一段时间,然后侦听器守护程序再次接管该端口。这就是我所知道的关于他们所做的尽可能多的细节,但你明白了。

  3. 我想像 pantheon 实现的守护进程之类的东西可以用来向 Kubernetes 发送命令,而不是直接向 Docker 守护进程发送命令。也许基于 systemd 的动态启动容器的方法也可以根据需要与 Kubernetes 进行通信。这些中的任何一个都可能允许您启动 pod,而不仅仅是容器。

于 2017-01-29T04:06:16.333 回答
0

Podman从版本 3.4.0(2021 年 9 月发布)开始支持套接字激活。

大致是这样工作的

  1. systemd 创建一个监听套接字
  2. 客户端连接到套接字
  3. systemd 使用传递的套接字启动 Podman。
  4. Podman 使用传递的套接字启动容器。

我用 Podman 和 MariaDB 写了一个小示例演示:

https://github.com/eriksjolund/mariadb-podman-socket-activation

MariaDB从版本10.6(2021 年 4 月发布)开始支持套接字激活

于 2022-02-19T18:46:28.857 回答