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。