架构
多个团队需要在少量共享机器上运行容器,并且每个团队必须无法查看或干扰其他团队的容器。仅使用容器运行时来实现这一点,意味着需要有人将全局信息记在脑中:哪台机器有空闲资源、哪个容器属于谁、运行配置本应是什么,以及在凌晨三点机器消失时该怎么办。
平台如何解决此问题
Section titled “平台如何解决此问题”Odysseus 将该全局信息分为三部分,且只有一部分是权威的。
您声明您想要的内容。 部署是一个描述——一个镜像、多少个副本、它们可以访问什么、什么塑造了它们。您只需在适合您的界面上编写一次:YAML 清单、REST API、仪表板或代理程序工具。这四个途径最终都生成相同的存储记录。
控制平面做出决定。 它接受或拒绝您的更改(每次拒绝都会指明字段及可接受的形式——参见 拒绝与修改)、选择哪个节点运行每个容器,并将存储的描述转换为带版本的分发负载。负载携带着塑造该容器的所有内容的哈希值,因此“您编辑了描述”和“容器必须被替换”之间的区别是通过计算而非判断得出的。部署参考文献中的可变性列就是该哈希值的度量。
代理程序执行操作。 每个节点上运行一个代理程序。它接收分发负载,驱动本地容器运行时,并报告所见情况。它从不决定放置位置,也从不自行创造配置:失去联系的节点会继续运行其当前状态,而不是即兴发挥。
正在运行的内容永远不是应该运行的内容的真相。存储的描述才是那个真相,哈希值表明容器是否与之匹配,而协调器的工作就是消除差距。容器受到持续监控——代理程序报告其观察结果,控制平面根据这些报告进行修复——但观察结果永远不会成为描述本身。
同一个循环也处理重复的工作。调度在作业到期时创建作业,平台跟踪该作业是否曾到达某个节点:如果从未到达——因为它所固定的节点未注册,或者从未看到过它的容器——仍然可以通过编辑调度来纠正;如果调度触发持续未能完成任何工作,则会被报告为卡住,而不是看起来健康。这些词各自的含义见 定时作业。
Not this
本页不描述如何安装节点,也不列出特定安装所需的端口、主机名或环境变量。这些内容属于运维操作手册,该手册描述的是平台的一次特定部署,而非平台本身。
它也不涵盖路由边缘。Traefik 负责终止 TLS 并将流量路由至容器;部署对此的声明是 ingress,详见
部署参考 。
