- DNS服务是非必需的
- 通常以插件(add-on)的方式安装
- Kube-dns,CoreDNS常用
过程
- Kubernetes的DNS应用部署好后,会对外暴露一个服务-Cluster IP
- DNS服务Cluster IP分配后,系统(一般是指安装程序)会给Kubelet配置–cluster-dns=启动参数
- DNS服务的IP地址将在用户容器启动时传递,并由kubelet写入每个容器的/etc/resolv.conf文件
- 集群内的容器通过访问该服务的Cluster IP+53端口获得域名解析服务
- Kubelet的–cluster_domain=参数支持配置集群域名后缀,默认是cluster.local
Pod内部resolv.conf
root@master-01:~/tmp# kubectl exec backend01 -it sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
集群dns服务和endpoint
root@master-01:~/tmp# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 49d
root@master-01:~/tmp# kubectl get ep kube-dns -n kube-system
NAME ENDPOINTS AGE
kube-dns 10.0.184.75:53,10.0.184.76:53,10.0.184.75:53 + 3 more... 49d
Kubernetes DNS的命名方案
Kubernetes DNS加载项支持正向查找(A Record)、端口查找(SRV记录)、反向IP地址查找(PTR记录)及其他功能
对于Service,Kubernetes DNS服务器会生成三类DNS记录,分别是A记录、SRV记录和CNAME记录
A记录
A记录(A Record)是用于将域或子域指向某个IP地址的DNS记录的最基本类型。记录包括域名、解析它的IP地址和以秒为单位的TTL。
A Record分为“normal”和“headless”服务。
- “normal”服务分配一个DNS A Record作为表单your-svc.your-namespace.svc.cluster.local的name。此name解析为服务的集群IP。
映射关系:{service name}.{service namespace}.svc.{domain} —>Cluster IP
/ # nslookup backendsvc.testing.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: backendsvc.testing.svc.cluster.local
Address: 10.110.180.21
- “headless”服务为表单your-svc.your-namespace.svc.cluster.local的name分配一个DNS A Record。与“normal”服务相反,此name解析的是,为服务选择的一组Pod IP
映射关系:{service name}.{service namespace}.svc.{domain} —>Pod list - Pod也会分配一个DNS A记录:{pod-IP}.{pod namespace}.pod.{domain} —>pod IP,但是,一般使用IP地址
SRV记录
SRV记录是通过描述某些服务协议和地址促进服务发现的。SRV记录通常定义一个符号名称和作为域名一部分的传输协议(如TCP),并定义给定服务的优先级、权重、端口和目标。
- SRV记录是为“normal”或“headless”服务的部分指定端口创建的。
- SRV记录采用_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local的形式。
- 对于“normal”服务,解析为端口号和域名是my-svc.my-namespace.svc.cluster.local
- 对于“headless”服务,解析为多个answer,每个answer都包含auto-generated-name.my-svc.my-namespace.svc.cluster.local表单的Pod端口号和域名
CNAME记录
CNAME记录用于将域或子域指向另一个主机名。
在Kubernetes中,CNAME记录可用于联合服务的跨集群服务发现。
Kubernetes域名解析策略
Kubernetes域名解析策略对应到Pod配置中的dnsPolicy,有4种可选策略,分别是None、ClusterFirstWithHostNet、ClusterFirst和Default
- None:从Kubernetes 1.9版本起引入的一个新选项值。它允许Pod忽略Kubernetes环境中的DNS设置。应使用dnsConfigPod规范中的字段提供所有DNS设置;
- ClusterFirstWithHostNet:对于使用hostNetwork运行的Pod,用户应该明确设置其DNS策略为ClusterFirstWithHostNet;
- ClusterFirst:任何与配置的群集域后缀(例如cluster.local)不匹配的DNS查询(例如“www.kubernetes.io”)将转发到从宿主机上继承的上游域名服务器。集群管理员可以根据需要配置上游DNS服务器;
- Default:Pod从宿主机上继承名称解析配置
例如,默认为ClusterFirst:
apiVersion: v1
kind: Pod
metadata:
annotations:
...
kubernetes.io/psp: restrict-policy
labels:
run: backend01
name: backend01
namespace: default
resourceVersion: "767484"
uid: cf5fc4cb-c573-4cc3-81dd-acc086145517
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/tanzu/network-multitool:1.1
imagePullPolicy: IfNotPresent
name: backend01
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-rkrp8
readOnly: true
**dnsPolicy: ClusterFirst**
enableServiceLinks: true
nodeName: worker-01
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
在这种模式下,转发dns到宿主机的DNS:
/ # nslookup cisco.com
Server: 10.96.0.10
Address: 10.96.0.10#53
Non-authoritative answer
:
Name: cisco.com
Address: 72.163.4.185
Name: cisco.com
Address: 2001:420:1101:1::185