Service
- 创建普通service 会以my-svc.my-namespace.svc.cluster.local 的形式指派一个 DNS A 记录,并解析到该service的Cluster IP。
- 创建“Headless” Service(没有Cluster IP)也会以 my-svc.my-namespace.svc.cluster.local 的形式被指派一个 DNS A 记录,但是并不会解析到的Cluster IP,而是解析到一组被选中的pod 的IP,如果没有backend则不做处理。
[root@kvm5-k8s-test1 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api-server ClusterIP 172.18.23.244 <none> 8080/TCP 47h
# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/cc/app# nslookup api-server.kube-system.svc.cluster.local
Server: 172.18.0.3
Address: 172.18.0.3#53
Name: api-server.kube-system.svc.cluster.local
Address: 172.18.23.244
Pod
- 创建Pod 会以 pod-ip-address.my-namespace.pod.cluster.local 这种形式被指派一个 DNS A 记录。
# Pod
[root@kvm5-k8s-test1 ~]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
api-server-654999ff9-z4bbc 1/1 Running 0 160m 172.19.3.75 kvm100-k8s-test5 <none>
# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/lain/app# nslookup 172-19-3-75.kube-system.pod.cluster.local
Server: 172.18.0.3
Address: 172.18.0.3#53
Name: 172-19-3-75.kube-system.pod.cluster.local
Address: 172.19.3.75
Pod内部的本地DNS配置
root@console-web-bcc786b9-4rmlw:/cc/app# cat /etc/resolv.conf
nameserver 172.18.0.3
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Pod’s DNS 策略
- “Default“: pod 继承其运行的宿主机dns解析
- “ClusterFirst“: 如果请求的地址与集群的域名后缀不一致,则转向宿主机的dns解析,相同则集群内部解析。这个选项是k8s pod 的 默认选项
- “ClusterFirstWithHostNet“: hostNetwork 宿主机网络
- “None“: 忽略k8s环境,用户可以在spec中使用dnsConfig关键字配置dns设置
k8s集群域名配置
--cluster-dns=<dns-service-ip>
--cluster-domain=<default-local-domain>
K8S DNS 参考
CoreDNS
- 介绍
- 配置
kubernetes [ZONES...] {
resyncperiod DURATION
endpoint URL [URL...]
tls CERT KEY CACERT
kubeconfig KUBECONFIG CONTEXT
namespaces NAMESPACE...
labels EXPRESSION
pods POD-MODE
endpoint_pod_names
upstream [ADDRESS...]
ttl TTL
noendpoints
transfer to ADDRESS...
fallthrough [ZONES...]
ignore empty_service
}
- Corefile
server 以什么协议监听在哪个端口(可以同时定义多个 server 监听不同端口)
server 负责哪个 zone 的权威(authoritative)DNS 解析
server 将加载哪些插件
- 当前集群配置在 kube-system->configmap->coredns 下
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream /etc/resolv.conf
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
- 上述配置解释
- errors:标准错误输出
- health:服务健康检查
- kubernetes:k8s 插件, 容器内部访问以laincloud.test为后缀的服务,由coredns 负责解析,其他则转到下一个插件去解析
- 暴露给 prometheus 监控指标
- proxy: 任何没有以laincloud.test为后缀的服务由容器所在宿主机解析
- reload: 修改配置文件自动重启
- loadbalance:负载均衡