Service
- 創建普通service 會以my-svc.my-namespace.svc.cluster.local 的形式指派一個 DNS A 記錄,並解析到該service的Cluster IP。
- 創建“Headless” Service(沒有Cluster IP)也會以 my-svc.my-namespace.svc.cluster.local 的形式被指派一個 DNS A 記錄,但是並不會解析到的Cluster IP,而是解析到一組被選中的pod 的IP,如果沒有backend則不做處理。
[root@kvm5-k8s-test1 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
api-server ClusterIP 172.18.23.244 <none> 8080/TCP 47h
# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/cc/app# nslookup api-server.kube-system.svc.cluster.local
Server: 172.18.0.3
Address: 172.18.0.3#53
Name: api-server.kube-system.svc.cluster.local
Address: 172.18.23.244
Pod
- 創建Pod 會以 pod-ip-address.my-namespace.pod.cluster.local 這種形式被指派一個 DNS A 記錄。
# Pod
[root@kvm5-k8s-test1 ~]# kubectl get pod -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
api-server-654999ff9-z4bbc 1/1 Running 0 160m 172.19.3.75 kvm100-k8s-test5 <none>
# DNS解析
[root@kvm5-k8s-test1 ~]# kubectl exec -it console-web-bcc786b9-4rmlw bash -n kube-system
root@console-web-bcc786b9-4rmlw:/lain/app# nslookup 172-19-3-75.kube-system.pod.cluster.local
Server: 172.18.0.3
Address: 172.18.0.3#53
Name: 172-19-3-75.kube-system.pod.cluster.local
Address: 172.19.3.75
Pod內部的本地DNS配置
root@console-web-bcc786b9-4rmlw:/cc/app# cat /etc/resolv.conf
nameserver 172.18.0.3
search kube-system.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
Pod’s DNS 策略
- “Default“: pod 繼承其運行的宿主機dns解析
- “ClusterFirst“: 如果請求的地址與集羣的域名後綴不一致,則轉向宿主機的dns解析,相同則集羣內部解析。這個選項是k8s pod 的 默認選項
- “ClusterFirstWithHostNet“: hostNetwork 宿主機網絡
- “None“: 忽略k8s環境,用戶可以在spec中使用dnsConfig關鍵字配置dns設置
k8s集羣域名配置
--cluster-dns=<dns-service-ip>
--cluster-domain=<default-local-domain>
K8S DNS 參考
CoreDNS
- 介紹
- 配置
kubernetes [ZONES...] {
resyncperiod DURATION
endpoint URL [URL...]
tls CERT KEY CACERT
kubeconfig KUBECONFIG CONTEXT
namespaces NAMESPACE...
labels EXPRESSION
pods POD-MODE
endpoint_pod_names
upstream [ADDRESS...]
ttl TTL
noendpoints
transfer to ADDRESS...
fallthrough [ZONES...]
ignore empty_service
}
- Corefile
server 以什麼協議監聽在哪個端口(可以同時定義多個 server 監聽不同端口)
server 負責哪個 zone 的權威(authoritative)DNS 解析
server 將加載哪些插件
- 當前集羣配置在 kube-system->configmap->coredns 下
Corefile: |
.:53 {
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream /etc/resolv.conf
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}
- 上述配置解釋
- errors:標準錯誤輸出
- health:服務健康檢查
- kubernetes:k8s 插件, 容器內部訪問以laincloud.test爲後綴的服務,由coredns 負責解析,其他則轉到下一個插件去解析
- 暴露給 prometheus 監控指標
- proxy: 任何沒有以laincloud.test爲後綴的服務由容器所在宿主機解析
- reload: 修改配置文件自動重啓
- loadbalance:負載均衡