代理模式下的 etcd2 没有做任何有用的事情
etcd2 in proxy mode doesn't do anything useful
我有一个使用 TLS 确保安全的 etcd 集群。我希望其他机器使用 etcd 代理,因此本地主机客户端不需要使用 TLS。代理配置如下:
[Service]
Environment="ETCD_PROXY=on"
Environment="ETCD_INITIAL_CLUSTER=etcd1=https://master1.example.com:2380,etcd2=https://master2.example.com:2380"
Environment="ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
Environment="ETCD_PEER_CERT_FILE=/etc/kubernetes/ssl/worker.pem"
Environment="ETCD_PEER_KEY_FILE=/etc/kubernetes/ssl/worker-key.pem"
Environment="ETCD_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
就第一次连接而言,它是有效的。但是 etcd 客户端执行初始查询以发现完整的服务器列表,然后它对该列表中的其中一台服务器执行真正的查询:
$ etcdctl --debug ls
start to sync cluster using endpoints(http://127.0.0.1:4001,http://127.0.0.1:2379)
cURL Command: curl -X GET http://127.0.0.1:4001/v2/members
got endpoints(https://1.1.1.1:2379,https://1.1.1.2:2379) after sync
Cluster-Endpoints: https://1.1.1.1:2379, https://1.1.1.2:2379
cURL Command: curl -X GET https://1.1.1.1:2379/v2/keys/?quorum=false&recursive=false&sorted=false
cURL Command: curl -X GET https://1.1.1.2:2379/v2/keys/?quorum=false&recursive=false&sorted=false
Error: client: etcd cluster is unavailable or misconfigured
error #0: x509: certificate signed by unknown authority
error #1: x509: certificate signed by unknown authority
如果我将 etcd masters 更改为 --advertise-client-urls=http://localhost:2379
,那么代理将连接到自身并进入无限循环。而且代理不会修改客户端和主控之间的流量,所以它不会重写通告的客户端 URL。
我一定是没听懂,因为 etcd 代理似乎没用。
事实证明,大多数 etcd 客户端(locksmith、flanneld 等)在此模式下与代理一起工作得很好。只有 etcdctl 的行为有所不同。因为我正在使用 etcdctl 进行测试,所以我认为代理配置根本不起作用。
- 如果
etcdctl
是 运行 和 --skip-sync
,那么它将通过代理进行通信,而不是检索 public 个端点的列表。
etcdctl cluster-health
忽略 --skip-sync
并始终接触 public etcd 端点。它永远不会与代理一起工作。
有选项 --endpoints "https://{YOUR_ETCD_ADVERTISE_CILENT_URL}:2379"
。
因为您为 etcd 配置了 TLS,所以您应该添加选项 --ca-file
、--cert-file
、--key-file
。
我有一个使用 TLS 确保安全的 etcd 集群。我希望其他机器使用 etcd 代理,因此本地主机客户端不需要使用 TLS。代理配置如下:
[Service]
Environment="ETCD_PROXY=on"
Environment="ETCD_INITIAL_CLUSTER=etcd1=https://master1.example.com:2380,etcd2=https://master2.example.com:2380"
Environment="ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
Environment="ETCD_PEER_CERT_FILE=/etc/kubernetes/ssl/worker.pem"
Environment="ETCD_PEER_KEY_FILE=/etc/kubernetes/ssl/worker-key.pem"
Environment="ETCD_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
就第一次连接而言,它是有效的。但是 etcd 客户端执行初始查询以发现完整的服务器列表,然后它对该列表中的其中一台服务器执行真正的查询:
$ etcdctl --debug ls
start to sync cluster using endpoints(http://127.0.0.1:4001,http://127.0.0.1:2379)
cURL Command: curl -X GET http://127.0.0.1:4001/v2/members
got endpoints(https://1.1.1.1:2379,https://1.1.1.2:2379) after sync
Cluster-Endpoints: https://1.1.1.1:2379, https://1.1.1.2:2379
cURL Command: curl -X GET https://1.1.1.1:2379/v2/keys/?quorum=false&recursive=false&sorted=false
cURL Command: curl -X GET https://1.1.1.2:2379/v2/keys/?quorum=false&recursive=false&sorted=false
Error: client: etcd cluster is unavailable or misconfigured
error #0: x509: certificate signed by unknown authority
error #1: x509: certificate signed by unknown authority
如果我将 etcd masters 更改为 --advertise-client-urls=http://localhost:2379
,那么代理将连接到自身并进入无限循环。而且代理不会修改客户端和主控之间的流量,所以它不会重写通告的客户端 URL。
我一定是没听懂,因为 etcd 代理似乎没用。
事实证明,大多数 etcd 客户端(locksmith、flanneld 等)在此模式下与代理一起工作得很好。只有 etcdctl 的行为有所不同。因为我正在使用 etcdctl 进行测试,所以我认为代理配置根本不起作用。
- 如果
etcdctl
是 运行 和--skip-sync
,那么它将通过代理进行通信,而不是检索 public 个端点的列表。 etcdctl cluster-health
忽略--skip-sync
并始终接触 public etcd 端点。它永远不会与代理一起工作。
有选项 --endpoints "https://{YOUR_ETCD_ADVERTISE_CILENT_URL}:2379"
。
因为您为 etcd 配置了 TLS,所以您应该添加选项 --ca-file
、--cert-file
、--key-file
。