1. CoreDNS 簡(jiǎn)介
CoreDNS 是插拔化的 DNS 服務(wù)器泽示,即 CoreDNS 內(nèi)部采用插件機(jī)制,所有功能都是插件形式編寫蜜氨。用戶可以使用 Corefile 來配置功能械筛,甚至可以自定義插件擴(kuò)展 CoreDNS。 CoreDNS 總體的工作流程如下:
2.如何配置 CoreDNS
2.1 CoreDNS 的安裝步驟
$kubeadm init phase addon coredns [flags]
#flags 如下選項(xiàng)
--config string
kubeadm 配置文件的路徑飒炎。
--feature-gates string
一組用來描述各種功能特性的鍵值(key=value)對(duì)埋哟。選項(xiàng)是:
IPv6DualStack=true|false (ALPHA - 默認(rèn)值=false)
-h, --help
coredns 操作的幫助命令
--image-repository string 默認(rèn)值:"k8s.gcr.io"
選擇用于拉取控制平面鏡像的容器倉庫
--kubeconfig string 默認(rèn)值:"/etc/kubernetes/admin.conf"
與集群通信時(shí)使用的 kubeconfig 文件。如果未設(shè)置該參數(shù)郎汪,則可以在一組標(biāo)準(zhǔn)位置中搜索現(xiàn)有的 kubeconfig 文件赤赊。
--kubernetes-version string 默認(rèn)值:"stable-1"
為控制平面選擇特定的 Kubernetes 版本闯狱。
--service-cidr string 默認(rèn)值:"10.96.0.0/12"
為服務(wù) VIP 選擇 IP 地址范圍。
--service-dns-domain string 默認(rèn)值:"cluster.local"
服務(wù)使用其它的域名抛计,例如:"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 請(qǐng)求處理工作流和 Corefile 文件詳解
2.2.1 CoreDNS 請(qǐng)求處理工作流
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
配置文件可知,兩個(gè)定義的 DNS Server吹截,分別監(jiān)聽 5300 和 53 端口录豺,即 CoreDNS 的請(qǐng)求處理邏輯,如下圖所示饭弓。
2.2.2 Corefile 配置文件詳解
集群管理員可以修改 CoreDNS Corefile
的 ConfigMap
,以更改服務(wù)發(fā)現(xiàn)的工作方式媒抠。
Corefile
配置文件格式如下:
ZONE:[PORT] {
[PLUGIN] ...
}
? ZONE:定義DNS server負(fù)責(zé)的zone弟断,PORT是可選項(xiàng),默認(rèn)為53趴生;
? PLUGIN:定義DNS server要加載的插件阀趴,每個(gè)插件可以有多個(gè)參數(shù)。
在 Kubernetes 中苍匆,CoreDNS 安裝時(shí)使用如下默認(rèn) 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:錯(cuò)誤記錄到標(biāo)準(zhǔn)輸出刘急。
● health:在 http://localhost:8080/health 處提供 CoreDNS 的健康報(bào)告。
● ready:#在端口 8181 上提供的一個(gè) HTTP 末端浸踩,當(dāng)所有能夠 表達(dá)自身就緒的插件都已就緒時(shí)叔汁,在此末端返回 200 OK。
● kubernetes:處理 k8s 域名解析检碗,ttl
表示響應(yīng)的超時(shí)時(shí)間据块。
● prometheus:CoreDNS 的度量指標(biāo)值以 Prometheus 格式在 http://localhost:9153/metrics 上提供。
● forward:不在 Kubernetes 集群域內(nèi)的任何查詢都將轉(zhuǎn)發(fā)到 預(yù)定義的解析器 (/etc/resolv.conf)折剃。
● cache:?jiǎn)⒂们岸司彺妗?br> ● loop:檢測(cè)到簡(jiǎn)單的轉(zhuǎn)發(fā)環(huán)另假,如果發(fā)現(xiàn)死循環(huán),則中止 CoreDNS 進(jìn)程怕犁。
● reload:允許自動(dòng)重新加載已更改的 Corefile边篮。 編輯 ConfigMap 配置后,請(qǐng)等待兩分鐘奏甫,以使更改生效戈轿。
● loadbalance:這是一個(gè)輪轉(zhuǎn)式 DNS 負(fù)載均衡器, 它在應(yīng)答中隨機(jī)分配 A扶檐、AAAA 和 MX 記錄的順序凶杖。
3.如何使用 CoreDNS
自定義 DNS 設(shè)置的 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
創(chuàng)建上面的 Pod
后,容器 test 會(huì)在其 /etc/resolv.conf
文件內(nèi)容如下所示款筑,可以查看命令是 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 表示域名解析時(shí)候腾么,依次添加后綴
● options 表示當(dāng)域名包含的 “.” 少于 n 個(gè)的時(shí)候,則先添加 search 后綴杈湾。