容器开发 -- 检查coredns 域名是否就绪

需求背景

常见域名服务器,通常含有缓存。当服务重启,通过nslookup解析域名的ip,不一定立马更新,存在历史值。

设计思路

  1. 在容器自启动阶段,对ip进行预校验
  2. 需要留意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)
posted @ 2025-04-16 10:21  静水深耕,云停风驻  阅读(12)  评论(0)    收藏  举报