我们的文档接收路径用于在app pods中运行OCR。图书馆想要glibc。应用程序图像是阿尔卑斯山。解析时从获取了缺失的语言包。最后一部分让我睡不着觉:一个PDF上传可能会触发一个pod的出站获取,否则它就没有与公共互联网对话的业务。
因此,我们将解析转移到自己的服务中,将traineddata放入映像中,并完全关闭egress。包括DNS。
为什么这个应用不在合适的地方
三个独立的故障叠加在一个流程中:
Alpine上没有加载本机liteparse二进制文件。您会在目标环境中发现这一点,而不是在glibc笔记本构建中。
运行时下载的不在磁盘上的Tessdata。OCR“刚刚工作”,直到网络政策、速率限制或破碎的镜像使其无法工作。
解析库接受路径形状的选项(tessdataPath, imageOutputDir, ocrServerUrl).可以设置它们的调用者可以将解析器指向另一个文件系统或另一个主机。
这些都不是模型问题。https://www.iissbbs.com它们是打包和信任边界问题,在您第一次将文档上传视为不可信输入时就出现了,事实就是如此。
一个HTTP服务,三个呼叫旋钮
该服务是一个小型HTTP应用程序:多部分上传,多页文本输出。呼叫者只能通过:
z.strictObject({
ocrEnabled: z.boolean().optional(),
ocrLanguage: z.string().regex(/1{3}(+[a-z]{3})*$/).optional(),
maxPages: z.number().int().positive().optional(),
});
strictObject按名称拒绝所有其他字段。tessdataPath不是一个选项;它来自于LITEPARSE_TESSDATA_PATH其他地方也没有。语言是根据.traineddata启动时存在的文件。要求fra仅当eng和deu都被烤熟了400,不是下载。
图像大头针deu和eng从tesseract-ocr/tessdata_best在固定提交时,使用sha256验证的SHA。构建时间是我们获取。运行时是我们拒绝。
Auth是共享的承载令牌,最少16个字符。健康检查未经认证,因此Kubernetes可以在不掌握秘密的情况下进行调查。没有/metrics抓取路径,因为还没有任何东西抓取它,开放的度量端口将是另一个需要考虑的事情。
关闭出口是关键
在集群中,服务位于自己的名称空间中。网络策略集egress: []—没有出站流量,包括DNS。Ingress是堆栈配置中调用方命名空间的允许列表。空列表意味着在声明第一个消费者之前全部拒绝。
这种形状之所以有效,是因为容器从不需要网络。在我们的堆栈中,紧挨着它的Puppeteer不能做同样的事情:它用外部子资源呈现用户HTML。一旦模型出现在图像中,OCR就可以了。
App pods通话通过具有共享令牌的集群网络。他们从不嵌入本地二进制文件。高山保持高山。解析爆炸半径是一个专门的部署与内存层,没有出路。
我们会再做什么
在映像中固定traineddata,在未知语言上失败关闭。白名单请求选项,因此多部分字段不能重定向文件系统或网络路径。将NetworkPolicy放在同一个PR中的部署旁边,默认情况下ingress为空,这样被遗忘的消费者配置就不会向整个集群开放服务。
如果您的OCR在第一次使用时仍然下载语言包,则您没有离线解析器。你有一个延期curl以一个PDF作为触发器。
a-z ↩︎