题图摄于北京奥林匹克体育中心
注:微信公众号不按照时间排序,请关注“亨利笔记”,并加星标以置顶,以免错过更新。
相关文章:
本文节选自《 Harbor权威指南》 一书第8章,略有删节,作者为 Harbor 开源项目维护者王岩。
在 Harbor 中,对项目有写权限的任何用户都可以推送制品(Artifact)到项目中。在大多数情况下,用户都是通过 Tag 推送 Artifact 的,这就导致用户无法保证自己推送的 Artifact 不被其他用户同名覆盖,甚至是用完全不同的 Artifact 覆盖。一旦覆盖,就很难在使用过程中追踪问题的源头。
用户在需要保护某个或者多个 Artifact 不被修改时,可以用 Harbor 提供的不可变Artifact 对其进行保护。一旦设置了不可变属性,Harbor 就不允许任何用户推送与被保护 Artifact 同名的 Artifact。
不可变 Artifact 的功能在 Harbor 2.0 之前的版本中被称为“不可变镜像”,主要保护镜像资源不被意外的操作所覆盖。在 Harbor 2.0 中,绝大部分的镜像功能都被扩展到了 Artifact,因此被称为“不可变Artifact”。不可变 Artifact 的功能实现原理是依据 Tag 来判定 Artifact 的不可变性,所以在管理界面上也显示为“不可变的TAG”。
不可变 Artifact 的目标是:无论用户何时用同一个 Tag 去同一个 Repository 中拉取 Artifact,都会得到同一个 Artifact。这就需要保证不可变 Artifact 不可被覆盖、不可被删除。
从客户端推送 Artifact 到仓库时,最后一步是客户端发起 PUT Manifest 请求推送Artifact 的 Manifest文件,从而完成整个推送过程。Harbor 通过拦截客户端的 PUT Manifest 请求来实现对不可变 Artifact 的保护,如图所示。
Harbor 在接收到 PUT Manifest 请求后,会用项目的不可变 Artifact 规则去匹配当前 Artifact。如果任意一条规则匹配成功,则表明用户正在推送一个不可变 Artifact,该请求就会被阻止。
注意:因为使用基于模型匹配的规则来判定 Artifact 是否为不可变Artifact,所以用户正在推送的Artifact不可能存在于项目中。在这种情况下,即使该Artifact能够被不可变Artifact规则成功匹配,也依然可以正常推送。
不可被覆盖的情况可发生在用户推送 Artifact 阶段,也可发生在Artifact远程复制阶段。
当用户在 Harbor 中请求某个 Artifact 的 Tag 列表时,系统会根据当前的不可变Artifact 规则为每一个 Tag 都标记不可变属性。而当用户选择删除某个 Tag 时,如果该 Tag 是不可变属性,那么 Harbor 会阻止该删除请求。
通过上述过程可以达到不可变 Artifact 的目的。
不可变 Artifact 的规则其实就是一个包含仓库名称匹配和 Tag 名称匹配的过滤器。在一个项目下,项目管理员或系统管理员至多可创建15条不可变 Artifact 的规则。Harbor 使用OR(或)关系应用规则到Artifact,如果 Artifact 被任意一条规则匹配成功,就为不可变Artifact。
在项目策略页面下单击“不可变的TAG”按钮,可以查看项目的不可变Tag规则,如图所示。
单击“添加新规则”按钮后,会弹出不可变规则设置窗口,如图所示。
一个不可变Artifact的规则包括两部分:仓库和Tag。其中每个部分都包括动作和名称表达式。
(1)动作:包括匹配和排除。
◎匹配:指包含,包含规则表达式命中的仓库或者Tag。
◎排除:指不包含,不包含规则表达式命中的仓库或者Tag。
(2)名称表达式:指明需要设置为不可变Artifact的仓库或者Tag名称表达式。
名称表达式分别对Artifact名称中的仓库和Tag部分进行过滤,支持以下匹配模式(在匹配模式下用到的特殊字符需要使用反斜杠“\”进行转义)。
◎“*”:匹配除分隔符“/”外的所有字符。
◎“**”:匹配所有字符,包括分隔符“/”。
◎“?”:匹配除分隔符“/”外的所有单个字符。
◎“{alt1,…}”:如果能够匹配以逗号分隔的任意匹配模式(alt1等),则该规则匹配。
示例如下:
◎“library/hello-world”:只匹配“library/hello-world”。
◎“library/*”:匹配“library/hello-world”,但不匹配“library/my/hello-world”。
◎“library/**”:既匹配“library/hello-world”,也匹配“library/my/hello-world”。
◎“{library,goharbor}/*”:匹配“library/hello-world”和“goharbor/core”,但不匹配“google/hello-world”。
◎“1.?”:匹配1.0,但不匹配1.01。
不可变Artifact 的规则一旦创建成功,便立刻发挥作用。多个规则之间是独立计算的,每个规则匹配的Artifact都是独立的。由于使用了OR(或)关系,所以一个Artifact只要匹配任意一条规则,即为不可变Artifact。
用户可以通过Artifact的Tags列表来查看Tag是否被设定为不可变,如图所示。
当用户推送一个不可变 Artifact 到 Harbor 时,客户端会得到错误提示,下图显示的是 Docker 客户端的错误提示。
当用户删除一个不可变 Artifact 时,系统会禁止“删除”按钮,如下图所示。当 Tag保留策略删除不可变 Artifact 时,系统执行日志会提示错误。
《Harbor权威指南》目前京东优惠中,点击下图直接购买。
要想了解云原生、机器学习和区块链等技术原理,请立即长按以下二维码,关注本公众号亨利笔记 ( henglibiji ),以免错过更新。