Kubernetes 第四章:深入掌握Service-进阶(CoreDNS)
CoreDNS背景概述
CoreDNS是Kubernetes集群中默认的DNS服务器,自1.11版本起全面取代kube-dns。作为CNCF毕业项目,它采用Go语言开发,通过插件化架构实现灵活的域名解析功能。在云原生架构中,CoreDNS承担着服务发现的核心角色,为集群内外的域名解析提供统一解决方案。
核心价值
服务发现:自动注册Kubernetes服务的DNS记录负载均衡:通过A记录轮询实现服务间通信动态更新:实时同步Kubernetes API的变化高可用性:支持多实例部署和故障转移
CoreDNS的概念原理
CoreDNS采用基于插件的架构设计,每个插件负责特定功能模块。其工作流程如下:
接收DNS查询请求依次经过配置的插件链处理返回最终解析结果
核心插件体系
| 插件名称 | 功能描述 |
|---|---|
| kubernetes | 解析集群内部服务域名 |
| forward | 转发外部域名请求 |
| cache | 缓存查询结果提升性能 |
| loadbalance | 实现DNS层负载均衡 |
| prometheus | 提供监控指标收集 |

服务搭建和配置指南
环境准备
# 查看集群版本
kubectl version --short
# 确保版本≥1.11
配置kubelet参数
修改每个Node节点的kubelet配置:
--cluster-dns=169.169.0.100
--cluster-domain=cluster.local
重启kubelet服务后生效:
systemctl restart kubelet
创建CoreDNS配置
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
data:
Corefile: |
cluster.local {
errors
health
kubernetes cluster.local 169.169.0.0/16
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
. {
forward . /etc/resolv.conf
}
部署CoreDNS服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: coredns
namespace: kube-system
spec:
replicas: 2
strategy:
type: RollingUpdate
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
spec:
containers:
- name: coredns
image: coredns/coredns:1.8.4
args: ["-conf", "/etc/coredns/Corefile"]
volumeMounts:
- name: config-volume
mountPath: /etc/coredns
volumes:
- name: config-volume
configMap:
name: coredns
创建Service
apiVersion: v1
kind: Service
metadata:
name: coredns
namespace: kube-system
spec:
ports:
- name: dns
port: 53
protocol: UDP
- name: metrics
port: 9153
protocol: TCP
selector:
k8s-app: kube-dns
验证部署
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl get svc -n kube-system coredns
服务名的DNS解析
解析规则
同命名空间服务:跨命名空间服务:
<service-name>完全限定域名(FQDN):
<service-name>.<namespace>
<service-name>.<namespace>.svc.cluster.local
示例验证
# 创建测试服务
kubectl run nginx --image=nginx --expose --port=80
kubectl get svc nginx
# 在Pod内测试解析
nslookup nginx
nslookup nginx.default
nslookup nginx.default.svc.cluster.local
CoreDNS的配置说明
Corefile关键配置项
cluster.local {
# 错误日志记录
errors
# 健康检查端点
health
# Kubernetes解析插件
kubernetes cluster.local 169.169.0.0/16 {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
# Prometheus监控
prometheus :9153
# 转发配置
forward . /etc/resolv.conf
# 缓存配置
cache 30
# 负载均衡
loadbalance
}
动态配置更新
# 修改ConfigMap后自动生效
kubectl edit configmap coredns -n kube-system
Node本地DNS缓存
dnsmasq配置示例
apiVersion: v1
kind: Pod
metadata:
name: dnsmasq
namespace: kube-system
spec:
containers:
- name: dnsmasq
image: jderusse/dnsmasq
ports:
- containerPort: 53
protocol: UDP
env:
- name: RESOLVCONF
value: "/etc/resolv.conf"
volumeMounts:
- name: resolv-conf
mountPath: "/etc/resolv.conf"
subPath: resolv.conf
volumes:
- name: resolv-conf
configMap:
name: kube-dns
Pod的DNS域名相关特性
默认DNS域名格式
<Pod-IP>.pod.<namespace>.pod.cluster.local
自定义Hostname配置
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
hostname: custom-host
containers:
- image: nginx
Subdomain配置
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
subdomain: app-sub
containers:
- image: nginx
Pod的DNS策略
四种DNS策略对比
| 策略类型 | 行为描述 | 适用场景 |
|---|---|---|
| Default | 使用宿主机DNS配置 | 外部服务访问 |
| ClusterFirst | 优先使用CoreDNS | 集群内服务访问 |
| ClusterFirstWithHostNet | hostNetwork模式专用 | 需直连宿主机网络 |
| None | 完全自定义DNS | 特殊网络需求 |
示例配置
# ClusterFirst策略
spec:
dnsPolicy: ClusterFirst
# None策略
spec:
dnsPolicy: None
dnsConfig:
nameservers: ["8.8.8.8"]
searches: ["example.com"]
options:
- name: ndots
value: "2"
Pod中的自定义DNS配置
HostAliases配置
apiVersion: v1
kind: Pod
metadata:
name: with-hostaliases
spec:
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "example.com"
- "www.example.com"
containers:
- name: test
image: nginx
深度自定义配置
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 169.254.169.254
searches:
- default.svc.cluster.local
- svc.cluster.local
options:
- name: ndots
value: "5"
- name: edns0
性能优化建议
缓存配置:将插件TTL设置为合理值ndots优化:将
cache设置为2-5之间的值负载均衡:启用
ndots插件实现流量分发监控告警:通过Prometheus监控解析延迟拓扑感知:使用
loadbalance插件实现区域感知解析
policy
故障排查技巧
# 检查CoreDNS日志
kubectl logs -n kube-system coredns-xxxx
# 测试DNS解析
dig @169.169.0.100 kubernetes.default.svc.cluster.local
# 检查Pod DNS配置
cat /etc/resolv.conf
# 验证服务端口
nc -zv 169.169.0.100 53
高级配置示例
hosts插件配置
example.com {
hosts {
192.168.1.100 internal.example.com
}
}
域名重写
rewrite name example.com www.example.com
多级缓存
cache 30 example.com
cache 60 .example.com
安全加固措施
限制转发:配置插件的上游DNS服务器访问控制:使用
forward插件限制查询来源日志审计:启用
acl插件记录查询信息速率限制:配置
log防止DDoS攻击
ratelimit
未来发展方向
IPv6支持:完善双栈网络解析能力Service Mesh集成:与Istio等服务网格深度整合智能路由:基于拓扑信息的动态解析安全增强:支持DNSSEC等安全协议
通过以上配置和最佳实践,可以构建稳定高效的DNS服务体系,为Kubernetes应用提供可靠的服务发现基础。建议定期监控CoreDNS的性能指标,根据集群规模和业务需求动态调整配置参数。
















暂无评论内容