kubernetes会为每个service对象创建dns记录,这个操作是由dns插件完成的,基本上所有集群都会使用coredns作为dns插件。
kubernetes中的服务是区分命名空间的,nginx这个域名在默认情况下是使用本pod所在namespace解析的,如pod所在的namespace为default,则默认解析为nginx.default。下列是一个示例pod的resolv文件配置
[root@master1 ~]# kubectl exec -it nginx-deployment-66b6c48dd5-95c7f -- cat /etc/resolv.confnameserver 172.17.0.10search default.svc.cluster.local svc.cluster.local cluster.localoptions ndots:5
服务对象分为普通服务和无头服务,无头服务是指spec.clusterIP=None的,其他服务则为普通服务。
如果service是一个普通服务对象,则会为其创建一个dns A记录(ipv6则为AAAA记录),该记录的ip地址是在kube-controller-manager的--service-cluster-ip-range参数指定的网段内,该网段和pod网段以及节点网段都不在一个网段内。
如果service是一个无头服务,则会创建一些列dns A记录,记录的ip地址是pod的ip。
k8s还会为服务对象的每个命名端口创建srv记录。如_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example。对于普通服务,解析到my-svc.my-namespace.svc.cluster-domain.exampl加端口号。对于无头服务会为每个pod创建一个类似的记录。auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example加端口号。
通常情况下,会为所有pod创建如下类型的dns解析:
pod-ip-address.my-namespace.pod.cluster-domain.example -> pod-ip
kubectl run aaaa --image=nginx
[root@master1 ~]# nslookup 10-248-5-2.default.pod.cluster.local 172.17.0.10
Server: 172.17.0.10
Address: 172.17.0.10#53
Name: 10-248-5-2.default.pod.cluster.local
Address: 10.248.5.2
通常情况下,会为deployment和daemonset的pod,且通过service进行暴露的话,则会创建下列dns解析:
pod-ip-address.deployment.my-namespace.svc.cluster.local -> pod-ip
针对deployment进行测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port 80
[root@master3 ~]# nslookup nginx.default.svc.cluster.local 172.17.0.10
Server: 172.17.0.10
Address: 172.17.0.10#53
…
kubernetes网路 – 服务与DNS
发布于