DNS服务

1、K8s集群内有一个DNS服务:

$ k get svc -n kube-system  | grep dns
kube-dns         ClusterIP   10.0.0.10      <none>        53/UDP,53/TCP,9153/TCP   205d

2、K8s集群内有对应的Pod为coredns:

$ k get po -A | grep dns

kube-system            coredns-5db5696c7-9m9s8                      1/1     Running   2 (13h ago)    205d

3、查看defalut命名空间Pod里的/etc/resolv.conf

$ k exec cluster-test-79b978867f-4x2lw  -- cat /etc/resolv.conf

search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.0.0.10
options ndots:5

4、查看aming命名空间Pod里的/etc/resolv.conf

$  k exec ng-deploy-5db56f48f4-qjvsh   -n aming -- cat /etc/resolv.conf

search aming.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.0.0.10
options ndots:5

上面参数说明:

  • nameserver: 定义DNS服务器的IP,其实就是kube-dns那个service的IP。
  • search: 定义域名的查找后缀规则,查找配置越多,说明域名解析查找匹配次数越多。集群匹配有 default.svc.cluster.local、svc.cluster.local、cluster.local 3个后缀,最多进行8次查询 (IPV4和IPV6查询各四次) 才能得到正确解析结果。不同命名空间,这个参数的值也不同。
  • option: 定义域名解析配置文件选项,支持多个KV值。例如该参数设置成ndots:5,说明如果访问的域名字符串内的点字符数量超过ndots值,则认为是完整域名,并被直接解析;如果不足ndots值,则追加search段后缀再进行查询。

DNS测试

1、安装dig命令

$ yum install -y bind-utils

2、解析外网域名

$ dig @10.0.0.10 www.baidu.com

Kubernetes里的DNS-1

3、解析内部域名

查看default命名空间下的服务

$  k get svc

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   205d

解析内部域名

$ dig @10.0.0.10 kubernetes.default.svc.cluster.local

Kubernetes里的DNS-2

说明: kubernetes为service name,service完整域名为service.namespace.svc.cluster.local

4、解析Pod

解析Pod,Pod的域名有点特殊,格式为<pod-ip>.<namespace>.pod.<clusterdomain>,例如10-18-206-93.default.pod.cluster.local

下面进行解析Pod演示说明:

(1)定义YAML

$ vim ng-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myng
  name: ng-deploy
  namespace: aming
spec:
  replicas: 2 ##副本数
  selector:
    matchLabels:
      app: myng
  template:
    metadata:
      labels:
        app: myng
    spec:
      containers:
        - name: myng
          image: nginx:1.21.6
          ports:
          - name: myng-port
            containerPort: 80

(2)应用YAML

$ k apply -f ng-deploy.yaml

(3)查看Pod的IP,这里以 172.17.125.18 为例

$ k get po -n aming -owide

NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
ng-deploy-5db56f48f4-qjvsh   1/1     Running   0          12h   172.17.125.18    k8s-node01     <none>           <none>
ng-deploy-5db56f48f4-w26l8   1/1     Running   0          12h   172.25.244.219   k8s-master01   <none>           <none>

(4)解析Pod

$ dig @10.0.0.10 172-17-125-18.aming.pod.cluster.local

DNS配置

可以通过查看coredns的configmap来获取DNS的配置信息

$ k describe  cm  coredns   -n kube-system
Name:         coredns
Namespace:    kube-system
Labels:       <none>
Annotations:  <none>

Data
====
Corefile:
----
.:53 {
    errors
    health {
      lameduck 5s
    }
    ready
    kubernetes cluster.local in-addr.arpa ip6.arpa {
      fallthrough in-addr.arpa ip6.arpa
    }
    prometheus :9153
    forward . /etc/resolv.conf {
      max_concurrent 1000
    }
    cache 30
    loop
    reload
    loadbalance
}

上面参数说明:

  • errors:错误信息到标准输出。
  • health:CoreDNS自身健康状态报告,默认监听端口8080,一般用来做健康检查。您可以通过http://10.18.206.207:8080/health获取健康状态。(10.18.206.207为coredns其中一个Pod的IP)
  • ready:CoreDNS插件状态报告,默认监听端口8181,一般用来做可读性检查。可以通过http://10.18.206.207:8181/ready获取可读状态。当所有插件都运行后,ready状态为200。
  • kubernetes:CoreDNS kubernetes插件,提供集群内服务解析能力。
  • prometheus:CoreDNS自身metrics数据接口。可以通过http://10.15.0.10:9153/metrics获取prometheus格式的监控数据。(10.15.0.10为kube-dns service的IP)
  • forward(或proxy):将域名查询请求转到预定义的DNS服务器。默认配置中,当域名不在kubernetes域时,将请求转发到预定义的解析器(宿主机的/etc/resolv.conf)中,这是默认配置。
  • cache:DNS缓存时长,单位秒。
  • loop:环路检测,如果检测到环路,则停止CoreDNS。
  • reload:允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟以使更改生效。
  • loadbalance:循环DNS负载均衡器,可以在答案中随机A、AAAA、MX记录的顺序。