使用Container Canary在多个平台上测试容器图像

自带容器模型在当今的现代计算平台上得到广泛支持。换句话说,您可以在自定义软件环境中提供自己的容器映像。
然而,用户提供的容器必须满足每个平台的独特要求,这可能因平台而异。例如,您可能需要:
使用特定的非 root 用户。
将主目录放在某个位置。
安装依赖软件包。
在指定端口上运行 web 应用程序。
保持容器图像符合这些任意要求可能是一项挑战。因此,我们迫切希望引入一个名为 container canary 的新开源工具来捕获这些需求,并针对它们进行自动测试。 container canary 提供了一个规范,用于将这些需求记录为可检入版本控制的清单。然后,可以使用canary cli 工具根据该清单验证容器。
这在测试和持续集成( ci )环境中非常有用,可以避免容器中的回归,同时允许容器开发人员快速移动。
$ canary validate --file somespec.yaml foo/bar:latestvalidating foo/bar: latest against somespec 安装集 container canary
container canary 是用 golang 编写的,并以静态二进制文件的形式分发,使其易于移植,易于在 ci 环境中安装。
要安装它,请转到 releases page 并下载适合您系统的发行版。例如,使用 x86 _ 64 处理器的 linux 用户将使用canary_linux_amd64二进制文件。确保将以下命令中的version替换为要安装的版本。
$ curl -l https://github.com/nvidia/container-canary/releases/download/version/canary_linux_amd64 > canary_linux_amd64 container canary 还提供 sha256 总和来验证二进制文件。
$ curl -l https://github.com/nvidia/container-canary/releases/download/version/canary_linux_amd64.sha256sum > canary_linux_amd64.sha256sum $ sha256sum --check --status canary_linux_amd64.sha256sum 现在,你可以把二进制文件放在你的路径上。
$ chmod +x canary_linux_amd64 $ mv canary_linux_amd64 /usr/local/bin/canary 最后,验证它是否有效。
$ canary versioncontainer canary version: version ... 用 kubeflow 示例验证容器
安装了 container canary 之后,就可以开始验证容器了。 /examples/ github 目录包含一些流行容器平台的清单,包括 kubeflow example 。您可以使用这些清单立即开始。
kubeflow 是设计、培训和推断 machine learning 模型的流行平台。 kubeflow notebooks 服务使您能够在 kubeflow 内部启动基于 web 的开发环境。虽然 kubeflow 社区为运行 jupyterlab 、 rstudio 和 visual studio 代码(代码服务器) 等工具维护了默认容器,但您也可以使用自己的软件环境选择自己的容器映像。
要求清单 指定自定义容器必须满足哪些条件才能在 kubeflow 笔记本上正确运行。该列表如下所示:
kubeflow 笔记本电脑要使用容器映像,映像必须:
在端口 8888 上公开 http 接口:
kubeflow 在运行时设置一个环境变量 nb _ prefix ,其中包含我们希望容器监听的 url 路径
kubeflow 使用 iframe ,因此请确保您的应用程序集访问控制允许源代码:*在 http 响应头中
以名为 jovyan 的用户身份运行:
jovyan 的主目录应该是/ home / jovyan
乔维安的 uid 应该是 1000
在/ home / jovyan 安装一个空 pvc ,成功启动:
kubeflow 在/ home / jovyan 安装了一个 pvc ,以在 pod 重启期间保持状态
对于 container canary ,我们已经在示例清单中列出了这些要求。如果您曾经编写过 kubernetes 吊舱清单,那么您应该很熟悉这种语法。您可以看到,每个需求都以探针的形式写出来,container canary 对着您的容器运行,以检查是否满足了需求。
该过程如以下示例所示:
apiversion: container-canary.nvidia.com/v1kind: validatorname: kubeflowdescription: kubeflow notebooksdocumentation: https://www.kubeflow.org/docs/components/notebooks/container-images/#custom-imagesenv: - name: nb_prefix value: /hub/jovyan/ports: - port: 8888 protocol: tcpvolumes: - mountpath: /home/jovyanchecks: - name: user description: user is jovyan probe: exec: command: - /bin/sh - -c - [ $(whoami) = jovyan ] - name: uid description: user id is 1000 probe: exec: command: - /bin/sh - -c - id | grep uid=1000 - name: home description: home directory is /home/jovyan probe: exec: command: - /bin/sh - -c - [ $home = /home/jovyan ] - name: http description: exposes an http interface on port 8888 probe: httpget: path: / port: 8888 initialdelayseconds: 10 - name: nb_prefix description: correctly routes the nb_prefix probe: httpget: path: /hub/jovyan/lab port: 8888 initialdelayseconds: 10 - name: allow-origin-all description: sets 'access-control-allow-origin: *' header probe: httpget: path: / port: 8888 responsehttpheaders: - name: access-control-allow-origin value: * initialdelayseconds: 10 既然有了清单,我就可以对容器进行测试了。首先,我选择了一个我知道不会通过要求的公共形象,比如 流行的 web 服务器 nginx 。
$ canary validate --file https://github.com/nvidia/container-canary/raw/main/examples/kubeflow.yaml nginx:latest cannot find nginx:latest, pulling…validating nginx:latest against kubeflow home directory is /home/jovyan [failed] user is jovyan [failed] user id is 1000 [failed] exposes an http interface on port 8888 [failed] sets 'access-control-allow-origin: *' header [failed] correctly routes the nb_prefix [failed]validation failed 毫不奇怪,这张图片没有通过验证。
接下来,我尝试了一款设计用于 kubeflow 笔记本电脑的 官方 kubeflow 图片 。
$ canary validate --file https://github.com/nvidia/container-canary/raw/main/examples/kubeflow.yaml public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0 cannot find public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0, pulling…validating public.ecr.aws/j1r0q0g6/notebooks/notebook-servers/jupyter-pytorch-cuda:v1.5.0 against kubeflow home directory is /home/jovyan [passed] user is jovyan [passed] user id is 1000 [passed] sets 'access-control-allow-origin: *' header [passed] correctly routes the nb_prefix [passed] exposes an http interface on port 8888 [passed]validation passed 成功这张图片通过了验证。
如果要在 kubeflow 上创建图像,可以用同样的方法验证它们,并确信当其他用户来运行它们时,所做的更改不会导致问题。
编写自己的验证清单
您还可以编写自己的清单来验证容器。 container canary 可以帮助您确保您的容器清单将在您自己的部署和第三方平台中运行。它还帮助您在容器构建上运行单元测试。
每个清单都是一个以一些元数据开头的 yaml 文件。
# manifest versioningapiversion: container-canary.nvidia.com/v1kind: validator # metadataname: foo # the name of the platform that this manifest validates fordescription: foo runs containers for you # optional, a description of that platformdocumentation: https://example.com # optional, a link to the documentation that defines the container requirements in prose 接下来,您可以为容器配置一些运行时选项。当 container canary 启动图像进行验证时,将使用这些选项,并应模仿在目标平台上设置的选项。其中包括环境变量、要公开的端口和要连接的卷。
env: - name: nb_prefix value: /hub/jovyan/ports: - port: 8888 protocol: tcpvolumes: - mountpath: /home/jovyan 然后,指定支票。检查是针对容器运行的测试,以确保其符合要求。每个检查都包含一个与容器交互的探针。这些交互包括运行命令、发出 http 请求和 ping tcp 套接字。
container canary 中的探针是 库伯内特斯的那些 的超集,因此如果您以前使用过这些探针,应该对它们很熟悉。
checks: - name: mycheck # name of the check description: ensuring a thing # description of what is being checked (will be used in output) probe: ... # a probe to run exec检查会在正在运行的容器中运行命令。如果命令以 0 退出,则检查通过。
checks: - name: uid description: user id is 1234 probe: exec: command: - /bin/sh - -c - id | grep uid=1234 http get检查对您的容器执行http get请求。如果响应代码 /usr/local/bin/canary chmod +x /usr/local/bin/canary - name: build container run: docker build -t foo/canary-ci-example:latest . - name: validate container run: canary validate --file canary-validator.yaml foo/canary-ci-example:latest 现在,当您将代码推送到 github 时, actions runner 会签出代码,安装容器 canary ,构建容器映像,并使用canary validate对其进行验证。
图 1 在 github 操作工作流中成功运行 canary 验证
工作流程已经执行,我们的集装箱图像已经成功验证——而且很快!有关更多信息,请参阅 /jacobtomlinson/canary-ci-example github repo 中此示例的所有代码。
应用你学到的东西
使用 container canary ,您可以为您的容器映像定义具体的接口,并验证它们,以确保您构建的映像始终符合定义的规范。
如果您经常构建容器映像, container canary 在测试和 ci 环境中非常有用,因此它是测试工具包中的必备工具。容器开发人员可以成功地避免容器中的倒退,并更快地完成项目以节省时间。
关于作者
jacob tomlinson 是 nvidia 的高级 python 软件工程师,专注于分布式系统的部署工具。他的工作包括维护开源项目,包括 rapids 和 dask 。 rapids 是一套 gpu 加速开源 python 工具,模拟 pydata 堆栈中的 api ,包括 numpy 、 pandas 和 scikit learn 的 api 。 dask 为分析提供了高级并行性,包括核心外计算、延迟计算和 pydata 堆栈的分布式执行。玛丽·豪厄尔是 nvidia 全球云合作伙伴营销团队的成员。她参与了与合作伙伴的各种公司合作的规划、物流和营销,最近重点关注 nvidia 和 microsoft azure 之间的工作。玛丽住在西雅图,在高科技市场工作了 10 多年。


本本购前要领指南
智慧医院带来怎样的就医体验
业界首款弹盖磁吸式耳机手表——WATCH Buds
风电场的无功补偿设备一般安装在哪个位置?
蓝牙耳机降噪哪款好?300-500以内降噪蓝牙耳机推荐
使用Container Canary在多个平台上测试容器图像
格力多元化难言成功,依赖空调业务难实现6000亿营收愿景
NB-IoT产业短期困境并不影响长期趋势
如果美国不信任华为,华为会将更大规模的投资转移到英国进行
无线物联网中CoAP协议的研究与实现
关于PCB的应用与优势
小米拿到两大芯片首发资格,为何还会挨骂?
奔驰母公司戴姆勒与吉利汽车合作打造混合动力汽车的下一代引擎
VOX电路原理图分享
运算放大器需要考虑的电压范围
单网卡连接两个网段路由访问
中国半导体协会评选出中国半导体十大企业!
HM6050-2D线性阻抗稳定网络的特点性能及应用范围
功率MOSFET用途
北斗集成双向通信 能否撼动GPS