ETCD:マルチマシン上のクラスタ
19683 ワード
原文住所:cluster on multiple machines
総覧
クラスタ静的を開始するには、各クラスタのメンバーが他のメンバーの位置を知る必要があります.多くの場合、クラスタメンバーのIPは事前に知られていない可能性があります.この場合、etcdクラスタは、サービスの発見の助けを得て起動することができる.etcdクラスタが起動されると、メンバーの追加または削除は、実行時に再構成できます.実行時に再構成する前に、設計をよりよく理解するために、実行時に設計ドキュメントを再構成することをお勧めします.このブートetcdクラスタの起動には、次のメカニズムが含まれます.静的 etcd発見 DNS発見 各ブートメカニズムは、以下の詳細を持つ3台のコンピュータetcdクラスタを作成するために使用されます.
Name
Address
Hostname
infra0
10.0.1.10
infra0.example.com
infra1
10.0.1.11
infra1.example.com
infra2
10.0.1.12
infra2.example.com
静的
クラスタのメンバーは、起動前にアドレスとクラスタのサイズを設定し、
TLS
etcdはTLSプロトコルによる暗号化通信をサポートする.TLSチャネルは、クラスタ内通信で使用してもよいし、ノードとクライアントのトラフィック通信で使用してもよい.この部分では,ノードとクライアントTLSとの通信のためのクラスタ設定を列挙する.追加されたetcdのTLSサポート情報の詳細は、セキュリティブートで確認できます.
自己署名証明書
クラスタは、セルフ署名証明書を使用してトラフィックと接続権限を暗号化します.自己署名証明書を使用してクラスタを起動し、各クラスタメンバーは、ノード接続およびクライアント接続のために、共有クラスタCA証明書(
証明書の自動化
クラスタが暗号化通信を必要とするが接続時の権限認証を必要としない場合、etcdは鍵を自動的に生成するように構成することができる.初期化段階において、etcdメンバーは、自身のIpアドレスとホストに基づいて独自の鍵を生成する.各ホストでは、etcdはこれらのパラメータに基づいて起動する必要があります.
エラー・ケース
次の例では、新しいホストは列挙されたノードリストに含まれていません.これが新しいクラスタである場合、ノードは初期化クラスタメンバーのリストに追加する必要があります.
以下の例では、クラスタリスト内のアドレスが(10.0.1.10:2380)である異なるアドレスにノード(infra 0)をマッピングしようとする.このノードが複数のポートをリスニングする場合、すべてのアドレスは
ノードが異なるクラスタのパラメータとして構成する、このクラスタに参加しようとすると、etcdはクラスタIDの不一致を報告して終了する.
検出サービス
多くの場合、クラスタノードは、事前にIpアドレスを知ることができない.これは、クラウドサービスプロバイダやDHCPを使用するネットワークでよく見られます.この場合、静的な構成ではなく、存在するetcdクラスタを用いて新しいノードを起動するプロセスを「ノード発見」と呼ぶ.
ノードを検出するには、次の2つの方法があります. etcd検出サービス DNS SRVレコード etcd検出サービス
発見サービスプロトコルの設計をよりよく理解するために、発見サービスプロトコルのドキュメントを読むことをお勧めします.発見サービスURLのライフサイクル発見URLは、既存の発見URLを使用するのではなく、独自のetcdクラスタを識別する.各etcdインスタンスは、新しい発見URLを共有して新しいクラスタを起動します.また、URLは起動クラスタを初期化するときのみ使用すべきであることが判明し、起動済みクラスタのメンバー関係を変更する必要がある場合は、実行時にブートを再構成する.カスタムetcd発見サービス発見サービスは、存在するクラスタを起動するために使用され、プライベートetcdクラスタを使用する場合、このようにURLを作成します.
URL中のKeyのサイズを設定ことで、発見URLを作成するクラスタの予想サイズは3である.この場合、URLは次のように使用されます.
etcdメンバーが起動すると使用されます
フォルダを登録します.各メンバーには、異なる名前付きパラメータが含まれている必要があります.
すべてのホストが登録されると、各クラスタメンバーは、クラスタが起動する前にカスタム発見サービスに自分自身を登録します.共通のetcd発見サービスは、入手可能なクラスタがなければ、
初期化メンバー数3のクラスタが作成され、サイズが設定されていない場合はデフォルト3になります.
これらの関連パラメータを使用して、etcdメンバーを起動します.
すべてのホストが登録されると、各クラスタメンバーは、クラスタが起動する前にカスタム発見サービスに自分自身を登録します.etcdは、環境変数
警告ここには、サービスURLがこのホストに無視されることを発見したという重大な警告があります.
DNS検出サービス
DNS SRV記録は発見機構として利用できる. _etcd-server-ssl._tcp.example.com _etcd-server._tcp.example.com _etcd-client._tcp.example.com _etcd-client-ssl._tcp.example.com
etcdがカスタム証明書発行機関のないTLSを使用している場合、ドメイン(例えばexample.com)はSRVレコードドメイン(例えばinfra 1.example.com)と一致しなければならないことが分かった.SRV記録を偽造して異なるドメインへの攻撃を緩和するためだ.このドメインはPKIの下で有効な証明書を持つが、未知のサードパーティによって制御される. _etcd-server-ssl-foo._tcp.example.com _etcd-server-foo._tcp.example.com
DNS SRVレコードの作成
DNSブートetcdクラスタetcdクラスタメンバーを使用すると、ドメイン名またはIPアドレスを通知でき、ブートプロセスはDNS Aレコードを解析します.3.2から(3.1に警告が表示されます)、
クラスタは、ドメイン名ではなくIPアドレスを使用して起動することもできます.
v 3から1.0(v 3.2.9を除く)のため、
総覧
クラスタ静的を開始するには、各クラスタのメンバーが他のメンバーの位置を知る必要があります.多くの場合、クラスタメンバーのIPは事前に知られていない可能性があります.この場合、etcdクラスタは、サービスの発見の助けを得て起動することができる.etcdクラスタが起動されると、メンバーの追加または削除は、実行時に再構成できます.実行時に再構成する前に、設計をよりよく理解するために、実行時に設計ドキュメントを再構成することをお勧めします.このブートetcdクラスタの起動には、次のメカニズムが含まれます.
Name
Address
Hostname
infra0
10.0.1.10
infra0.example.com
infra1
10.0.1.11
infra1.example.com
infra2
10.0.1.12
infra2.example.com
静的
クラスタのメンバーは、起動前にアドレスとクラスタのサイズを設定し、
initial-cluster
パラメータを設定してオフラインの起動構成を使用することができます.各マシンは、次の環境変数またはコマンドラインを使用して構成情報を取得します.ETCD_INITIAL_CLUSTER="infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
ETCD_INITIAL_CLUSTER_STATE=new
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
initial-cluster
におけるURLsは、対応するノード上のinitial-advertise-peer-urls
の値に対応するべきである、パブリッシュされたピアノードのURLsである必要があることに留意されたい.テストの目的で同じ構成でマルチクラスタを分解(または単一クラスタの作成と削除)する場合、etcdは、各クラスタにユニークなinitial-cluster-token
を与えるべきであることに注意してください.これらの作業を行うことで、同じ構成を有していても、クラスタメンバーにユニークなクラスタIdとメンバーIDを生成することができます.これにより、クラスタを乱す可能性のあるクラスタ間インタラクションにおいてetcdを保護することができる.etcdはlisten-client-urls
でクライアントトラフィックを受信し、etcdはadvertise-client-urls
で指定されたURLsを他のメンバー、エージェント、クライアントに通知する.潜在的なクライアントがadvertise-client-urls
を取得できることを確認してください.一般的なエラーリモートクライアントがetcdにアクセスする必要がある場合、advertise-client-urls
をlocalhostに設定するか、デフォルト値として保持します.各マシンでetcdを起動するには、これらのパラメータを使用します.$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state new
initial-cluster
で始まるコマンドラインパラメータは、etcdの起動後に無視されます.初期化が開始されると、環境変数またはコマンドラインパラメータを自由に削除できます.起動後に構成情報を変更する必要がある場合(クラスタからメンバーを追加または削除するなど)、実行時にブートを構成します.TLS
etcdはTLSプロトコルによる暗号化通信をサポートする.TLSチャネルは、クラスタ内通信で使用してもよいし、ノードとクライアントのトラフィック通信で使用してもよい.この部分では,ノードとクライアントTLSとの通信のためのクラスタ設定を列挙する.追加されたetcdのTLSサポート情報の詳細は、セキュリティブートで確認できます.
自己署名証明書
クラスタは、セルフ署名証明書を使用してトラフィックと接続権限を暗号化します.自己署名証明書を使用してクラスタを起動し、各クラスタメンバーは、ノード接続およびクライアント接続のために、共有クラスタCA証明書(
ca.crt
)によって署名された一意の鍵ペア(member.crt
、member.key
)を含む必要がある.証明書は、次のetcdTLS設定例で生成できます.各マシンについて、etcdはこれらのパラメータで起動する必要があります.$ etcd --name infra0 --initial-advertise-peer-urls https://10.0.1.10:2380 \
--listen-peer-urls https://10.0.1.10:2380 \
--listen-client-urls https://10.0.1.10:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.10:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--client-cert-auth --trusted-ca-file=/path/to/ca-client.crt \
--cert-file=/path/to/infra0-client.crt --key-file=/path/to/infra0-client.key \
--peer-client-cert-auth --peer-trusted-ca-file=ca-peer.crt \
--peer-cert-file=/path/to/infra0-peer.crt --peer-key-file=/path/to/infra0-peer.key
$ etcd --name infra1 --initial-advertise-peer-urls https://10.0.1.11:2380 \
--listen-peer-urls https://10.0.1.11:2380 \
--listen-client-urls https://10.0.1.11:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.11:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--client-cert-auth --trusted-ca-file=/path/to/ca-client.crt \
--cert-file=/path/to/infra1-client.crt --key-file=/path/to/infra1-client.key \
--peer-client-cert-auth --peer-trusted-ca-file=ca-peer.crt \
--peer-cert-file=/path/to/infra1-peer.crt --peer-key-file=/path/to/infra1-peer.key
$ etcd --name infra2 --initial-advertise-peer-urls https://10.0.1.12:2380 \
--listen-peer-urls https://10.0.1.12:2380 \
--listen-client-urls https://10.0.1.12:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.12:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--client-cert-auth --trusted-ca-file=/path/to/ca-client.crt \
--cert-file=/path/to/infra2-client.crt --key-file=/path/to/infra2-client.key \
--peer-client-cert-auth --peer-trusted-ca-file=ca-peer.crt \
--peer-cert-file=/path/to/infra2-peer.crt --peer-key-file=/path/to/infra2-peer.key
証明書の自動化
クラスタが暗号化通信を必要とするが接続時の権限認証を必要としない場合、etcdは鍵を自動的に生成するように構成することができる.初期化段階において、etcdメンバーは、自身のIpアドレスとホストに基づいて独自の鍵を生成する.各ホストでは、etcdはこれらのパラメータに基づいて起動する必要があります.
$ etcd --name infra0 --initial-advertise-peer-urls https://10.0.1.10:2380 \
--listen-peer-urls https://10.0.1.10:2380 \
--listen-client-urls https://10.0.1.10:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.10:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--auto-tls \
--peer-auto-tls
$ etcd --name infra1 --initial-advertise-peer-urls https://10.0.1.11:2380 \
--listen-peer-urls https://10.0.1.11:2380 \
--listen-client-urls https://10.0.1.11:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.11:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--auto-tls \
--peer-auto-tls
$ etcd --name infra2 --initial-advertise-peer-urls https://10.0.1.12:2380 \
--listen-peer-urls https://10.0.1.12:2380 \
--listen-client-urls https://10.0.1.12:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://10.0.1.12:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=https://10.0.1.10:2380,infra1=https://10.0.1.11:2380,infra2=https://10.0.1.12:2380 \
--initial-cluster-state new \
--auto-tls \
--peer-auto-tls
エラー・ケース
次の例では、新しいホストは列挙されたノードリストに含まれていません.これが新しいクラスタである場合、ノードは初期化クラスタメンバーのリストに追加する必要があります.
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls https://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--initial-cluster infra0=http://10.0.1.10:2380 \
--initial-cluster-state new
etcd: infra1 not listed in the initial cluster config
exit 1
以下の例では、クラスタリスト内のアドレスが(10.0.1.10:2380)である異なるアドレスにノード(infra 0)をマッピングしようとする.このノードが複数のポートをリスニングする場合、すべてのアドレスは
initial-cluster
パラメータ構成に反射する必要があります.$ etcd --name infra0 --initial-advertise-peer-urls http://127.0.0.1:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380 \
--initial-cluster-state=new
etcd: error setting up initial cluster: infra0 has different advertised URLs in the cluster and advertised peer URLs list
exit 1
ノードが異なるクラスタのパラメータとして構成する、このクラスタに参加しようとすると、etcdはクラスタIDの不一致を報告して終了する.
$ etcd --name infra3 --initial-advertise-peer-urls http://10.0.1.13:2380 \
--listen-peer-urls http://10.0.1.13:2380 \
--listen-client-urls http://10.0.1.13:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.13:2379 \
--initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra3=http://10.0.1.13:2380 \
--initial-cluster-state=new
etcd: conflicting cluster ID to the target cluster (c6ab534d07e8fcc4 != bc25ea2a74fb18b0). Exiting.
exit 1
検出サービス
多くの場合、クラスタノードは、事前にIpアドレスを知ることができない.これは、クラウドサービスプロバイダやDHCPを使用するネットワークでよく見られます.この場合、静的な構成ではなく、存在するetcdクラスタを用いて新しいノードを起動するプロセスを「ノード発見」と呼ぶ.
ノードを検出するには、次の2つの方法があります.
発見サービスプロトコルの設計をよりよく理解するために、発見サービスプロトコルのドキュメントを読むことをお勧めします.発見サービスURLのライフサイクル発見URLは、既存の発見URLを使用するのではなく、独自のetcdクラスタを識別する.各etcdインスタンスは、新しい発見URLを共有して新しいクラスタを起動します.また、URLは起動クラスタを初期化するときのみ使用すべきであることが判明し、起動済みクラスタのメンバー関係を変更する必要がある場合は、実行時にブートを再構成する.カスタムetcd発見サービス発見サービスは、存在するクラスタを起動するために使用され、プライベートetcdクラスタを使用する場合、このようにURLを作成します.
$ curl -X PUT https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
URL中のKeyのサイズを設定ことで、発見URLを作成するクラスタの予想サイズは3である.この場合、URLは次のように使用されます.
https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
etcdメンバーが起動すると使用されます
https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
フォルダを登録します.各メンバーには、異なる名前付きパラメータが含まれている必要があります.
Hostname
またはmachine-id
は良い選択になります.サービスの失敗は、通常、重複した名前によるものです.これらのパラメータを使用してetcdの各メンバーを起動します.$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://myetcd.local/v2/keys/discovery/6c007a14875d53d9bf0ef5a6fc0257c817f0fb83
すべてのホストが登録されると、各クラスタメンバーは、クラスタが起動する前にカスタム発見サービスに自分自身を登録します.共通のetcd発見サービスは、入手可能なクラスタがなければ、
discovery.etcd.io
に管理された共通発見サービスを使用する.「new」ホストを使用して、次のコマンドを使用して、プライベートな検出URLを作成します.$ curl https://discovery.etcd.io/new?size=3
https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
初期化メンバー数3のクラスタが作成され、サイズが設定されていない場合はデフォルト3になります.
ETCD_DISCOVERY=https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
これらの関連パラメータを使用して、etcdメンバーを起動します.
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra1 --initial-advertise-peer-urls http://10.0.1.11:2380 \
--listen-peer-urls http://10.0.1.11:2380 \
--listen-client-urls http://10.0.1.11:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.11:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
$ etcd --name infra2 --initial-advertise-peer-urls http://10.0.1.12:2380 \
--listen-peer-urls http://10.0.1.12:2380 \
--listen-client-urls http://10.0.1.12:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.12:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
すべてのホストが登録されると、各クラスタメンバーは、クラスタが起動する前にカスタム発見サービスに自分自身を登録します.etcdは、環境変数
ETCD_DISCOVERY_PROXY
を使用してHTTPエージェント接続を介してサービスを発見する.エラーおよび警告事例サービスエラーの検出:$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcd: error: the cluster doesn’t have a size configuration value in https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de/_config
exit 1
警告ここには、サービスURLがこのホストに無視されることを発見したという重大な警告があります.
$ etcd --name infra0 --initial-advertise-peer-urls http://10.0.1.10:2380 \
--listen-peer-urls http://10.0.1.10:2380 \
--listen-client-urls http://10.0.1.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://10.0.1.10:2379 \
--discovery https://discovery.etcd.io/3e86b59982e49066c5d813af1c2e2579cbf573de
etcdserver: discovery token ignored since a cluster has already been initialized. Valid log found at /var/lib/etcd
DNS検出サービス
DNS SRV記録は発見機構として利用できる.
--discovery-srv
パラメータは、SRVレコードを発見するDNSドメイン名を設定するために使用することができる.--discovery-srv example.com
を設定すると、DNS SRVレコードがリストされた順序で検索されます._etcd-server-ssl._tcp.example.com
が見つかった場合、etcdはTLSを介してブートプロセスを試みる.クライアントがetcdクラスタを発見するのを助けるために、以下のDNS SRVレコードをリストされた順序で検索します._etcd-client-ssl._tcp.example.com
が見つかった場合、クライアントは、SSL/TLSを介してetcdクラスタとの通信を試みる.etcdがTLSを使用する場合、SRVレコード(例えばexample.com)はホスト名とともにSSL証明書DNS SANに含める必要があります.そうしないと、クラスタは失敗し、次のログメッセージが表示されます.[...] rejected connection from "10.0.1.11:53162" (error "remote error: tls: bad certificate", ServerName "example.com")
etcdがカスタム証明書発行機関のないTLSを使用している場合、ドメイン(例えばexample.com)はSRVレコードドメイン(例えばinfra 1.example.com)と一致しなければならないことが分かった.SRV記録を偽造して異なるドメインへの攻撃を緩和するためだ.このドメインはPKIの下で有効な証明書を持つが、未知のサードパーティによって制御される.
-discovery-srv-name
パラメータはまた、発見中にクエリされたSRV名に接尾辞を構成する.このパラメータを使用して、同じドメインの複数のetcdクラスタを区別します.たとえば、Discovery-srv = example.com
および-discovery-srv-name = foo
が設定されている場合、次のDNS SRVクエリが実行されます.DNS SRVレコードの作成
$ dig +noall +answer SRV _etcd-server._tcp.example.com
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra0.example.com.
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra1.example.com.
_etcd-server._tcp.example.com. 300 IN SRV 0 0 2380 infra2.example.com.
$ dig +noall +answer SRV _etcd-client._tcp.example.com
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra0.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra1.example.com.
_etcd-client._tcp.example.com. 300 IN SRV 0 0 2379 infra2.example.com.
$ dig +noall +answer infra0.example.com infra1.example.com infra2.example.com
infra0.example.com. 300 IN A 10.0.1.10
infra1.example.com. 300 IN A 10.0.1.11
infra2.example.com. 300 IN A 10.0.1.12
DNSブートetcdクラスタetcdクラスタメンバーを使用すると、ドメイン名またはIPアドレスを通知でき、ブートプロセスはDNS Aレコードを解析します.3.2から(3.1に警告が表示されます)、
--listen-peer-urls
および--listen-client-urls
は、ネットワークインタフェースにバインドされたドメイン名を拒否します.--initial-advertise-peer-urls
の解析アドレスは、SRVターゲットの解析アドレスの1つと一致する必要があります.etcdメンバーは、解析されたアドレスを読み出し、SRVレコードで定義されたクラスタに属するかどうかを検索します.$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra0.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra0.example.com:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra1.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra1.example.com:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://infra2.example.com:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://infra2.example.com:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380
クラスタは、ドメイン名ではなくIPアドレスを使用して起動することもできます.
$ etcd --name infra0 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.10:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.10:2379 \
--listen-client-urls http://10.0.1.10:2379 \
--listen-peer-urls http://10.0.1.10:2380
$ etcd --name infra1 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.11:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.11:2379 \
--listen-client-urls http://10.0.1.11:2379 \
--listen-peer-urls http://10.0.1.11:2380
$ etcd --name infra2 \
--discovery-srv example.com \
--initial-advertise-peer-urls http://10.0.1.12:2380 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster-state new \
--advertise-client-urls http://10.0.1.12:2379 \
--listen-client-urls http://10.0.1.12:2379 \
--listen-peer-urls http://10.0.1.12:2380
v 3から1.0(v 3.2.9を除く)のため、
etcd --discovery-srv = example.com
にTLSが構成されている場合、サーバは、提供された証明書がexample.com
(SAN)フィールドのエントリとしてルートドメインSubject Alternative
を有する場合にのみ、ピア/クライアントによる認証を行う.DNS SRVのコメントを参照してください.ゲートウェイetcdゲートウェイは単純なTCPエージェントであり、ネットワークデータをetcdクラスタに転送することができる.詳細については、ゲートウェイガイドを参照してください.エージェントが--proxy
パラメータを設定すると、etcdはエージェントモードで実行されます.このエージェントモードはetcd v 2 APIのみをサポートします.現在、v 3 APIをサポートする計画はありません.逆に、v 3 APIをサポートするために、etcd 3.0バージョン以降、拡張機能を備えた新しいエージェントが提供されます.v 2 APIエージェントを使用してetcdクラスタを設定するには、etcd 2.3バージョンのクラスタドキュメントを参照してください.