erlang не удалось разрешить адреса ipv6, используя параметр из rabbitmq - PullRequest
2 голосов
/ 17 октября 2019

Я использую кластер rabbitmq в k8s, который имеет только чистый IPv6-адрес. inet возвращает ошибку nxdomain при разборе имени службы k8s. Параметр, передаваемый erlang из rabbitmq:

RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+A 128  -kernel inetrc '/etc/rabbitmq/erl_inetrc'  -proto_dist inet6_tcp"
RABBITMQ_CTL_ERL_ARGS="-proto_dist inet6_tcp"


 erl_inetrc: |-
    {inet6, true}.

, когда rabbitmq использует свой плагин rabbit_peer_discovery_k8s для вызова API k8s:

   2019-10-15 07:33:55.000 [info] <0.238.0> Peer discovery backend does not support locking, falling back to randomized delay
2019-10-15 07:33:55.000 [info] <0.238.0> Peer discovery backend rabbit_peer_discovery_k8s does not support registration, skipping randomized start
up delay.
2019-10-15 07:33:55.000 [debug] <0.238.0> GET https://kubernetes.default.svc.cluster.local:443/api/v1/namespaces/tazou/endpoints/zt4-crmq
2019-10-15 07:33:55.015 [debug] <0.238.0> Response: {error,{failed_connect,[{to_address,{"kubernetes.default.svc.cluster.local",443}},{inet,[inet]
,nxdomain}]}}
2019-10-15 07:33:55.015 [debug] <0.238.0> HTTP Error {failed_connect,[{to_address,{"kubernetes.default.svc.cluster.local",443}},{inet,[inet],nxdom
ain}]}
2019-10-15 07:33:55.015 [info] <0.238.0> Failed to get nodes from k8s - {failed_connect,[{to_address,{"kubernetes.default.svc.cluster.local",443}}
,
                 {inet,[inet],nxdomain}]}
2019-10-15 07:33:55.016 [error] <0.237.0> CRASH REPORT Process <0.237.0> with 0 neighbours exited with reason: no case clause matching {error,"{fa
iled_connect,[{to_address,{\"kubernetes.default.svc.cluster.local\",443}},\n                 {inet,[inet],nxdomain}]}"} in rabbit_mnesia:init_from
_config/0 line 167 in application_master:init/4 line 138
2019-10-15 07:33:55.016 [info] <0.43.0> Application rabbit exited with reason: no case clause matching {error,"{failed_connect,[{to_address,{\"kub
ernetes.default.svc.cluster.local\",443}},\n     

в консоли k8s, адрес может быть разрешен:

[rabbitmq]# nslookup -type=AAAA kubernetes.default.svc.cluster.local
Server:         2019:282:4000:2001::6
Address:        2019:282:4000:2001::6#53

kubernetes.default.svc.cluster.local    has AAAA address fd01:abcd::1

inet может вернуть адрес ipv6.

kubectl exec -ti zt4-crmq-0 rabbitmqctl eval 'inet:gethostbyname("kubernetes.default.svc.cluster.local").'
{ok,{hostent,"kubernetes.default.svc.cluster.local",[],inet6,16,
             [{64769,43981,0,0,0,0,0,1}]}}

, как я знаю, вызов плагина httpc: request для вызова API k8s. Я не знаю, в чем разница между httpc: request и inet: gethostbyname. Я также не знаю, что использует httpc: запрос для разрешения адреса имени хоста. Я запрашиваю плагин rabbitmq. Говорят, что плагин rabbitmq не знает, как erlang восстанавливает адрес. https://github.com/rabbitmq/rabbitmq-peer-discovery-k8s/issues/55.

Что-нибудь еще, что я мог бы установить для erl_inetrc, чтобы erlang мог разрешить адрес ipv6? что я пропустил в конфигурации? или как я могу отладить со стороны Erlang? Я новичок в Erlang.

BR, Тао

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...