Получение конечных точек из kubernetes-etcd для haproxy
Я пытаюсь получить конечные точки kubernetes из моего кластера kubernetes-etcd для haproxy, используя confd.
При выполнении confd всегда возвращается ошибка, поэтому ключ '/registry' не найден:
$ ./confd-0.12.0-linux-amd64 -config-file confd.toml
...
INFO Backend nodes set to https://10.31.9.49:2379
DEBUG Loading template resources from confdir /root/haproxy/kubernetes-endpoint-proxy/src/etc/confd/
DEBUG Found template: /root/haproxy/kubernetes-endpoint-proxy/src/etc/confd/conf.d/haproxy.toml
DEBUG Loading template resource from /root/haproxy/kubernetes-endpoint-proxy/src/etc/confd/conf.d/haproxy.toml
DEBUG Retrieving keys from store
DEBUG Key prefix set to /
ERROR 100: Key not found (/registry) [2540]
Но перечисление в / ниже '/registry' с etcdctl работает нормально.
$ etcdctl \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=./admin1.pem \
--key=./admin1-key.pem \
--endpoints 10.31.9.49:2379 \
get / --keys-only=true --prefix \
| grep endpoints
/registry/services/endpoints/default/echoheaders-x
/registry/services/endpoints/default/echoheaders-y
/registry/services/endpoints/default/kubernetes
/registry/services/endpoints/kube-system/default-http-backend
/registry/services/endpoints/kube-system/kube-controller-manager
/registry/services/endpoints/kube-system/kube-dns
/registry/services/endpoints/kube-system/kube-scheduler
/registry/services/endpoints/kube-system/kubernetes-dashboard
Также работает одна конечная точка:
etcdctl \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=./admin1.pem \
--key=./admin1-key.pem \
--endpoints 10.31.9.49:2379 get /registry/services/endpoints/default/echoheaders-x
/registry/services/endpoints/default/echoheaders-x
k8s
v1 Endpoints�
�
echoheaders-xdefault"2/api/v1/namespaces/default/endpoints/echoheaders-x*$3bc4430d-ad97-11e7-8fe1-0022195f6b5b28B
������uZ
run
echoheadersz�
z
10.244.1.66_
Poddefaultechoheaders-1076692255-rs1qm"$360a3956-ad97-11e7-8fe1-0022195f6b5b*22306754:worker05
�?TCP"
Перечислить ту же конечную точку, что и выше, с помощью curl не удается:
curl \
--cacert /etc/kubernetes/ssl/ca.pem \
--cert ./master01.pem \
--key ./master01-key.pem \
-L 'https://10.31.9.49:2379/v2/keys/registry/services/endpoints/default/echoheaders-x'
{"errorCode":100,"message":"Key not found","cause":"/registry","index":2540}
Почему я не могу ничего перечислить с помощью curl, пока работает etcdctl?
Может ли кто-нибудь пролить свет на это?
1 ответ
Ответ на этот вопрос заключается в том, что etcd3 использует gRPC и предоставляет доступ к API-версии 3. Confd и curl получают доступ к данным с использованием API-версии 2.
Требуется gRPC <-> Json-Gateway: https://github.com/coreos/etcd/blob/master/Documentation/dev-guide/api_grpc_gateway.md
Ответ приходит с https://github.com/coreos/etcd/issues/8682