How to check expect content as IP resolved by DNS resolver in HAProxy?

3/1/2020

We are using Kubernetes DNS as HAProxy DNS resolver in config file for resolve service Redis pod DNS name in Kubernetes cluster.

Now, we are set server base on DNS hostname, but tcp-check send command return service pod IP in http content. I need to compare this IP address with expected DNS hostname.

I tried as follow:

resolvers kubedns
  nameserver namedns kube-dns.kube-system.svc.cluster.local:53

backend check_sentinel_vote_0
  option tcp-check
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send SENTINEL\ get-master-addr-by-name\ myredismaster\r\n   <--- return "10.38.0.5"
  tcp-check expect string redis-0.redis.default.svc.cluster.local       <--- expected this DNS hostname IP

  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis-0 redis-0.redis.default.svc.cluster.local:26379
  server redis-1 redis-1.redis.default.svc.cluster.local:26379
  server redis-2 redis-2.redis.default.svc.cluster.local:26379

backend check_sentinel_vote_1
  option tcp-check
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send SENTINEL\ get-master-addr-by-name\ myredismaster\r\n
  tcp-check expect string redis-1.redis.default.svc.cluster.local

  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis-0 redis-0.redis.default.svc.cluster.local:26379
  server redis-1 redis-1.redis.default.svc.cluster.local:26379
  server redis-2 redis-2.redis.default.svc.cluster.local:26379

backend check_sentinel_vote_2
  option tcp-check
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send SENTINEL\ get-master-addr-by-name\ myredismaster\r\n
  tcp-check expect string redis-2.redis.default.svc.cluster.local

  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis-0 redis-0.redis.default.svc.cluster.local:26379
  server redis-1 redis-1.redis.default.svc.cluster.local:26379
  server redis-2 redis-2.redis.default.svc.cluster.local:26379

127.0.0.1:26379> SENTINEL get-master-addr-by-name command return:

1) "10.38.0.5"
2) "6379"

How can I resolve my redis-0.redis.default.svc.cluster.local DNS hostname IP as expected IP returned by tcp-check expect string? How can I put some expression (as do-resolve) before tcp-check expect string?

-- infinitix
dns
haproxy
kubernetes
redis
redis-sentinel

0 Answers