我在AWS集群中安装了mesosphere,其中包含一个主节点和两个节点,称之为master,node1和node2。主设备可见,节点是私有的。
我得到一个默认运行的马拉松实例和背面的docker支持。 Docker版本为1.6(已验证)。
所以我使用marathon安装了一个docker注册表图像,如Marathon docs中所述,有一些S3支持的变体,如下所示:
{
"id": "/docker/registry",
"instances": 1,
"cpus": 0.5,
"mem": 1024.0,
"disk": 128,
"container": {
"docker": {
"type": "DOCKER",
"image": "registry:2",
"network": "BRIDGE",
"portMappings": [
{
"containerPort": 5000,
"hostPort": 0,
"protocol": "tcp",
"servicePort": 5000
}
]
},
"volumes": []
},
"env": {
"APPLICATION_WEB_PROXY_BASE": "/service/docker_registry",
"SETTINGS_FLAVOR": "s3",
"REGISTRY_VERSION": "0.1",
"REGISTRY_LOG_LEVEL": "debug",
"REGISTRY_STORAGE": "s3",
"REGISTRY_STORAGE_S3_ACCESSKEY": "ACCESSKEY",
"REGISTRY_STORAGE_S3_SECRETKEY": "SECRETKEY",
"REGISTRY_STORAGE_S3_REGION": "us-east-1",
"REGISTRY_STORAGE_S3_BUCKET": "my-docker-registry",
"REGISTRY_STORAGE_S3_ROOTDIRECTORY": "/docker",
"AWS_PATH": "/docker",
"STORAGE_PATH": "/docker"
},
"ports": [ 0 ]
}
docker注册服务在其中一个节点中启动。说... node1.amazonaws.com:23456。请注意,马拉松随机选择节点和端口。如果我重新启动并且我不知道将事先选择哪个节点和端口,那么没有什么能保证同一个节点和端口将再次被选中。
所以注册表工作,我可以使用其余的API(从主服务器中的ssh行):wget node1.amazonaws.com:23456/v2,我得到了正确的json响应{}。
但是后来我想推送到服务器并得到这种消息
"FATA[0000] Error response from daemon: v1 ping attempt failed with error:
Get https://myregistrydomain.com:5000/v1/_ping: tls: oversized record received with length 20527.
If this private registry supports only HTTP or HTTPS with an unknown CA certificate,please add
`--insecure-registry myregistrydomain.com:5000` to the daemon's arguments.
In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag;
simply place the CA certificate at /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt"
所以我想我需要设置insecure-registry标志。或设置CA证书。因为我现在不需要证书,所以我只需要让它不安全。但是标志必须设置为--insecure-registry myregistrydomain.com:5000
。
但是你得到了问题,主机和端口是动态设置的。所以我无法在任何地方将它放入配置文件中(我不知道它在哪里使用CoreOS并且没有/ etc / default / docker文件)。
我试图将它传递到Marathon JSON App。我记得可以使用$HOST
和$PORT
env变量,所以我尝试将它们作为参数添加到容器中:
...
container:
"network": "BRIDGE",
"parameters": [{ "key": "insecure-registry", "value": "$HOST:$PORT" }],
"portMappings": [
...
但服务刚刚开始。然后我尝试在args中设置它:
...
"disk": 128,
"args": ["--insecure-registry $HOST:$PORT"],
"container": {
...
但我收到一条消息说:
Executor registered on slave 20150928-002726-2617573386-5050-1278-S1
flag provided but not defined: -insecure-registry
所以我尝试将DOCKER_OPTS env变量设置为:
"env": {
"DOCKER_OPTS": "--insecure-registry $HOST:$PORT",
"APPLICATION_WEB_PROXY_BASE": "/service/docker_registry",
但它只是忽略了旗帜。
换句话说,我不知道在哪里让它变得不安全。
非常感谢任何想法。
谢谢!
答案 0 :(得分:2)
我认为这个问题在概念上是错误的。当我必须将--insecure-registry
标志添加到将访问注册表的docker守护程序时,我试图将mesos-dns
标志添加到注册表中。在DCOS的情况下,必须将其添加到每个从节点。
通过迈克尔的建议,我认为可以通过锁定注册表端口并使用--insecure-registry dockerregistry.marathon.mesos:5000
来解析从属主机名来解决这个问题,所以例如我可以使用DNS名称dockerregistry.marathon.mesos来解决这个问题。服务器和锁定端口5000,即:
public void ConfigureServices(IServiceCollection services)
{
var env = services.BuildServiceProvider().GetRequiredService<IHostingEnvironment>();
if (env.IsDevelopment())
Console.WriteLine("Development");
else if (env.IsProduction())
Console.WriteLine("Production");
else if (env.IsEnvironment("MyCustomEnvironment"))
Console.WriteLine("MyCustomEnvironment");
}
当然这会限制我在任何时候只在一台服务器上运行一个实例,但一切都好,我只需要一个实例。重要的是,当一个新实例启动时,它指向正确的S3存储桶。
所以,问题是现在如何在整个集群中添加此标志重新启动CoreOS中运行的docker守护程序,但我认为这是另一个问题。
答案 1 :(得分:1)
从上面链接的示例中复制并粘贴:
在群集的所有代理节点中运行此功能:
$ sudo tee /etc/systemd/system/docker.service.d/override.conf <<-'EOF'
[Service]
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// $OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY \
--storage-driver=overlay \
--insecure-registry registry.marathon.l4lb.thisdcos.directory:5000
EOF
systemctl daemon-reload
systemctl restart docker
答案 2 :(得分:0)
您可以在Marathon应用规范中通过constraints强制部署某些节点,如下例所示:
...
"constraints": [
[
"hostname",
"LIKE",
"node1.amazonaws.com"
]
]
...