【K8s 精选】CKA - 如何配置和使用 CoreDNS
1. CoreDNS 简介
CoreDNS 是插拔化的 DNS 服务器,即 CoreDNS 内部采用插件机制,所有功能都是插件形式编写。用户可以使用 Corefile 来配置功能,甚至可以自定义插件扩展 CoreDNS。 CoreDNS 总体的工作流程如下:
image.png2.如何配置 CoreDNS
2.1 CoreDNS 的安装步骤
$kubeadm init phase addon coredns [flags]
#flags 如下选项
--config string
kubeadm 配置文件的路径。
--feature-gates string
一组用来描述各种功能特性的键值(key=value)对。选项是:
IPv6DualStack=true|false (ALPHA - 默认值=false)
-h, --help
coredns 操作的帮助命令
--image-repository string 默认值:"k8s.gcr.io"
选择用于拉取控制平面镜像的容器仓库
--kubeconfig string 默认值:"/etc/kubernetes/admin.conf"
与集群通信时使用的 kubeconfig 文件。如果未设置该参数,则可以在一组标准位置中搜索现有的 kubeconfig 文件。
--kubernetes-version string 默认值:"stable-1"
为控制平面选择特定的 Kubernetes 版本。
--service-cidr string 默认值:"10.96.0.0/12"
为服务 VIP 选择 IP 地址范围。
--service-dns-domain string 默认值:"cluster.local"
服务使用其它的域名,例如:"myorg.internal"。
#kubeadm init phase 安装 CoreDNS 命令样例
$kubeadm init phase addon coredns --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20
2.2 CoreDNS 请求处理工作流和 Corefile 文件详解
2.2.1 CoreDNS 请求处理工作流
CoreDNS 的 Corefile
配置文件:
coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}
example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}
example.net:53 {
file /etc/coredns/zones/example.net.db
}
.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
}
通过 Corefile
配置文件可知,两个定义的 DNS Server,分别监听 5300 和 53 端口,即 CoreDNS 的请求处理逻辑,如下图所示。
2.2.2 Corefile 配置文件详解
集群管理员可以修改 CoreDNS Corefile
的 ConfigMap
,以更改服务发现的工作方式。
Corefile
配置文件格式如下:
ZONE:[PORT] {
[PLUGIN] ...
}
• ZONE:定义DNS server负责的zone,PORT是可选项,默认为53;
• PLUGIN:定义DNS server要加载的插件,每个插件可以有多个参数。
在 Kubernetes 中,CoreDNS 安装时使用如下默认 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
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
Corefile
配置文件说明:
● errors:错误记录到标准输出。
● health:在 http://localhost:8080/health 处提供 CoreDNS 的健康报告。
● ready:#在端口 8181 上提供的一个 HTTP 末端,当所有能够 表达自身就绪的插件都已就绪时,在此末端返回 200 OK。
● kubernetes:处理 k8s 域名解析,ttl
表示响应的超时时间。
● prometheus:CoreDNS 的度量指标值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。
● forward:不在 Kubernetes 集群域内的任何查询都将转发到 预定义的解析器 (/etc/resolv.conf)。
● cache:启用前端缓存。
● loop:检测到简单的转发环,如果发现死循环,则中止 CoreDNS 进程。
● reload:允许自动重新加载已更改的 Corefile。 编辑 ConfigMap 配置后,请等待两分钟,以使更改生效。
● loadbalance:这是一个轮转式 DNS 负载均衡器, 它在应答中随机分配 A、AAAA 和 MX 记录的顺序。
3.如何使用 CoreDNS
自定义 DNS 设置的 Pod
示例:
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: pod-dns-example
spec:
containers:
- name: test
image: nginx
dnsPolicy: "None"
dnsConfig:
nameservers:
- 10.96.0.10
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
- openstacklocal
options:
- name: ndots
value: "4"
- name: edns0
创建上面的 Pod
后,容器 test 会在其 /etc/resolv.conf
文件内容如下所示,可以查看命令是 kubectl exec -it dns-example -- cat /etc/resolv.conf
。
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:4 edns0
/etc/resolv.conf 文件解析:
● nameserver 表示 CoreDNS 的 ClusterIP
● search 表示域名解析时候,依次添加后缀
● options 表示当域名包含的 “.” 少于 n 个的时候,则先添加 search 后缀。