TKE集群中使用的DNS解析是采用coreDNS,Kubernetes 1.11 和更高版本中,CoreDNS 位于 GA 并且默认情况下与 kubeadm 一起安装
我们的每个容器下dns解析配置文件,都是通过kubelet来给容器进行配置
kubelet 使用 --cluster-dns = <dns-service-ip>
标志将 DNS 传递到每个容器。
DNS 名称也需要域。 您可在 kubelet 中使用 --cluster-domain = <default-local-domain>
标志配置本地域
apiVersion: v1
data:
Corefile: |2-
.:53 {
errors
health
kubernetes cluster.local. in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . /etc/resolv.conf
cache 30
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2020-06-02T03:16:59Z"
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: coredns
namespace: kube-system
resourceVersion: "8573074315"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: 859ce588-a47f-11ea-8fe7-0a5ffefb2e9f
提供
pods insecure
选项是为了与 kube-dns 向前兼容。 您可以使用pods verified
选项,该选项仅在相同名称空间中存在具有匹配 IP 的 pod 时才返回 A 记录。 如果您不使用 Pod 记录,则可以使用pods disabled
选项。
'Upstream' 用来解析指向外部主机的服务(外部服务)。
CoreDNS 能够使用 proxy plugin. 配置存根域和上游域名服务器。
如果集群操作员的 Consul 域服务器位于 10.150.0.1,并且所有 Consul 名称都带有后缀.consul.local。 要在 CoreDNS 中对其进行配置,集群管理员可以在 CoreDNS 的 ConfigMap 中创建加入以下字段。
consul.local:53 {
errors
cache 30
proxy . 10.150.0.1
}
要显式强制所有非集群 DNS 查找通过特定的域名服务器(位于172.16.0.1),请将 proxy
和 forward
指向域名服务器,而不是 /etc/resolv.conf
。
proxy . 172.16.0.1
最终的 ConfigMap 以及默认的 Corefile
配置如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream 172.16.0.1
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . 172.16.0.1
cache 30
loop
reload
loadbalance
}
consul.local:53 {
errors
cache 30
proxy . 10.150.0.1
}
CoreDNS 不仅仅提供 kube-dns 的功能。 为 kube-dns 创建的 ConfigMap 支持 StubDomains
和 upstreamNameservers
转换为 CoreDNS 中的 proxy
插件。 同样,kube-dns 中的 Federations
插件会转换为 CoreDNS 中的 federation
插件。
用于 kubedns 的此示例 ConfigMap 描述了 federations, stubdomains and upstreamnameservers:
apiVersion: v1
data:
federations: |
{"foo" : "foo.feddomain.com"}
stubDomains: |
{"abc.com" : ["1.2.3.4"], "my.cluster.local" : ["2.3.4.5"]}
upstreamNameservers: |
["8.8.8.8", "8.8.4.4"]
kind: ConfigMap
CoreDNS 中的等效配置将创建一个 Corefile:
federation cluster.local {
foo foo.feddomain.com
}
abc.com:53 {
errors
cache 30
proxy . 1.2.3.4
}
my.cluster.local:53 {
errors
cache 30
proxy . 2.3.4.5
}
带有默认插件的完整 Corefile:
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
upstream 8.8.8.8 8.8.4.4
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
federation cluster.local {
foo foo.feddomain.com
}
prometheus :9153
proxy . 8.8.8.8 8.8.4.4
cache 30
}
abc.com:53 {
errors
cache 30
proxy . 1.2.3.4
}
my.cluster.local:53 {
errors
cache 30
proxy . 2.3.4.5
}
注意:k8s在1.18版本后,配置上游dns服务器采用的字段不在是proxy,而是采用的forword字段。
在 kubernetes 中还提供了 dnsPolicy
决定 Pod
内预设 DNS
配置策略:
清除 Pod 预设 DNS 配置,当 dnsPolicy 设置成为这个值之后, kubernetes 不会为 Pod 预先加载任何逻辑用于判定得到 DNS 的配置。因此若将 dnsPolicy 设置为 None , 为了避免 Pod 里面没有 DNS 配置,最好通过 dnsConfig 来描述自定义的 DNS 参数。如下所示:
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
restartPolicy: Always
dnsPolicy: None
dnsConfig:
nameservers:
- 172.xxx.xxx.201
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 172.xxx.xxx.201
search ns1.svc.cluster.local my.dns.search.suffix
options ndots:2 edns0
Pod 里面的 DNS 配置继承了宿主机上的 DNS 配置。即,该 Pod 的 DNS 配置与宿主机完全一致。
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
restartPolicy: Always
dnsPolicy: Default
通过 cat /etc/resolv.conf
可查看到宿主机上的配置如下:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 172.xxx.xxx.201
nameserver 114.114.114.114
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 172.xxx.xxx.201
nameserver 114.114.114.114
与 Default 相反,会预先使用 kube-dns
(或 CoreDNS
) 的信息当预设置参数写入到该 Pod 内的DNS配置。
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
restartPolicy: Always
dnsPolicy: ClusterFirst
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 10.20.0.2
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
注
如设置了 hostNetwork = true
时,ClusterFirst
会被强制转化为 Default
。如下:
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
hostNetwork: true
restartPolicy: Always
dnsPolicy: ClusterFirst
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 172.xxx.xxx.201
nameserver 114.114.114.114
注
设置 hostNetwork = true
之后,会让 Pod 与该节点公用相同的网络空间(网卡/路由等)
同时使用 hostNetwork
与 kube-dns
作为 Pod 预设 DNS 配置。
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
hostNetwork: true
restartPolicy: Always
dnsPolicy: ClusterFirstWithHostNet
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 10.20.0.2
search default.svc.k8s.local. svc.k8s.local. k8s.local.
options ndots:5
apiVersion: v1
kind: Pod
metadata:
name: demo
namespace: default
spec:
containers:
- image: base/java
command:
- "java -jar /opt/app.jar"
imagePullPolicy: IfNotPresent
name: demo
restartPolicy: Always
dnsConfig:
nameservers:
- 172.xxx.xxx.201
searches:
- ns1.svc.cluster.local
- my.dns.search.suffix
options:
- name: ndots
value: "2"
- name: edns0
通过上述配置创建 Pod
之后,执行 kubectl exec demo cat /etc/resolv.conf
命令即可看到额外的配置项目,如下:
nameserver 10.20.0.2
nameserver 172.xxx.xxx.201
search default.svc.cluster.local svc.cluster.local cluster.local ns1.svc.cluster.local my.dns.search.suffix
options ndots:2 edns0
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。