如何在AWS Mesosphere-on-AWS设置中托管.dockercfg文件,以便只有Mesosphere可以使用它?

时间:2015-06-26 14:25:59

标签: amazon-web-services mesos amazon-vpc docker-registry mesosphere

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

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

正如标题所示,问题基本上是:如何在AWS中托管.dockercfg文件,以便尽可能严格地限制访问Mesos master + slaves?

4 个答案:

答案 0 :(得分: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)并观察具有应用名称的任务是否出现在活动任务或已完成的任务中列表。

暂时不起作用的策略

在S3(带有签名的URL)

上托管它

在这个S3变体中,我们使用的是.dockercfg文件的签名URL,而不是使用基于网络的访问限制。

Mesos任务配置应如下所示:

{
  ...
  "uris": ["https://my-s3-bucket/.dockercfg?AWSAccessKeyId=foo&Expires=bar&Signature=baz"]
  ...
}

不幸的是,上述S3签名网址策略无法正常工作,因为Mesos-1686会发现任何下载的文件都保留了远程文件名,包括查询字符串,导致文件名如“ .dockercfg AWSAccessKeyId = FOO&安培;过期=栏&安培;签名= baz”的。由于Docker客户端无法识别该文件,除非它被命名为“.dockercfg”,因此无法看到auth凭据。

将.dockercfg文件直接传输到每个从属

人们可以通过SCP.dockercfg到每个Mesos奴隶。虽然这是一个快速修复,但它:

  • 需要提前知道所有奴隶
  • 不会随着新的从属服务器添加到集群中而扩展
  • 要求对从属设备进行SSH访问,这些从属设备在自己的VPC中配置(因此它们的IP地址通常在10.0。[blah]范围内)。

如果使用像Chef这样的配置管理工具进行自动化,可以将其转换为更可行的生产方法,该工具将在从属设备上运行,并将.dockercfg文件拉到正确的位置。

这将导致如下配置:

{
  ...
  "uris": ["file:///home/core/.dockercfg"]
  ...
}

由于'core'是基于CoreOS的Mesos从服务器上的默认用户,并且按惯例,.dockercfg应该位于想要使用Docker的当前用户的主目录中。

更新:这应该是最可靠的方法,但我还没有找到办法。就Marathon而言,该应用程序仍处于“部署”阶段。

使用密钥库服务

当我们处理用户名和密码时,AWS密钥管理服务(甚至极端的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的略微不寻常的选择相关联。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以在群集中部署简单的S3代理服务,以便使用标准的Mesos提取程序从受凭据保护的S3存储桶下载:github.com/adyatlov/s3proxy。没有HDFS或其他存储空间需要保密。