repl.info

CloudNativeMeetupTokyo#7 – Consul Kubernetes Integrationにおける Service Sync to Consulについて

2019年3月29日(金)に開催した CloudNativeMeetupTokyo#7 で、Consul ConnectとConsul Kubernetes Integrationについて紹介しました。参加してくれた方、登壇してくれた方、ありがとうございました。

今回はフォントをめちゃ太くしてみた。

KubernetesサービスのConsulへの同期の際、NodePortの場合にポッドが動いているノードのIPアドレスがConsulサービスとして登録されるのはなぜか?という質問をもらい、その辺り調査不足だったのでもう少し調べてみました。なお、サービス同期のドキュメントは https://www.consul.io/docs/platform/k8s/service-sync.html です。

さて、Kubernetesサービスの同期で使えるタイプはNodePort、LoadBalancer、ClusterIPです。そして、ExternalIPsにも対応しています。実際の挙動を見るためにそれぞれのサービスを用意して、Kubernetesの外からConsul APIで確認してみます。

$ k get svc | grep hello-consul

hello-consul-cluster-ip ClusterIP 10.233.62.185<none> 8080/TCP 1m

hello-consul-external-ips ClusterIP 10.233.38.236 80.11.12.10 8080/TCP 1m

hello-consul-load-balancer LoadBalancer 10.233.48.223 10.230.1.137 8080:32702/TCP 1m

hello-consul-node-port NodePort 10.233.12.208 <none> 8080:32754/TCP 1m

</none></none>

NodePort

まずはNodePortです。KubernetesサービスのPodが動いているNodeのアドレスがConsulサービスとして登録されます。ソースコードは このあたり。 厳密には、ServiceのEndpointがあるNodeを取得するようです。確かに、素朴に考えるとNodePortのIPを使いそうですが、一工夫しています。Consul APIでServiceAddressとServicePortを見るとこんな感じ。

[alpaca@staging-bastion-10-230-0-24 ~]$ curl -sS http://127.0.0.1:8500/v1/catalog/service/hello-consul-node-port | jq -r ".[] | [.ServiceAddress, .ServicePort] | @tsv"
10.230.1.135 32754
10.230.0.103 32754
10.230.0.85 32754

LoadBalancer

次に、LoadBalancerです。LoadBalancerのIngressがConsulサービスとして登録されます。ソースコードは このあたり。Consul APIで見るとこんな感じ。

[alpaca@staging-bastion-10-230-0-24 ~]$ curl -sS[http://127.0.0.1:8500/v1/catalog/service/hello-consul-load-balancer](http://127.0.0.1:8500/v1/catalog/service/hello-consul-load-balancer)| jq -r ".[] | [.ServiceAddress, .ServicePort] | @tsv"
10.230.1.137 8080

ClusterIP

次はClusterIPです。KubernetesサービスのIPが登録されるのかな、と思いきや、各PodのIPアドレスがConsulサービスとして登録されています。ソースコードは このあたり

[alpaca@staging-bastion-10-230-0-24 ~]$ curl -sS[http://127.0.0.1:8500/v1/catalog/service/hello-consul-cluster-ip](http://127.0.0.1:8500/v1/catalog/service/hello-consul-cluster-ip)| jq -r ".[] | [.ServiceAddress, .ServicePort] | @tsv"
10.233.70.181 8080
10.233.68.140 8080
10.233.74.34 8080

External IPs

最後にExternalIPsについてです。ExternalIPsが設定されている場合、その設定値がConsulサービスに登録され、Ingressなどは登録されません。ソースコードは このあたり

[alpaca@staging-bastion-10-230-0-24 ~]$ curl -sS[http://127.0.0.1:8500/v1/catalog/service/hello-consul-external-ips](http://127.0.0.1:8500/v1/catalog/service/hello-consul-external-ips)| jq -r ".[] | [.ServiceAddress, .ServicePort] | @tsv"
80.11.12.10 8080

以上、KubernetesからConsulへのサービス同期についての追加調査でした。