DNS
DNS
通常集群内部访问的是 Service 的域名serviceName.default.svc.cluster.local
,域名访问的作用时解决 Pod IP 不固定的问题,Kubernetes 提供 CoreDNS 解决这个问题。
查看 CoreDNS 服务
[root@kube01 dns]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-65c54cc984-7fkp7 1/1 Running 4 (6d6h ago) 167d
coredns-65c54cc984-cq95z 1/1 Running 4 (6d6h ago) 167d
CoreDns 是用 GO 写的高性能,高扩展性的 DNS 服务,基于 HTTP/2 Web 服务 Caddy 进行编写的。CoreDns 内部采用插件机制,所有功能都是插件形式编写,用户也可以扩展自己的插件,以下是 Kubernetes 部署 CoreDns 时的默认配置:
[root@kube01 dns]# kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2023-03-09T03:24:41Z"
name: coredns
namespace: kube-system
resourceVersion: "231"
uid: 43b05dd4-e392-4cd1-9da4-a9feaa525ba1
.:53
表示监听 53 端口的域名配置。您可以在其中添加类似的条目,根据您的需求设置名称、重定向、转发等,实现自定义域名解析。例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
...
your-custom-domain.com {
rewrite name some.other.domain.com
forward . 8.8.8.8
}
your-a-record.com {
rewrite name some.ip.address
}
}
CoreDNS 的 Service 地址一般情况下是固定的,类似于 kubernetes 这个 Service 地址一般就是第一个 IP 地址 10.254.0.1,CoreDNS 的 Service 地址就是 10.254.0.10,该 IP 被分配后 kubelet 会将使用--cluster-dns=<dns-service-ip>
参数配置的 DNS 传递给每个容器。DNS 名称也需要域名,本地域可以使用参数--cluster-domain = <default-local-domain>
在 kubelet 中配置
[root@kube01 ~]# cat /var/lib/kubelet/config.yaml
......
clusterDNS:
- 10.254.0.10
clusterDomain: cluster.local
Pod 使用 DNS
在 Pod 中,默认会自动添加 DNS 信息,但也可以指定 DNS 服务器信息成集群之外的DNS
默认使用的 ClusterFirst
[root@kube01 ~]# kubectl get pod test-nginx-6c6fb7db4b-ssfql -o yaml
apiVersion: v1
kind: Pod
metadata:
......
spec:
containers:
- image: nginx:1.7.9
imagePullPolicy: Always
name: test-nginx
......
dnsPolicy: ClusterFirst
此处 dns 类型为 ClusterFirst,就是以集群 dns 优先,dnsPolicy 的类型有多种分别为:
-
ClusterFirst: 这是默认的 DNS 解析策略。在此模式下,Pod 会首先尝试通过集群的 DNS 服务解析域名。如果集群 DNS 无法解析,那么将尝试使用节点上的 DNS 解析服务。这是一种较为常见的解析策略。
-
Default: 这是另一种默认的 DNS 解析策略。在此模式下,Pod 会先尝试通过节点上的 DNS 解析服务解析域名。如果无法解析,那么会尝试使用集群的 DNS 服务。这种策略适用于需要在节点本地解析的特定场景。
-
None: 在此模式下,Pod 不会配置 DNS 设置。它不会添加 /etc/resolv.conf 文件,这意味着在容器内无法进行域名解析。此选项适用于需要自行配置 DNS 设置的情况。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
dnsConfig:
nameservers:
- 8.8.8.8
searches:
- my-domain.local
dnsPolicy: None
其实配置 dns 到 pod 内还是 kubelet 的功能,只不过 coreDNS 提供了动态解析域名与 ip。如果需要使用本机 resolve 文件,则可以使用 default