5

我们在私有 VPC 中在 AWS 上使用 Mesosphere 建立了一个测试集群。我们有一些公开的 Docker 镜像,它们很容易部署。但是,我们的大多数服务都是私有镜像,托管在 Docker Hub 私有计划上,并且需要身份验证才能访问。

Mesosphere 能够进行私有注册表身份验证,但它以一种不完全理想的方式实现了这一点:需要在所有 Mesos/Marathon 任务定义中指定 .dockercfg 文件的 HTTPS URI。

正如标题所暗示的,问题基本上是:如何将 .dockercfg 文件托管在 AWS 中,以便尽可能严格地将访问权限限制在 Mesos 主从服务器上?

4

4 回答 4

13

由于 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 的稍微不寻常的选择。

于 2015-07-02T09:15:10.430 回答
2

我见过的许多项目都使用您提到的 S3 方法。您的观点仍然有效,我们应该/将在社区中讨论这一点。

于 2015-06-29T06:16:42.433 回答
2

您还可以在 HDFS 或 FTP/FTPS 服务器中托管 .dockercfg。如果 HTTPS 不可接受,Mesos 提取器可以支持任何这些协议。

于 2015-06-30T07:57:44.860 回答
1

您可以在集群中部署一个简单的 S3 代理服务,以便使用标准 Mesos 提取器从受凭证保护的 S3 存储桶下载:github.com/adyatlov/s3proxy。不需要 HDFS 或其他存储机密信息。

于 2016-07-11T00:07:06.140 回答