説明
idetcd は、ドメイン名の衝突なしでクラスタ内のノードを識別するために使用されます。基本的なアイデアは非常にシンプルです。クラスタを開始するときにすべてのノードで CoreDNS サーバーを設定し、ノードは etcd の空きドメイン名を取得して自己公開します。
構文
idetcd {
endpoint ENDPOINT...
limit LIMIT
pattern PATTERN
}
- エンドポイントは etcd エンドポイントを定義します。既定値は「https://#:2379」です。
- 制限はクラスタ内のノード番号の最大制限を定義します。クラスタ内のノード番号がこの制限に達した後にノードが自己公開しようとした場合は、失敗します。
- パターンは、クラスタ内のすべてのノードが従うドメイン名パターンを定義します。ここではパターンに Go テンプレートを使用します。
例
次の例では、5 つのノードを含むクラスタを起動します。すべてのノードで、このプロジェクトを次のように取得できます。
$ go get -u github.com/jiachengxu/idetcd
次のステップに進む前に、既に etcd インスタンスを設定済みであることを確認し、エンドポイントを書き留めておいてください。
次に、CoreDNS サーバーの設定を指定する Corefile を main.go
と同じディレクトリに追加する必要があります。簡単な 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 との統合
CoreDNS を idetcd プラグインと組み合わせて使用してクラスタを構成することは、一般的な構成プロセスとは異なる 1 回限のプロセスです。たとえば、AWS 上の複数のインスタンスを含むクラスタを設定する場合は、すべてのインスタンスに同じ構成を使用し、init
プロセスですべてのインスタンスを自己公開できます。これは、cloud-init
を ユーザーデータ
で使用することで実現できます。AWS インスタンスが起動時に実行する bash スクリプトの例を次に示します。
#!/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