在沙盒中运行不受信任的命令。
sandcastle的Python项目详细描述
沙堡
在沙箱中的城堡(openshift pod)中运行不受信任的代码。
用法
先决条件是您已登录到openshift集群:
$ oc status
In project Local Project (myproject) on server https://localhost:8443
最简单的用例是在新的openshift pod中调用命令:
fromsandcastleimportSandcastles=Sandcastle(image_reference="docker.io/this-is-my/image:latest",k8s_namespace_name="myproject")output=s.run(command=["ls","-lha"])
这些事情将会发生:
- 使用
image_reference
中的图像集创建一个新的pod。 - 库会主动等待pod完成。
- 如果pod以大于0的返回代码终止,则会引发异常。
- 命令的输出是从
.run()
方法返回的。
沙盒和当前pod之间共享数据
这个库允许您在运行它的pod之间和沙盒之间共享卷。
有一个专用类和一个接口来访问此功能:
VolumeSpec
类volume_mounts
沙堡建造师夸格
一个例子胜过千言万语:
frompathlibimportPathfromsandcastleimportSandcastle,VolumeSpec# the expectation is that volume assigned to PVC set# via env var SANDCASTLE_PVC is mounted in current pod at /pathvs=VolumeSpec(path="/path",pvc_from_env="SANDCASTLE_PVC")s=Sandcastle(image_reference="docker.io/this-is-my/image:latest",k8s_namespace_name="myproject",volume_mounts=[vs])s.run()s.exec(command=["bash","-c","ls -lha /path"])# will be emptys.exec(command=["bash","-c","mkdir /path/dir"])# will create a dirassertPath("/path/dir").is_dir()# should pass
通过复制共享数据
sandcastle能够在不同的名称空间中运行沙盒pod。这个 提高了安全性,因为锁定此项目的网络很简单- pod将无法访问openshift api服务器或您的任何服务 部署在群集中。有关详细信息,请查看egress rules 以及network policy。
设置此沙盒命名空间时,请确保服务帐户 您的应用程序部署在沙盒命名空间中的can manage pods中。 此命令应有帮助:
$ oc adm -n ${SANDBOX_NAMESPACE} policy add-role-to-user edit system:serviceaccount:${APP_NAMESPACE}:default
实际代码:
m_dir=MappedDir(local_dir,# share this dirsandbox_mountpoint,# make it available herewith_interim_pvc=True# the data will be placed in a volume)o=Sandcastle(image_reference=container_image,k8s_namespace_name=namespace,# can be a different namespacemapped_dir=m_dir,working_dir=sandbox_mountpoint,)o.run()# happy execingo.exec(command=["ls","-lha",f"{sandbox_mountpoint}/"])
开发沙堡
为了开发这个项目(并运行测试),需要满足几个需求。
使用makefile target
make test-image-build
生成容器映像。一个openshift集群并将其登录
这意味着运行
oc status
应该在需要的地方产生集群 运行测试。e2e测试
test_from_pod
构建当前代码库并运行另一个e2e POD中的测试:验证E2E功能。这意味着 openshift集群部署在当前环境中,这意味着 openshift可以访问Dockerd中的本地容器图像。否则 图像需要推到某个地方,以便openshift可以访问它。在默认的
oc cluster up
环境中,测试创建沙盒pod 使用分配给每个pod的默认服务帐户。这个SA 不具有创建或删除POD的权限(因此沙箱将 不工作)。使用此命令,SA可以更改 名称空间:oc adm policy add-role-to-user edit system:serviceaccount:myproject:default
Docker二进制和Docker守护进程正在运行。这是从第一点暗示的。