容器DNS Ip status check模块源码解析(golang)

Ip status check组件对域名domain进行ping探活、及域名的主机ip进行周期性tcp探活,依据探活结果更新etcd中域名对应关系及主机存活状态,包括dns-scheduler和dns-scanner两个模块。文章目录一:dns-scheduler模块1.1 dns-scheduler配置参数说明1.2 SyncJobPath()1.3 WatchJobPath()1.4 i...
摘要由CSDN通过智能技术生成

Ip status check组件对域名domain进行ping探活、及域名的主机ip进行周期性tcp探活,依据探活结果更新etcd中域名对应关系及主机存活状态,包括dns-scheduler和dns-scanner两个模块。

一:dns-scheduler模块

在这里插入图片描述
dns-scheduler 模块监控User API 组件输入的域名 IP 的信息,并将相关的 IP 探活合理地分配给不用的 DNS-scanner 任务。
dns-schedule主要包含初始化SyncJobPath模块、持续监听数据变化WatchJobPath模块及执行Run模块。三模块功能分别为:

  • 初始化SyncJobPath模块:初始化依据ipAddrPath及statusAddrPath更新ipAddrPath,ipAddr状态为待分配scanner-agent。初始化依据DnsJobPath及DomainPath更新DnsJobPath,sub_domain状态为待分配scanner-agent。
  • 持续监听WatchJobPath模块:监听StatusPath内数据变化,同步更新IpaddressJobPath,ipAddr状态待分配scanner-agent状态。监听DomainPath内数据变化,同步更新DnsJobPath。
  • Run模块:周期性地将IpaddressPath中ipAddr及DnsJobPath中sub_domain,分配至所有可提供服务的dns-scanner,具体表现为更新ipAddrPath内ipAddr及DnsJobPath内sub_domain状态为明确的dns-scanner*(每次周期性开始前,lockIpAddrPath/LockDomainKey,对所有的dns-scanner进行探活,同时重新分配所有的ipAddr)*。

1.1 dns-scheduler配置参数说明

	/*********省略************/
[Etcd]
	etcd-servers = http://10.8.65.106:2379
	status-path = /containerdns/monitor/status //域名主机Ip存活状态信息数据库
	job-path = /containerdns/monitor/job //域名主机Ip探活任务分配数据库
	agent-path = /containerdns/monitor/agent  //dns-scanner agent存活信息数据库
	domain-path = /containerdns/local //所有域名信息数据库

1.2 SyncJobPath()

SyncJobPath()函数同步SyncJobForIpAddress及SyncJobForDomain。以SyncJobForIpAddress()为例,其分别GetIpaddressJobPath()及StatusPath(),从而set Assign{InitTag:1} to GetIpaddressJobPath,同时DoDelete(status为false recursive);

func SyncJobPath() error {
   
 e := ipaddr.SyncJobForIpAddress()
 e := domain.SyncJobForDomain()
}

func SyncJobForIpAddress() error {
   
 job_response, err1 := base.Schedule.Client.Get(base.GetIpaddressJobPath(),true);
 status_response, err2 := base.Schedule.Client.Get(base.Config.Etcd.StatusPath, true); 
 /***compare status_respose and job_response for status_ip[ip_address] and invalid_ips[ip_address]****/
 for ipaddress, _ := range status_ips {
   
 	assign_task := base.AssignTask{
   InitTag: 1}
 	 base.Schedule.Client.Set(base.GetIpaddressJobPath() + ipaddress, string(assign_task))
 }
 for _, ip_address := range invalid_ips {
   
 	 base.Schedule.Client.DoDelete(base.GetIpaddressJobPath() + ip_address)
 }
/*********省略************/
}

1.3 WatchJobPath()

WatchJobPath()监测StatusPath目录下数据变化,数据变化时新增或删除IpaddressJobPath内Ipaddress。

func WatchJobPath() {
   
	go ipaddr.WatchIpaddressPath()
	go domain.WatchDomainPath()
}

func  WatchIpaddressPath() {
   
    watcher = base.Schedule.Client.Watch(ctx, base.Config.Etcd.StatusPath, opts...)
    for wres := range watcher {
   
        for _, e := range wres.Events {
   
            if e.Type == mvccpb.PUT {
   
                assign_task := base.AssignTask{
   InitTag: 1}
                if err := base.Schedule.Client.Set(base.GetIpaddressJobPath() + ip_address, string(assign_task)); 
            } else if e.Type == mvccpb.DELETE {
   
                base.Schedule.Client.DoDelete(base.GetIpaddressJobPath() + ip_address)
	/*********省略************/
}

1.4 ipaddr.Run()或domain.Run()

以ipaddr.Run()为例,其周期性执行lockIpAddressKey(),避免key值在任务分配期被修改。loopJob()获取所有ipaddr的allocation信息,scheduleWaitPool()依据需分配ipaddress及存活dns-scanner,按dns-scanner重新分配ip,并updateIpAddressJob()。

func Run() {
   
    for {
   
        if lock_fai
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值