使用雲廠商託管K8S時容器域名解析注意事項

雲廠商託管 Kubernetes 服務的 Pod 域名解析注意事項

使用雲廠家提供託管式Kubernetes,Pod的域名解析參數,經過界面建立Pod的話,可能廠商界面沒有開放dnsConfig配置,採用了一些默認值,在使用時候,須要瞭解清楚廠商提供的默認配置,不然會存在問題。
典型的一個配置是 ndots ,若是你在Pod內訪問的域名字符串, 數量在 ndots 閾值範圍內,則被認爲是Kubernetes集羣內部域名,會被追加 .<namespace>.svc.cluster.local 後綴,這樣會致使每次解析域名時候有2次(IP4/IP6)無效解析,在大規模併發場景下存在性能瓶頸。html

雲廠商通常將Kubernetes的DNS服務(CoreDNS或SkyDNS)與廠商提供的外部DNS級聯了,所以這種問題再功能測試階段不會被暴露,只在性能測試階段能暴露出來。nginx

DNS查找原理與規則

DNS域名解析配置文件 /etc/resolv.confapi

nameserver 10.247.x.x
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:3

參數說明服務器

  • nameserver 域名解析服務器
  • search 域名的查找後綴規則,查找配置越多,說明域名解析查找匹配次數越多,這裏匹配有3個後綴,則查找規則至少6次,由於IPV4,IPV6都要匹配一次
  • options 域名解析選項,多個KV值;其中典型的有 ndots ,訪問的域名字符串內的點字符數量超過 ndots 值,則認爲是完整域名,直接解析

Kubernetes的dnsConfig配置說明

Kubernetes官網的dns配置說明網絡

  • nameservers:將用做Pod的DNS服務器的IP地址列表。最多能夠指定3個IP地址。當Pod dnsPolicy 設置爲「 None」時,列表必須至少包含一個IP地址,不然此屬性是可選的。列出的服務器將合併到從指定的DNS策略生成的基本名稱服務器,並刪除重複的地址。
  • searches:Pod中主機名查找的DNS搜索域列表。此屬性是可選的。指定後,提供的列表將合併到從所選DNS策略生成的基本搜索域名中。刪除重複的域名。Kubernetes最多容許6個搜索域。
  • options:可選的對象列表,其中每一個對象能夠具備name 屬性(必需)和value屬性(可選)。此屬性中的內容將合併到從指定的DNS策略生成的選項中。刪除重複的條目

dnsPolicy域名解析的幾種場景應用

對應的容器中的deployment的yaml中的dnsPolicy有三種配置參數ClusterFirst, Default, None併發

  • Default:Pod從運行pod的節點繼承名稱解析配置。有關 詳細信息,請參閱相關討論
  • ClusterFirst:任何與配置的羣集域後綴不匹配的DNS查詢(例如"www.kubernetes.io")將轉發到從該節點繼承的上游名稱服務器。羣集管理員可能配置了額外的存根域和上游DNS服務器。有關 在這些狀況下如何處理DNS查詢的詳細信息,請參閱相關討論。
  • ClusterFirstWithHostNet:對於使用hostNetwork運行的Pod,您應該明確設置其DNS策略「 ClusterFirstWithHostNet」。
  • None:Kubernetes v1.9(Beta in v1.10)中引入的新選項值。它容許Pod忽略Kubernetes環境中的DNS設置。應使用dnsConfigPod規範中的字段提供全部DNS設置。請參閱下面的DNS配置子部分。
1. 場景1-採用自定義DNS

採用本身建的DNS來解析Pods中的應用域名配置,能夠參考如下代碼配置,此配置在Pod中的DNS能夠徹底自定義,適用於已經有本身建的DNS,遷移後的應用也不須要去修改相關的配置;app

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searches:
      - ns1.svc.cluster.local
      - my.dns.search.suffix
    options:
      - name: ndots
        value: "2"
      - name: edns0
2. 場景2-採用kubernets的CoreDNS

優先使用Kubernetes的DNS服務解析,失敗後再使用外部級聯的DNS服務解析。性能

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: ClusterFirst
3. 場景3-採用雲廠家公網域名解析

適用於Pods中的域名配置都在公網訪問,這樣的話Pods中的應用都從外部的DNS中解析對應的域名測試

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsPolicy: Default
4. 場景4-採用HostNet的DNS解析

若是在POD中使用hostNetwork:true配置網絡,pod中運行的應用程序能夠直接看到宿主主機的網絡接口,宿主主機所在的局域網上全部網絡接口均可以訪問到該應用程序spa

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

若是不加上dnsPolicy: ClusterFirstWithHostNet, pod默認使用所在宿主主機使用的DNS,這樣也會致使容器內不能經過service name 訪問k8s集羣中其餘POD。

原文連接

使用雲廠商託管K8S時容器域名解析注意事項

相關文章
相關標籤/搜索