CoreDNS 服务发现
CoreDNS 概述
CoreDNS 是 Kubernetes 默认的 DNS 服务器,运行在 kube-system 命名空间,为集群内所有 Pod 提供 DNS 解析。
DNS 解析规则
# Service DNS
<service>.<namespace>.svc.cluster.local
# Pod DNS(需要 subdomain)
<pod-ip-dashes>.<namespace>.pod.cluster.local
# Headless Service 的 Pod
<pod-name>.<service>.<namespace>.svc.cluster.local
# 示例
my-service.default.svc.cluster.local
mysql-0.mysql.default.svc.cluster.localCorefile 配置
# kubectl get configmap coredns -n kube-system -o yaml
.: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
}自定义 DNS 配置
yaml
# 为特定域名配置自定义 DNS 服务器
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
}
# 内部域名转发到内部 DNS
forward internal.company.com 10.0.0.53
# 其他域名转发到公网 DNS
forward . 8.8.8.8 8.8.4.4
cache 30
loop
reload
loadbalance
}Pod DNS 策略
yaml
spec:
dnsPolicy: ClusterFirst # 默认,先查集群 DNS
# ClusterFirstWithHostNet:使用 hostNetwork 时也查集群 DNS
# Default:使用节点 DNS
# None:完全自定义
# 自定义 DNS 配置
dnsConfig:
nameservers:
- 1.1.1.1
searches:
- my-namespace.svc.cluster.local
- svc.cluster.local
options:
- name: ndots
value: "2"
- name: timeout
value: "5"常用排查
bash
# 测试 DNS 解析
kubectl run dns-test --image=busybox:1.35 --rm -it -- nslookup kubernetes.default
kubectl run dns-test --image=busybox:1.35 --rm -it -- nslookup my-service.production
# 查看 CoreDNS 日志
kubectl logs -n kube-system -l k8s-app=kube-dns
# 查看 CoreDNS 指标
kubectl port-forward -n kube-system svc/kube-dns 9153:9153
curl http://localhost:9153/metrics | grep coredns_dns_requests_total
# 检查 Pod 的 DNS 配置
kubectl exec my-pod -- cat /etc/resolv.conf