k8s中的pod的dns的配置策略以及dns原理


k8s中的pod的dns的配置策略以及dns原理

pod中的dns解析配置

  • hostAliase配置
    在pod中配置hosts别名来设置pod中的具体的dns。全局配置
...
      hostAliases:
      - ip: "10.0.7.10"
        hostnames:
        - "ylfq-mysql.xxx.com"
      - ip: "10.0.7.6"
        hostnames:
        - "ylfq-redis.xxx.com"
        ...
  • dnsConfig

在pod中配置具体的dns的nameserver解析服务主机,全局配置

dnsConfig:
    nameservers:
      - 172.xxx.xxx.201
    searches:
      - ns1.svc.cluster.local
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0
  • dns策略
None: 无任何策略,忽略dns设置
Default:默认的策略,从node节点上面继承
ClusterFirst:集群优先,从集群内部的dns
ClusterFirstWithHostNet: 针对运行模式为host网络的pod,集群优先,并使用host主机网络

我们目前使用的clusterFirst比较多。

pod中的相关文件说明

  • /etc/hosts

如果没有特别定义的话,hosts中是只读的,记录了本地ip地址和podname的解析

[root@autoins-96c96f8f8-nf9qv tomcat]# cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
172.68.4.37     autoins-96c96f8f8-nf9qv

如果有hostAlias的话

[root@autoins-96c96f8f8-nf9qv tomcat]# cat /etc/hosts
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
172.68.4.37     autoins-96c96f8f8-nf9qv

# Entries added by HostAliases.
10.0.7.10       ylfq-mysql.xxx.com
10.0.7.6        ylfq-redis.xxxx.com

如果是hostNetwork模式,挂载的主机的/etc/hosts文件

www-data@k8s-node-03:/etc/nginx$ cat /etc/hosts
# Kubernetes-managed hosts file (host network).
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.2.11 k8s-master-01.novalocal
10.0.2.12 k8s-master-02.novalocal
10.0.2.13 k8s-master-03.novalocal
  • /etc/reslove.conf

默认为集群内部的dns的地址

[root@autoins-96c96f8f8-nf9qv tomcat]# cat /etc/resolv.conf 
nameserver 172.70.0.10
search stjr.svc.cluster.local svc.cluster.local cluster.local openstacklocal novalocal
options ndots:5

如果是hostnetwork模式,同node主机

www-data@k8s-node-03:/etc/nginx$ cat /etc/resolv.conf 
nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 223.6.6.6

集群内的dns解析原理

1,dnsserver会监控k8sapi的添加service的事件,然后添加相应的解析记录
2,pod通过dns解析后,访问server
3,clusterip的记录格式为:
<service>.<ns>.svc.<zone>. <ttl> IN A <cluster-ip>
4,无头服务的记录格式为:
<service>.<ns>.svc.<zone>. <ttl> IN A <endpoint-ip>

dns原理

dns的原理,请自行百度,这里不在赘述

k8s中的coredns

coredns是k8s中的一个基础组件,用来提供集群内部的dns服务。

架构图

具体的结构

  • caddy
    一个go写的web服务
  • file、log、health等
    coredns中定义的插件名称
  • coredns 封装的coredns最上层服务

coredns对外暴露多个端口

  • 53TCP
    dns的tcp代理
  • 53UDP
    dns的udp代理
  • 9153
    dns的prometheus监控
  • 8080http
    coredns的健康检查接口。

coredns的configmap

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2019-07-24T09:54:45Z"
  name: coredns
  namespace: kube-system

corefile是coredns默认的加载的配置文件

上面定义了几个组件。

  • errors 错误模块
  • health 开启监控检测
  • kubernetes kubernetes的解析
  • prometheus 监控的配置
  • proxy 代理为/etc/resolv.conf文件
  • cache 缓存30s中
  • loop
  • reload 每隔30s重新reload一下配置
  • loadbalance 负载均衡配置,默认只有轮训
  • loop 本地回环检测

coredns的k8s中的部署

coredns通过deploymnet运行,deployment文件(略)。 具体的执行步骤:

  • 挂载configmap到容器中的/etc/core/Corefile
  • 运行容器
  • 通过coredns来和k8s通讯,获取相关信息

注意,默认的coredns只有一个。需要手动修改deployment为2个副本来保证k8s的高可用

应用示例

coredns自定义网站解析

自定义www.baidu.com的解析为111.111.111.111;自定义k8s-core-01的解析为10.10.1.10. 修改configmap

#kubectl edit cm coredns -n kube-system
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           upstream
           fallthrough in-addr.arpa ip6.arpa
        }
        hosts {
           111.111.111.111 www.baidu.com
           10.10.1.10  k8s-core-01
           fallthrough
        }
        prometheus :9153
        proxy . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2019-07-24T09:54:45Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "66036779"
  selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
  uid: 11084b5f-adf9-11e9-904e-fa163ef07187

等待30s后生效。如果30s后没有生效的话,可以考虑重启coredns。