在 Kubernetes 中,若要让部署的 Docker 容器使用外部 DNS 服务器,可以通过以下步骤配置。具体方法取决于是想针对单个 Pod 还是整个集群生效:
方法 1:针对单个 Pod 配置外部 DNS
修改 Pod 的 YAML 配置,直接指定 DNS 服务器地址。
示例 YAML:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
– name: mycontainer
image: nginx
dnsPolicy: "None" # 禁用默认的 DNS 策略
dnsConfig:
nameservers:
– 8.8.8.8 # 外部 DNS 服务器 IP
– 1.1.1.1 # 可选备用 DNS
searches:
– default.svc.cluster.local # 保留集群默认搜索域(可选)
– svc.cluster.local
– cluster.local
options:
– name: ndots
value: "2"
关键参数说明:
- dnsPolicy: None: 禁用默认的集群 DNS(如 CoreDNS)。
- dnsConfig.nameservers: 指定外部 DNS 服务器地址列表。
- searches: 定义域名搜索顺序,建议保留集群默认搜索域以解析内部服务。
- options: 调整 DNS 解析参数(如 ndots 控制域名匹配规则)。
方法 2:修改集群 DNS 设置(CoreDNS)
通过修改 CoreDNS 配置,将所有非集群域名的解析请求转发到外部 DNS 服务器。
步骤:
编辑 CoreDNS 的 ConfigMap:
kubectl edit configmap coredns -n kube-system
在 Corefile 中添加转发规则:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube–system
data:
Corefile: |
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
# 将非集群域名请求转发到外部 DNS
forward . 8.8.8.8 1.1.1.1 {
prefer_udp
}
cache 30
loop
reload
loadbalance
}
- forward . 8.8.8.8: 将所有非集群域名的解析请求转发到 8.8.8.8(Google DNS)。
- 可添加多个外部 DNS 地址,用空格分隔。
重启 CoreDNS(可选):
kubectl rollout restart deployment coredns -n kube-system
方法 3:修改节点级 DNS 配置
如果希望所有 Pod 默认使用外部 DNS,可以修改节点的 /etc/resolv.conf,但需注意这会影响所有未显式配置 DNS 的 Pod。
在节点上编辑 /etc/resolv.conf:
nameserver 8.8.8.8
nameserver 1.1.1.1
确保 Pod 的 dnsPolicy 设置为 Default:
spec:
dnsPolicy: Default # Pod 继承节点的 DNS 配置
验证 DNS 配置
在 Pod 内执行命令,确认 DNS 解析是否生效:
kubectl exec -it mypod — nslookup google.com
# 或
kubectl exec -it mypod — cat /etc/resolv.conf
评论前必须登录!
注册