代理模式下的 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 进行测试,所以我认为代理配置根本不起作用。

  1. 如果 etcdctl 是 运行 和 --skip-sync,那么它将通过代理进行通信,而不是检索 public 个端点的列表。
  2. etcdctl cluster-health 忽略 --skip-sync 并始终接触 public etcd 端点。它永远不会与代理一起工作。

有选项 --endpoints "https://{YOUR_ETCD_ADVERTISE_CILENT_URL}:2379"

因为您为 etcd 配置了 TLS,所以您应该添加选项 --ca-file--cert-file--key-file