應用現狀
在使用CCE時,可能會有解析自定義內部域名的需求,例如:
- 存量代碼配置了用固定域名調用內部其他服務,如果要切換到Kubernetes Service方式,修改配置工作量大。
- 在集群外自建了一個其他服務,需要將集群中的數據通過固定域名發送到這個服務。
解決方案
使用CoreDNS有以下幾種自定義域名解析的方案。
- 為CoreDNS配置存根域:可以直接在控制臺添加,簡單易操作。
- 使用** CoreDNS Hosts **插件配置任意域名解析:簡單直觀,可以添加任意解析記錄,類似在本地/etc/hosts中添加解析記錄。
- 使用** CoreDNS Rewrite **插件指向域名到集群內服務:相當于給Kubernetes中的Service名稱取了個別名,無需提前知道解析記錄的IP地址。
- 使用** CoreDNS Forward **插件將自建 DNS 設為上游 DNS:自建DNS中,可以管理大量的解析記錄,解析記錄專門管理,增刪記錄無需修改CoreDNS配置。
注意事項
CoreDNS修改配置需額外謹慎,因為CoreDNS負責集群的域名解析任務,修改不當可能會導致集群解析出現異常。請做好修改前后的測試驗證。
為CoreDNS配置存根域
集群管理員可以修改CoreDNS Corefile的ConfigMap以更改服務發現的工作方式。
若集群管理員有一個位于10.150.0.1的Consul域名解析服務器,并且所有Consul的域名都帶有.consul.local的后綴。
步驟 1 登錄CCE控制臺,單擊集群名稱進入集群。
步驟 2 在左側導航欄中選擇“插件管理”,在“已安裝插件”下,在CoreDNS下單擊“編輯”,進入插件詳情頁。
步驟 3 在“參數配置”下添加存根域。
修改stub_domains參數,格式為一個鍵值對,鍵為DNS后綴域名,值為一個或一組DNS IP地址,如下所示。
{
"stub_domains": {
"consul.local": [
"10.150.0.1"
]
},
"upstream_nameservers": []
}
步驟 4 單擊“確定”。
也可以通過修改ConfigMap,直接按如下方式添加。
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |-
.:5353 {
bind {$POD_IP}
cache 30
errors
health {$POD_IP}:8080
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
loadbalance round_robin
prometheus {$POD_IP}:9153
forward . /etc/resolv.conf {
policy random
}
reload
}consul.local:5353 {
bind {$POD_IP}
errors
cache 30
forward . 10.150.0.1
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-05-04T04:42:24Z"
labels:
app: coredns
k8s-app: coredns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
release: cceaddon-coredns
name: coredns
namespace: kube-system
resourceVersion: "8663493"
uid: bba87142-9f8d-4056-b8a6-94c3887e9e1d
修改CoreDNS Hosts配置
步驟 1 使用kubectl連接集群。
步驟 2 修改CoreDNS配置文件,將自定義域名添加到hosts中。
將www.example.com指向192.168.1.1,通過CoreDNS解析www.example.com時,會返回192.168.1.1。
注意
此處配置不能遺漏fallthrough字段,fallthrough表示當在hosts找不到要解析的域名時,會將解析任務傳遞給CoreDNS的下一個插件。如果不寫fallthrough的話,任務就此結束,不會繼續解析,會導致集群內部域名解析失敗的情況。
hosts的詳細配置請參見。
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |-
.:5353 {
bind {$POD_IP}
cache 30
errors
health {$POD_IP}:8080
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
hosts {
192.168.1.1 www.example.com
fallthrough
}
loadbalance round_robin
prometheus {$POD_IP}:9153
forward . /etc/resolv.conf
reload
}
kind: ConfigMap
metadata:
creationTimestamp: "2021-08-23T13:27:28Z"
labels:
app: coredns
k8s-app: coredns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
release: cceaddon-coredns
name: coredns
namespace: kube-system
resourceVersion: "460"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: be64aaad-1629-441f-8a40-a3efc0db9fa9
在CoreDNS中修改hosts后,就不用單獨在每個Pod中配置hosts了,帶來了一定的方便性。
添加CoreDNS Rewrite配置指向域名到集群內服務
使用CoreDNS 的 Rewrite 插件,將指定域名解析到某個 Service 的域名,相當于給Service取了個別名。
步驟 1 使用kubectl連接集群。
步驟 2 修改CoreDNS配置文件,將example.com指向default命名空間下的example服務。
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |-
.:5353 {
bind {$POD_IP}
cache 30
errors
health {$POD_IP}:8080
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
rewrite name example.com example.default.svc.cluster.local
loadbalance round_robin
prometheus {$POD_IP}:9153
forward . /etc/resolv.conf
reload
}
kind: ConfigMap
metadata:
creationTimestamp: "2021-08-23T13:27:28Z"
labels:
app: coredns
k8s-app: coredns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
release: cceaddon-coredns
name: coredns
namespace: kube-system
resourceVersion: "460"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: be64aaad-1629-441f-8a40-a3efc0db9fa9
使用CoreDNS級聯自建DNS
步驟 1 使用kubectl連接集群。
步驟 2 修改CoreDNS配置文件,將forward后面的/etc/resolv.conf,改成外部DNS的地址,如下所示。
$ kubectl edit configmap coredns -n kube-system
apiVersion: v1
data:
Corefile: |-
.:5353 {
bind {$POD_IP}
cache 30
errors
health {$POD_IP}:8080
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
loadbalance round_robin
prometheus {$POD_IP}:9153
forward . 192.168.1.1
reload
}
kind: ConfigMap
metadata:
creationTimestamp: "2021-08-23T13:27:28Z"
labels:
app: coredns
k8s-app: coredns
kubernetes.io/cluster-service: "true"
kubernetes.io/name: CoreDNS
release: cceaddon-coredns
name: coredns
namespace: kube-system
resourceVersion: "460"
selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
uid: be64aaad-1629-441f-8a40-a3efc0db9fa9