【问题标题】:Apache Mesos,MESOS-DNS, MARATHON and DockerApache Mesos、MESOS-DNS、MARATHON 和 Docker
【发布时间】:2016-02-29 23:26:40
【问题描述】:

在我的环境中以独立模式运行 mesos-slave、mesos-master marathon 和 mesos-dns。 我将 mysql 应用程序部署到 marathon 以作为 docker 容器运行。

MySql 应用配置如下。

{
    "id": "mysql",
    "cpus": 0.5,
    "mem": 512,
    "instances": 1,
    "container": {
        "type": "DOCKER",
        "docker": {
            "image": "mysql:5.6.27",
            "network": "BRIDGE",            
              "portMappings": [
                {
                  "containerPort": 3306,
                  "hostPort": 32000,
                  "protocol": "tcp"
                }
                ]
        }
    },
    "constraints": [
            [
              "hostname",
              "UNIQUE"
            ]],
    "env": {
        "MYSQL_ROOT_PASSWORD": "password"   
    },
      "minimumHealthCapacity" :0,
      "maximumOverCapacity" : 0.0
}

然后我部署名为 mysql 客户端的应用程序。 mysql客户端app需要连接mysql app。

mysql 应用配置如下。

{
    "id": "mysqlclient",
    "cpus": 0.3,
    "mem": 512.0,
    "cmd": "/scripts/create_mysql_dbs.sh",
    "instances": 1,
    "container": {
        "type": "DOCKER",
        "docker": {
            "image": "mysqlclient:latest",
            "network": "BRIDGE",            
            "portMappings": [{
                "containerPort": 3306,
                "hostPort": 0,
                "protocol": "tcp"
            }]
        }
    },
    "env": {
        "MYSQL_ENV_MYSQL_ROOT_PASSWORD": "password",
        "MYSQL_PORT_3306_TCP_ADDR": "mysql.marathon.slave.mesos.",
        "MYSQL_PORT_3306_TCP_PORT": "32000"     
    },
      "minimumHealthCapacity" :0,
      "maximumOverCapacity" : 0.0
}

我的 mesos-dns config.json。如下

{
  "zk": "zk://127.0.0.1:2181/mesos",
  "masters": ["127.0.0.1:5050"],
  "refreshSeconds": 60,
  "ttl": 60,
  "domain": "mesos",
  "port": 53,
  "resolvers": ["127.0.0.1"],
  "timeout": 5,
  "httpon": true,
  "dnson": true,
  "httpport": 8123,
  "externalon": true,
  "listener": "127.0.0.1",
  "SOAMname": "ns1.mesos",
  "SOARname": "root.ns1.mesos",
  "SOARefresh": 60,
  "SOARetry":   600,
  "SOAExpire":  86400,
  "SOAMinttl": 60,
  "IPSources": ["mesos", "host"]
}
I can ping with service name mysql.marathon.slave.mesos. from host machine. But when I try to ping from mysql docker container I get host unreachable. Why docker container cannot resolve hsot name?

我尝试将 dns 参数设置为应用程序。但它不起作用。

编辑

我可以 ping mysql.marathon.slave.mesos。从主/从主机。但我无法从 mysqlclient docker 容器 ping 通。它说无法到达。我该如何解决这个问题?

【问题讨论】:

  • 你有什么问题?

标签: mysql docker dns mesos marathon


【解决方案1】:

不确定您的实际问题是什么,通过猜测,我认为您想知道如何将 Mesos DNS 服务名称解析为 MySQL 客户端的实际端点。

如果是这样,您可以使用我的mesosdns-resolver bash 脚本从 Mesos DNS 获取端点:

mesosdns-resolver.sh -sn mysql.marathon.mesos -s <IP_ADDRESS_OF_MESOS_DNS_SERVER>

您可以在您的create_mysql_dbs.sh 脚本中使用它(无论它做什么)来获取您的mysql 应用程序正在运行的实际IP 地址和端口。

你可以传入一个环境变量,比如

"MYSQL_ENV_SERVICE_NAME": "mysql.marathon.mesos"

然后在图像/脚本中像这样使用它

mesosdns-resolver.sh -sn $MYSQL_ENV_SERVICE_NAME -s <IP_ADDRESS_OF_MESOS_DNS_SERVER>

另外,请注意,Marathon 不一定是运行一次性操作的正确工具(我假设您使用第二个应用程序初始化数据库)。 Chronos 将是一个更好的选择。

【讨论】:

  • 我的问题是,我可以 ping mysql.marathon.slave.mesos。形成主/从主机。但我无法从 mysqlclient docker 容器 ping 通。它说无法访问。
  • 好吧,请让自己适应主机和桥接网络的差异。使用像 Mesos DNS 这样的服务发现工具的全部意义在于,您不需要为应用程序指定固定的 ip/ports,因为集群会根据资源和/或约束来决定将应用程序放在哪里。查看我的编辑。
  • 感谢托比的回复。需要这个 mesosdns-resolver.sh 脚本在容器中运行 dig?
  • 它基本上是 dig 的包装器......它解析来自 Mesos DNS 的 SRV 记录响应。您还应该注意使用真实 IP 地址而不是 127.0.0.1,因为这可能无法在容器内工作
  • Tobi,您的脚本返回 mysql 服务的 IP 地址和端口。但我的要求是使用主机名引用 mysql 服务器。在扩展时如果 marathon 启动了一个新的 mysql 服务器并且 ip 发生了变化,我需要使用主机名来引用 mysql 服务器。不应更改主机名。我可以使用 mesos-dns 做到这一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
相关资源
最近更新 更多