由于 Mesos 文档在这方面做得很差,我将回答这个 wiki 风格并随时更新这个答案。
应该有效的策略
在 S3 上托管(具有基于网络的访问限制)
在 S3 上托管 .dockercfg 文件。为了获得更好的安全性,您应该考虑将其放在自己的存储桶中,或者专门用于存储机密的存储桶中。这在创建安全策略时提出了一些有趣的挑战,该策略实际上将锁定 S3 存储桶,以便只有 Mesos 可以看到它,但它可以完成。
Mesos 任务配置:
{
...
"uris": ["https://s3-eu-west-1.amazonaws.com/my-s3-bucket-name/.dockercfg"]
...
}
S3 存储桶策略(使用 VPC 终端节点):
注意:这个策略允许允许的主体做任何事情,这对于生产来说太草率了,但在测试集群中调试时应该会有所帮助。
{
"Id": "Policy123456",
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt123456",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-s3-bucket",
"arn:aws:s3:::my-s3-bucket/*"
],
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-my-mesos-cluster-vpce-id"
}
},
"Principal": "*"
}]
}
您还需要一个 VPCE 配置,为您提供一个 VPCE ID 以插入上面的 S3 存储桶条件。(我想如果您不使用 VPC 端点,您可以只匹配 VPC id 吗?)
您可以通过转到 Mesos UI(如果您使用的是 DCOS,这不是漂亮的 DCOS UI)并观察具有您的应用程序名称的任务是否出现在 Active Tasks 或 Completed Tasks 列表中来检查这是否有效。
无效的诱人策略(尚未)
在 S3 上托管(带有签名的 URL)
在这个 S3 变体中,我们没有使用基于网络的访问限制,而是使用 .dockercfg 文件的签名 URL。
Mesos 任务配置应如下所示:
{
...
"uris": ["https://my-s3-bucket/.dockercfg?AWSAccessKeyId=foo&Expires=bar&Signature=baz"]
...
}
不幸的是,由于Mesos-1686 ,上述 S3 签名 URL 策略不起作用,它观察到任何下载的文件都准确地保留了远程文件名,包括查询字符串,导致文件名类似于“.dockercfg?AWSAccessKeyId=foo&Expires=bar&Signature=baz”。由于 Docker 客户端无法识别该文件,除非它被准确命名为“.dockercfg”,因此它无法看到身份验证凭据。
将 .dockercfg 文件直接传输到每个从站
可以将 .dockercfg SCP 分配给每个 Mesos 从站。虽然这是一个快速修复,但它:
- 需要提前了解所有的奴隶
- 不会随着新的从属服务器添加到集群而扩展
- 需要对从属设备进行 SSH 访问,这些从属设备是在他们自己的 VPC 中配置的(因此他们的 IP 地址通常在 10.0.[blah] 范围内)。
如果使用像 Chef 这样的配置管理工具自动化,这可以变成一种更可行的生产方法,该工具将在从属服务器上运行,并将 .dockercfg 文件拉到正确的位置。
这将导致如下配置:
{
...
"uris": ["file:///home/core/.dockercfg"]
...
}
由于“core”是基于 CoreOS 的 Mesos 从属服务器上的默认用户,并且 .dockercfg 按照惯例应该位于想要使用 Docker 的当前用户的主目录中。
更新:这应该是最可靠的方法,但我还没有找到方法。就 Marathon 而言,该应用程序仍然永远停留在“部署”阶段。
使用密钥库服务
当我们处理用户名和密码时,AWS Key Management Service(甚至是极端情况下的 CloudHSM)似乎应该是一个好主意 - 但 AFAIK Mesos 对此没有内置支持,我们不处理个人变量,但一个文件。
故障排除
在您设置好您选择的解决方案后,您可能会发现 .dockercfg 文件已被下拉,但您的应用程序仍停留在“部署”阶段。检查这些东西...
确保您的 .dockercfg 是 Mesos Docker 版本的正确格式
在某些时候,“auth”字段的格式发生了变化。如果您提供的 .dockercfg 与此格式不匹配,则 docker pull 将静默失败。集群从属服务器上的 Mesos Docker 版本所期望的格式是:
{
"https://index.docker.io/v1/": {
"auth": [base64 of the username:password],
"email": "your_docker_registry_user@yourdomain.com"
}
}
不要为您的应用使用端口 80
如果您尝试部署 Web 应用程序,请确保您没有使用主机端口 80 - 它没有写在文档中的任何地方,但 Mesos Web 服务本身需要端口 80,如果您尝试为自己的应用程序使用 80它会永远挂起。精明的读者会注意到,除其他原因外,这就是为什么 Mesosphere “Oinker” Web 应用程序绑定到端口 0 的稍微不寻常的选择。