idetcd

源代码 主页

使用以下命令启用
idetcd:github.com/jiachengxu/idetcd

idetcd - 基于 etcd 的 CoreDNS 插件,用于在没有域名冲突的情况下识别集群中的节点。

描述

idetcd 用于在没有域名冲突的情况下识别集群中的节点。基本思想非常简单:在你启动集群时在每个节点上设置 CoreDNS 服务器,而节点通过在 etcd 中获取免费域名来展现自身。

语法

idetcd {
	endpoint ENDPOINT...
	limit LIMIT
	pattern PATTERN
}
  • endpoint 定义 etcd 端点。默认为“http://localhost:2379”。
  • limit 定义集群中节点数量的最大限制,如果在集群中的节点数量达到此限制后有其他节点准备展现自身,则会失败。
  • pattern 定义集群中每个节点遵循的域名模式。在此,我们为模式使用 golang 模板。

示例

在以下示例中,我们将启动一个包含 5 个节点的集群,在每个节点上,我们可以通过以下方法获取此项目

$ go get -u github.com/jiachengxu/idetcd

在继续执行下一步之前,请确保你已设置 etcd 实例,并且不要忘记写下端点。

然后,你需要在 main.go 的同一目录中添加一个指定 CoreDNS 服务器配置的 Corefile,一个简单的 Corefile 示例如下,有关更多详细信息,请访问 CoreDNS GitHub 存储库

. {
    idetcd {
        endpoint ETCDENDPOINTS
        limit 5
        pattern worker{{.ID}}.tf.local.
    }
}

然后,你可以通过执行以下命令生成二进制文件

$ go build -v -o coredns

或者,如果你已安装 Docker,也可以执行以下命令进行构建

$ docker run --rm -i -t -v $PWD:/go/src/github.com/jiachengxu/idetcd \
      -w /go/src/github.com/jiachengxu/idetcd golang:1.10 go build -v -o coredns

然后通过以下命令运行它

$ ./coredns

在那之后,集群中的所有节点都将尝试在 etcd 中找到空闲插槽来展现自身,一旦成功,你可以通过以下方法在同一集群中的每个节点上获取每个节点的域名

$ dig +short worker4.tf.local @localhost

此外,它还支持 ipv6

$ dig +short worker4.tf.local AAAA @localhost

与 AWS 集成

使用带有 idetcd 插件的 CoreDNS 配置集群是一个一次性过程,这与常规配置过程不同。例如,如果你想设置一个在 AWS 上包含多个实例的集群,你可以对每个实例使用相同的配置,并在init 过程中让所有实例展现自身。这一点可以通过在 user data 中使用 cloud-init 来实现。以下是一个 bash 脚本示例,可在 AWS 实例启动时执行

#!/bin/bash
set -x
## Install docker.
yum install -y docker
echo
chkconfig docker on
service docker start
echo
## Install git.
yum install -y git
git clone https://github.com/jiachengxu/idetcd.git /home/ec2-user/idetcd
cd /home/ec2-user/idetcd
## Using docker to build the binary file of CoreDns with idetcd plugin specified.
docker run --rm -v $PWD:/go/src/github.com/jiachengxu/idetcd -w /go/src/github.com/jiachengxu/idetcd golang:1.10 go build -v -o coredns
## Create a Corefile for specifying the configuration of CoreDNS.(Don't forget to replace the ETCDENDPOINTS and NUMBER with your own etcd endpoints and limit of node in the cluster!)
cat > Corefile << EOF
. {
    idetcd {
        endpoint ETCDENDPOINTS
        limit NUMBER
        pattern worker{{.ID}}.tf.local.
    }
}
EOF
./coredns