searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Coredns k8s-external插件

2023-11-29 09:37:49
63
0

描述

此插件允许额外的区域来解析Kubernetes服务和无头服务的外部IP地址。仅当kubernetes插件也加载时,此插件才有用。

该插件使用外部区域来解析集群内的IP地址。它只处理A、AAAA、SRV和PTR记录的查询;为了使其成为适当的DNS区域,它处理该区域顶点的SOA和NS查询。

默认情况下,该区域的顶点将如下所示(假设使用的区域是example.org):

example.org.	5 IN	SOA ns1.dns.example.org. hostmaster.example.org. (
				12345      ; serial
				14400      ; refresh (4 hours)
				3600       ; retry (1 hour)
				604800     ; expire (1 week)
				5          ; minimum (4 hours)
				)
example.org		5 IN	NS ns1.dns.example.org.

ns1.dns.example.org.  5 IN  A    ....
ns1.dns.example.org.  5 IN  AAAA ....

请注意,我们使用dns子域来满足DNS需求的记录(见顶点指令)。另请注意,SOA的序列号是静态的。名称服务器记录的IP地址是CoreDNS服务的IP地址。

k8s_external插件处理子域dns和区域本身的顶点;所有其他查询都会解析到集群中的地址。

语法

k8s_external [ZONE...]
  • ZONES区域k8s_external应该是权威的。

如果您想更改顶点域或为返回的记录使用不同的TTL,您可以使用此扩展语法。

k8s_external [ZONE...] {
    apex APEX
    ttl TTL
}
  • APEX是用于顶点记录的名称(DNS标签);它默认为dns
  • ttl允许您为响应设置自定义TTL。默认值为5(秒)。

如果您想启用无头服务解决方案,您可以通过添加headless选项来做到这一点。

k8s_external [ZONE...] {
    headless
}
  • 如果有设置了外部IP的无头服务,外部IP将被解决

如果查询的域不存在,您可以通过添加fallthrough选项落入下一个插件。

k8s_external [ZONE...] {
    fallthrough [ZONE...]
}

实例配置

使example.org下的名称解析为集群内的DNS地址。

. {
   kubernetes cluster.local
   k8s_external example.org
}

使用上面的Corefile,以下服务将获得IP地址为192.168.200.123test.default.example.orgA记录。

apiVersion: v1
kind: Service
metadata:
 name: test
 namespace: default
spec:
 clusterIP: None
 externalIPs:
 - 192.168.200.123
 type: ClusterIP

k8s_external插件可以与传输插件结合使用,以启用区域传输。不支持通知。

    . {
        transfer example.org {
            to *
        }
        kubernetes cluster.local
        k8s_external example.org
    }

使用fallthrough选项,如果查询的域不存在,它将传递给与该区域匹配的下一个插件。

. {
   kubernetes cluster.local
   k8s_external example.org {
     fallthrough
   }
   forward . 8.8.8.8
}

源码分析
k8s-external插件提供服务的入口:
plugin/k8s_external/external.go



67~84是根据dns查询的domain name查找zone,k8s-external要求查询时使用FQDN全限定域名查询。zone是config配置时k8s-external指定的zone。

86行是调用externalFunc获取state.Name(dns查询时fqdn域名)对应的service。
externalFunc的初始化:在plugin初始化时,调用plugin的setup,初始化externalFunc为x.External


External函数位于:plugin/kubernetes/external.go,可以看出k8s_external插件依赖kubernetes插件,如果想配置使用k8s_external插件功能,coredns
必须配置加载kubernetes插件,才能正常运行


External函数主要做的事情是,根据查询的domain Name获取serviceKey,根据serviceKey,通过SvcIndex Api获取serviceKey对应的k8s service.

如果在配置k8s service时,使用loadbalancer service或者endpoint,或者创建service时,yml文件中指定externalIPs,都可以使用k8s_external插件获取到
external IP,实现通过coredns解析serivce对外的external IP信息。

0条评论
作者已关闭评论
刘****飞
3文章数
1粉丝数
刘****飞
3 文章 | 1 粉丝
刘****飞
3文章数
1粉丝数
刘****飞
3 文章 | 1 粉丝
原创

Coredns k8s-external插件

2023-11-29 09:37:49
63
0

描述

此插件允许额外的区域来解析Kubernetes服务和无头服务的外部IP地址。仅当kubernetes插件也加载时,此插件才有用。

该插件使用外部区域来解析集群内的IP地址。它只处理A、AAAA、SRV和PTR记录的查询;为了使其成为适当的DNS区域,它处理该区域顶点的SOA和NS查询。

默认情况下,该区域的顶点将如下所示(假设使用的区域是example.org):

example.org.	5 IN	SOA ns1.dns.example.org. hostmaster.example.org. (
				12345      ; serial
				14400      ; refresh (4 hours)
				3600       ; retry (1 hour)
				604800     ; expire (1 week)
				5          ; minimum (4 hours)
				)
example.org		5 IN	NS ns1.dns.example.org.

ns1.dns.example.org.  5 IN  A    ....
ns1.dns.example.org.  5 IN  AAAA ....

请注意,我们使用dns子域来满足DNS需求的记录(见顶点指令)。另请注意,SOA的序列号是静态的。名称服务器记录的IP地址是CoreDNS服务的IP地址。

k8s_external插件处理子域dns和区域本身的顶点;所有其他查询都会解析到集群中的地址。

语法

k8s_external [ZONE...]
  • ZONES区域k8s_external应该是权威的。

如果您想更改顶点域或为返回的记录使用不同的TTL,您可以使用此扩展语法。

k8s_external [ZONE...] {
    apex APEX
    ttl TTL
}
  • APEX是用于顶点记录的名称(DNS标签);它默认为dns
  • ttl允许您为响应设置自定义TTL。默认值为5(秒)。

如果您想启用无头服务解决方案,您可以通过添加headless选项来做到这一点。

k8s_external [ZONE...] {
    headless
}
  • 如果有设置了外部IP的无头服务,外部IP将被解决

如果查询的域不存在,您可以通过添加fallthrough选项落入下一个插件。

k8s_external [ZONE...] {
    fallthrough [ZONE...]
}

实例配置

使example.org下的名称解析为集群内的DNS地址。

. {
   kubernetes cluster.local
   k8s_external example.org
}

使用上面的Corefile,以下服务将获得IP地址为192.168.200.123test.default.example.orgA记录。

apiVersion: v1
kind: Service
metadata:
 name: test
 namespace: default
spec:
 clusterIP: None
 externalIPs:
 - 192.168.200.123
 type: ClusterIP

k8s_external插件可以与传输插件结合使用,以启用区域传输。不支持通知。

    . {
        transfer example.org {
            to *
        }
        kubernetes cluster.local
        k8s_external example.org
    }

使用fallthrough选项,如果查询的域不存在,它将传递给与该区域匹配的下一个插件。

. {
   kubernetes cluster.local
   k8s_external example.org {
     fallthrough
   }
   forward . 8.8.8.8
}

源码分析
k8s-external插件提供服务的入口:
plugin/k8s_external/external.go



67~84是根据dns查询的domain name查找zone,k8s-external要求查询时使用FQDN全限定域名查询。zone是config配置时k8s-external指定的zone。

86行是调用externalFunc获取state.Name(dns查询时fqdn域名)对应的service。
externalFunc的初始化:在plugin初始化时,调用plugin的setup,初始化externalFunc为x.External


External函数位于:plugin/kubernetes/external.go,可以看出k8s_external插件依赖kubernetes插件,如果想配置使用k8s_external插件功能,coredns
必须配置加载kubernetes插件,才能正常运行


External函数主要做的事情是,根据查询的domain Name获取serviceKey,根据serviceKey,通过SvcIndex Api获取serviceKey对应的k8s service.

如果在配置k8s service时,使用loadbalancer service或者endpoint,或者创建service时,yml文件中指定externalIPs,都可以使用k8s_external插件获取到
external IP,实现通过coredns解析serivce对外的external IP信息。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
4
0