use*_*135 5 amazon-web-services amazon-vpc mesos mesosphere docker-registry
我们在AWS上使用Mesosphere在私有VPC中建立了一个测试集群.我们有一些公共的Docker镜像,这些镜像很容易部署.但是,我们的大多数服务都是私有映像,托管在Docker Hub私有计划上,并且需要身份验证才能访问.
Mesosphere能够进行私有注册表身份验证,但它以不太完美的方式实现:需要在所有Mesos/Marathon任务定义中指定.dockercfg文件的HTTPS URI.
正如标题所暗示的那样,问题基本上是:.dockercfg文件应该如何在AWS中托管,以便访问可能仅限于Mesos master + slaves尽可能紧密?
use*_*135 13
由于Mesos文档在这方面很差,我将回答这个wiki风格,并在我去的时候更新这个答案.
在S3上托管.dockercfg文件.为了更好的安全性,您应该考虑将其放在自己的桶中,或者专门用于存储机密的桶.这提出了一些有趣的挑战,即创建一个实际上可以锁定S3存储桶的安全策略,这样只有Mesos可以看到它,但是可以完成.
Mesos任务配置:
{
...
"uris": ["https://s3-eu-west-1.amazonaws.com/my-s3-bucket-name/.dockercfg"]
...
}
Run Code Online (Sandbox Code Playgroud)
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": "*"
}]
}
Run Code Online (Sandbox Code Playgroud)
您还需要一个VPCE配置,为您提供一个VPCE ID,以插入上面的S3存储桶条件.(我想如果你不使用VPC端点,你可以匹配一个VPC id?)
您可以通过转到Mesos UI来检查这是否有效(如果您使用的是DCOS,这不是漂亮的DCOS UI)并观察具有应用程序名称的任务是否出现在"活动任务"或"已完成任务"列表中.
在这个S3变体中,我们不使用基于网络的访问限制,而是使用.dockercfg文件的签名URL.
Mesos任务配置应如下所示:
{
...
"uris": ["https://my-s3-bucket/.dockercfg?AWSAccessKeyId=foo&Expires=bar&Signature=baz"]
...
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,上述S3签名URL策略不起作用,因为Mesos-1686观察到任何下载的文件都保留了远程文件名,包括查询字符串,导致文件名如".dockercfg?AWSAccessKeyId = foo&Expires = bar&Signature = baz".由于Docker客户端无法识别该文件,除非它被命名为".dockercfg",因此无法看到auth凭据.
人们可以通过SCP.dockercfg到每个Mesos奴隶.虽然这是一个快速修复,它:
如果使用像Chef这样的配置管理工具进行自动化,可以将其转换为更可行的生产方法,该工具将在从属设备上运行,并将.dockercfg文件拉入正确的位置.
这将导致如下配置:
{
...
"uris": ["file:///home/core/.dockercfg"]
...
}
Run Code Online (Sandbox Code Playgroud)
由于'core'是基于CoreOS的Mesos从服务器上的默认用户,并且.dockercfg按照约定被期望位于想要使用Docker的当前用户的主目录中.
更新:这应该是最可靠的方法,但我还没有找到办法.就Marathon而言,该应用程序仍处于"部署"阶段.
当我们处理用户名和密码时,AWS密钥管理服务(甚至极端的CloudHSM)似乎应该是一个好主意 - 但AFAIK Mesos没有内置支持,我们不处理个人变量但是一个文件.
在设置了您选择的解决方案之后,您可能会发现.dockercfg文件正在被拉下来但是您的应用程序仍处于"部署"阶段.检查一下......
在某些时候,'auth'字段的格式已更改.如果您提供的.dockercfg与此格式不匹配,则docker pull将无提示失败.集群从属服务器上的Mesos Docker版本期望的格式是:
{
"https://index.docker.io/v1/": {
"auth": [base64 of the username:password],
"email": "your_docker_registry_user@yourdomain.com"
}
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试部署Web应用程序,请确保您没有使用主机端口80 - 它不是在文档中的任何位置编写的,但Mesos Web服务需要自己的端口80,如果您尝试为自己的应用程序获取80它会永远挂起来.精明的读者会注意到,除了其他原因,这就是为什么Mesosphere"Oinker"Web应用程序绑定到端口0的略微不寻常的选择.
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |