我有一个使用TLS的etcd集群用于安全性。我希望其他机器使用etcd代理,因此localhost客户端不需要使用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主服务器更改为--advertise-client-urls=http://localhost:2379
,那么代理服务器将连接到自身并进入无限循环。并且代理不会修改客户端和主服务器之间的流量,因此它不会重写所通告的客户端URL。
我不能理解某些东西,因为etcd代理似乎没用。
答案 0 :(得分:0)
事实证明,大多数etcd客户端(locksmith,flanneld等)在此模式下可以正常使用代理。它只是行为不同的etcdctl。因为我正在测试etcdctl,我认为代理配置根本不起作用。
etcdctl
与--skip-sync
一起运行,那么它将通过代理进行通信,而不是检索公共端点列表。etcdctl cluster-health
忽略--skip-sync
并始终触及公共etcd端点。它永远不会与代理一起使用。答案 1 :(得分:0)
使用选项--endpoints "https://{YOUR_ETCD_ADVERTISE_CILENT_URL}:2379"
。
由于您为etcd配置了TLS,因此您应添加选项--ca-file
,--cert-file
,--key-file
。