kubernetes-notes

1. Pod的DNS策略

可以在pod中定义dnsPolicy字段来设置dns的策略。

2. Pod DNS的配置

当 Pod 的 dnsPolicy 设置为 “None” 时,必须指定 dnsConfig 字段。

dnsConfig 字段中属性:

示例:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster-domain.example
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0

通过以上配置,容器内的/etc/resolv.conf文件内容为:

kubectl exec -it dns-example -- cat /etc/resolv.conf
nameserver 1.2.3.4
search ns1.svc.cluster-domain.example my.dns.search.suffix
options ndots:2 edns0

3. 自定义DNS服务

默认一般使用coredns来作为k8s的dns服务器。默认使用deployment的方式来运行coredns,会创建一个名为kube-dns的service,并用ClusterIP(默认为10.96.0.10)来作为集群内的pod的nameserver。

kubelet 使用 --cluster-dns=<DNS 服务 IP> 标志将 DNS 解析器的信息传递给每个容器。使用 --cluster-domain=<默认本地域名> 标志配置本地域名。

可查看默认配置:

# cat /var/lib/kubelet/config.yaml
...
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local

总结:

当没有给pod设置任何dns策略时,则默认使用ClusterFirst的策略,即nameserver的IP为coredns的ClusterIP。通过coredns来解析服务。

3.1. 配置继承节点的DNS解析

3.2. 配置CoreDNS

 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefi: |
    .: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
    }

配置说明:

Corefile 配置包括以下 CoreDNS 插件

3.3. 配置存根域和上游域名服务器

CoreDNS 能够使用 forward 插件配置存根域和上游域名服务器。

示例:

在 “10.150.0.1” 处运行了 Consul 域服务器, 且所有 Consul 名称都带有后缀 .consul.local

consul.local:53 {
    errors
    cache 30
    forward . 10.150.0.1
}

要显式强制所有非集群 DNS 查找通过特定的域名服务器(位于 172.16.0.1),可将 forward 指向该域名服务器,而不是 /etc/resolv.conf

forward .  172.16.0.1

完整示例;

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . 172.16.0.1
        cache 30
        loop
        reload
        loadbalance
    }
    consul.local:53 {
        errors
        cache 30
        forward . 10.150.0.1
    }    

4. 调试DNS问题

创建一个调试的pod

apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
  - name: dnsutils
    image: registry.k8s.io/e2e-test-images/jessie-dnsutils:1.3
    command:
      - sleep
      - "infinity"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

部署调试pod

4.1. 查看Coredns服务是否正常

kubectl get svc --namespace=kube-system 

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
...
kube-dns     ClusterIP   10.0.0.10      <none>        53/UDP,53/TCP        1h
...

4.2. 查看/etc/resolv.conf

查看容器内dns配置是否符合预期。

kubectl exec -ti dnsutils -- cat /etc/resolv.conf

4.3. nslookup查看解析报错

kubectl exec -i -t dnsutils -- nslookup kubernetes.default


Server:    10.0.0.10
Address 1: 10.0.0.10

Name:      kubernetes.default
Address 1: 10.0.0.1

参考: