容器开发 -- 检查coredns 域名是否就绪
需求背景
常见域名服务器,通常含有缓存。当服务重启,通过nslookup解析域名的ip,不一定立马更新,存在历史值。
设计思路
- 在容器自启动阶段,对ip进行预校验
- 需要留意ipv4 和 ipv6的解析
"""
将域名转为IP,遍历返回域名对应的地址信息,当前提交仅支持单栈。
双栈,需要补充启动时, ip4和ipv6都存在的校验。
"""
def parse(domain):
final_ip = []
try:
# socket.AF_UNSPEC -- 若指定AF_INET6,则在ipv4环境上会报错
# socket.SOCK_STREAM -- TCP协议
addr_info = socket.getaddrinfo(domain, None, socket.AF_UNSPEC, socket.SOCK_STREAM)
for res in addr_info:
family, _, _, _, sock_addr = res
if family in [socket.AF_INET6, socket.AF_INET]:
final_ip.append(sock_addr[0])
except Exception as ee:
print("WARNING", "parse_domain_ip error {}".format(ee))
pass
finally:
if len(final_ip) == 0:
final_ip = [domain]
return final_ip
def check(self):
container_info_dict = parse_ini(container_info_file_path)
host_domain = container_info_dict['container']['status.podip']
local_ips = get_local_ips()
local_ips_set = set(local_ips)
print("INFO", "current local_ips is {}".format(local_ips))
while True:
domain_ip = parse(host_domain)
print("INFO", "current domain_ip is {}".format(domain_ip))
if len(domain_ip) and set(domain_ip).issubset(local_ips_set):
print("INFO", "analyze pod domain {} ip {} success".format(host_domain, domain_ip))
break
time.sleep(1)

浙公网安备 33010602011771号