Kubernetes 的DNS系统

  • DNS服务是非必需的
  • 通常以插件(add-on)的方式安装
  • Kube-dns,CoreDNS常用

过程

  1. Kubernetes的DNS应用部署好后,会对外暴露一个服务-Cluster IP
  2. DNS服务Cluster IP分配后,系统(一般是指安装程序)会给Kubelet配置–cluster-dns=启动参数
  3. DNS服务的IP地址将在用户容器启动时传递,并由kubelet写入每个容器的/etc/resolv.conf文件
  4. 集群内的容器通过访问该服务的Cluster IP+53端口获得域名解析服务
  5. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值