日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

DNS最佳實踐

DNS是Kubernetes集群中至關重要的基礎服務之一,在客戶端設置不合理、集群規模較大等情況下DNS容易出現解析超時、解析失敗等現象。本文介紹Kubernetes集群中DNS的最佳實踐,幫助您避免此類問題。

前提條件

本文目錄

有關CoreDNS的更多信息,請參見CoreDNS官方文檔

優化域名解析請求

DNS域名解析請求是Kubernetes最高頻的網絡行為之一,其中很多請求是可以優化和避免的。您可以通過以下方式優化域名解析請求:

  • (推薦)使用連接池:當一個容器應用需要頻繁請求另一服務時,推薦使用連接池。連接池可以將請求上游服務的鏈接緩存在內存中,避免每次訪問時域名解析和TCP建連的開銷。

  • 使用DNS緩存:

    • (推薦)當您的應用無法改造成通過連接池連接另一服務時,可以考慮在應用側緩存DNS解析結果,具體操作,請參見使用節點DNS緩存NodeLocal DNSCache

    • 如果NodeLocal DNSCache無法適用的,可以在容器內置NSCD(Name Service Cache Daemon)緩存。關于如何使用NSCD緩存,請參見在Kubernetes集群中使用NSCD

  • 優化resolv.conf文件:由于resolv.conf文件中ndotssearch兩個參數的機制作用,容器內配置域名的不同寫法決定了域名解析的效率,關于ndotssearch兩個參數的機制詳情,請參見DNS原理和配置說明

  • 優化域名配置:當容器內應用需要訪問某域名時,該域名按以下原則配置,可以最大程度減少域名解析嘗試次數,繼而減少域名解析耗時。

    • Pod訪問同命名空間的Service,優先使用<service-name>訪問,其中service-name代指Service名稱。

    • Pod跨命名空間訪問Service,優先使用<service-name>.<namespace-name>訪問,其中namespace-name代指Service所處的命名空間。

    • Pod訪問集群外部域名時,優先使用FQDN類型域名訪問,這類域名通過常見域名最后加半角句號(.)的方式來指定地址,可以避免search搜索域拼接帶來的多次無效搜索,例如需要訪問www.aliyun.com,則優先使用FQDN類型域名www.aliyun.com.來訪問。

使用合適的容器鏡像

Alpine容器鏡像內置的musl libc庫與標準glibc的實現存在以下差異:

  • 3.3及更早版本Alpine不支持search參數,不支持搜索域,無法完成服務發現。

  • 并發請求/etc/resolv.conf中配置的多個DNS服務器,導致NodeLocal DNSCache優化失效。

  • 并發使用同一Socket請求A和AAAA記錄,在舊版本內核上觸發Conntrack源端口沖突導致丟包問題。

關于以上問題的更多信息,請參見musl libc

當Kubernetes集群中部署的容器采用了Alpine作為基礎鏡像時,可能會因為上述musl libc特性而無法正常解析域名,建議嘗試更換基礎鏡像,如Debian、CentOS等。

避免IPVS缺陷導致的DNS概率性解析超時問題

當集群使用IPVS作為kube-proxy負載均衡模式時,您可能會在CoreDNS縮容或重啟時遇到DNS概率性解析超時的問題。該問題由社區Linux內核缺陷導致,具體信息,請參見IPVS

您可以通過以下任意方式降低IPVS缺陷的影響:

使用節點DNS緩存NodeLocal DNSCache

在ACK集群中部署NodeLocal DNSCache可以提升服務發現的穩定性和性能,NodeLocal DNSCache通過在集群節點上作為DaemonSet運行DNS緩存代理來提高集群DNS性能。

關于更多NodeLocal DNSCache的介紹及如何在ACK集群中部署NodeLocal DNSCache的具體步驟,請參見使用NodeLocal DNSCache

使用合適的CoreDNS版本

CoreDNS對Kubernetes版本實現了較好的向后兼容,建議您保持CoreDNS版本為較新的穩定版本。ACK組件管理中心提供了CoreDNS的安裝、升級、配置能力,您可以關注組件管理中組件狀態,若CoreDNS組件顯示可升級,請盡快選擇業務低峰期進行升級。

CoreDNS v1.7.0以下的版本存在風險隱患,包括且不僅限于以下:

不同版本的Kubernetes集群,推薦的CoreDNS最低版本有所區別。如下表:

Kubernetes版本

推薦的最低CoreDNS版本

v1.14.8以下(停止維護)

v1.6.2

v1.14.8及以上,1.20.4以下

v1.7.0.0-f59c03d-aliyun

1.20.4及以上

v1.8.4.1-3a376cc-aliyun

說明

Kubernetes 1.14.8以下的版本現已停止維護,請盡快升級至更高版本后,升級CoreDNS。

監控CoreDNS運行狀態

監控指標

CoreDNS通過標準的Prometheus接口暴露出解析結果等健康指標,發現CoreDNS服務端甚至上游DNS服務器的異常。

阿里云Prometheus監控默認內置了CoreDNS相關的指標監控和告警規則,您可以在容器服務管理控制臺開啟Prometheus及儀表盤功能。具體操作,請參見CoreDNS組件監控

若您是自建Prometheus監控Kubernetes集群,可以在Prometheus觀測相關指標,并對重點指標設置告警。具體操作,請參見CoreDNS Prometheus官方文檔

運行日志

在DNS異常發生的情況下,CoreDNS日志有助于您快速診斷異常根因。建議您開啟CoreDNS域名解析日志和其SLS日志采集,具體操作,請參見分析和監控CoreDNS日志

Kubernetes事件投遞

在v1.9.3.6-32932850-aliyun及以上版本的CoreDNS中,您可以開啟k8s_event插件以將CoreDNS關鍵日志以Kubernetes事件的形式投遞到事件中心。關于k8s_event插件,請參見k8s_event

全新部署的CoreDNS會默認開啟該功能。如果您是從低版本CoreDNS升級到v1.9.3.6-32932850-aliyun及以上版本的,您需要手動修改配置文件以開啟該功能。

  1. 執行如下命令,打開CoreDNS配置文件。

    kubectl -n kube-system edit configmap/coredns
  2. 新增kubeAPI和k8s_event插件。

    apiVersion: v1
    data:
      Corefile: |
        .:53 {
            errors
            health {
                lameduck 15s
            }
    
            // 新增開始(請忽略其他差異)。
            kubeapi
            k8s_event {
              level info error warning // 將info、error、warning狀態關鍵日志投遞。
            }
            // 新增結束。
    
            kubernetes cluster.local in-addr.arpa ip6.arpa {
                pods verified
                fallthrough in-addr.arpa ip6.arpa
            }
            // 下方略。
        }
  3. 檢查CoreDNS Pod運行狀態和運行日志,運行日志中出現reload字樣后說明修改成功。

合理調整集群CoreDNS部署狀態

合理調整CoreDNS副本數

建議您在任何情況下設置CoreDNS副本數應至少為2,且副本數維持在一個合適的水位以承載整個集群的解析。

CoreDNS所能提供的域名解析QPS與CPU消耗成正相關,開啟緩存的情況下,單個CPU可以支撐10000+ QPS的域名解析請求。不同類型的業務對域名請求的QPS需求存在較大差異,您可以觀察每個CoreDNS副本的峰值CPU使用量,如果其在業務峰值期間占用CPU大于一核,建議您對CoreDNS進行副本擴容。無法確定峰值CPU使用量時,可以保守采用副本數和集群節點數1:8的比值來部署,即每擴容8個集群節點,增加一個CoreDNS副本,但副本數不應大于10。針對100節點以上的集群,推薦使用節點DNS緩存NodeLocal DNSCache。具體操作,請參見使用節點DNS緩存NodeLocal DNSCache

說明

UDP報文缺少重傳機制,在CoreDNS副本停止過程中,CoreDNS任意副本縮容或重啟可能會導致接收到的UDP報文丟失,觸發整個集群域名解析超時或異常。當集群節點存在IPVS UDP缺陷導致的丟包風險時,CoreDNS任意副本縮容或重啟可能會導致長達五分鐘的整個集群域名解析超時或異常。關于IPVS缺陷導致解析異常的解決方案,請參見IPVS缺陷導致解析異常

合理分配CoreDNS副本運行的位置

建議您在部署CoreDNS副本時,應將CoreDNS副本打散在不同可用區、不同集群節點上,避免單節點、單可用區故障。CoreDNS默認配置了按節點的弱反親和性,可能會因為節點資源不足導致部分或全部副本部署在同一節點上,如果遇到這種情況,請刪除Pod重新觸發其調度來調整。

CoreDNS所運行的集群節點應避免CPU、內存用滿的情況,否則會影響域名解析的QPS和響應延遲。當集群節點條件允許時,可以考慮使用自定義參數將CoreDNS調度至獨立的集群節點上,以提供穩定的域名解析服務。關于CoreDNS調度至獨立的集群節點的方式,請參見使用自定義參數完成CoreDNS獨占部署。

手動擴容副本數

當集群節點數長時間較為固定時,您可以通過以下命令擴容CoreDNS副本數。

kubectl scale --replicas={target} deployment/coredns -n kube-system
說明

將目標副本數{target}設置成目標值。

自動擴容副本數(cluster-autoscaler)

當集群節點數不斷增長時,您可以通過以下YAML部署集群水平伸縮器cluster-proportional-autoscaler動態擴容副本數量:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dns-autoscaler
  namespace: kube-system
  labels:
    k8s-app: dns-autoscaler
spec:
  selector:
    matchLabels:
      k8s-app: dns-autoscaler
  template:
    metadata:
      labels:
        k8s-app: dns-autoscaler
    spec:
      serviceAccountName: admin
      containers:
      - name: autoscaler
        image: registry.cn-hangzhou.aliyuncs.com/acs/cluster-proportional-autoscaler:1.8.4
        resources:
          requests:
            cpu: "200m"
            memory: "150Mi"
        command:
        - /cluster-proportional-autoscaler
        - --namespace=kube-system
        - --configmap=dns-autoscaler
        - --nodelabels=type!=virtual-kubelet
        - --target=Deployment/coredns
        - --default-params={"linear":{"coresPerReplica":64,"nodesPerReplica":8,"min":2,"max":100,"preventSinglePointFailure":true}}
        - --logtostderr=true
        - --v=9

上述使用線程伸縮策略中,CoreDNS副本數的計算公式為replicas = max (ceil (cores × 1/coresPerReplica), ceil (nodes × 1/nodesPerReplica) ),且CoreDNS副本數受到maxmin限制。線程伸縮策略參數如下。

{
      "coresPerReplica": 64,
      "nodesPerReplica": 8,
      "min": 2,
      "max": 100,
      "preventSinglePointFailure": true
}

基于CPU負載指標自動擴容副本數(HPA)

由于HPA會頻繁觸發CoreDNS副本縮容,建議您不要使用容器水平擴縮容(HPA),如果您的場景下必須依賴于HPA,請參考以下基于CPU負載的策略配置:

---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: coredns-hpa
  namespace: kube-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: coredns
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
說明

關于HPA使用方式的更多信息,請參見容器水平伸縮(HPA)

使用自定義參數完成CoreDNS獨占節點部署

  1. 登錄容器服務管理控制臺,在左側導航欄單擊集群

  2. 集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇節點管理 > 節點

  3. 節點頁面,單擊標簽與污點管理

  4. 標簽與污點管理頁面,選中目標節點,單擊添加標簽

    說明

    節點數應大于CoreDNS副本數,避免單個節點上運行多個CoreDNS副本。

  5. 添加對話框中,設置以下參數,然后單擊確定

    • 名稱:node-role.kubernetes.io/coredns

    • :true

  6. 在集群管理頁左側導航欄中,選擇運維管理 > 組件管理,然后搜索CoreDNS

  7. 單擊CoreDNS卡片的配置,在配置對話框,單擊NodeSelector右側的,設置以下參數,然后單擊確定

    • Key:node-role.kubernetes.io/coredns

    • Value:true

    CoreDNS會重新調度至指定標簽的節點上。

合理配置CoreDNS

容器服務ACK僅提供CoreDNS的默認配置,您應關注配置中的各個參數,優化其配置,以使CoreDNS可以為您的業務容器正常提供DNS服務。CoreDNS的配置非常靈活,具體操作,請參見DNS原理和配置說明CoreDNS官方文檔

您也可以通過容器智能運維中定時巡檢和故障診斷功能完成CoreDNS配置文件的檢查。當容器智能運維檢查結果中提示CoreDNS Configmap配置異常時,請逐個檢查以上項目。

合理調整CoreDNS的資源Request和Limit

CoreDNS的資源消耗具有以下特點:

  • CoreDNS啟動、配置文件重新加載,APIServer連接、重連的過程中,CPU和內存占用會有增加。

  • CoreDNS的CPU占用和其承載的域名QPS呈正相關。

  • CoreDNS的內存占用和集群規模、Service數量呈正相關。

部署CoreDNS時采用的默認資源Request和Limit如下表,建議您根據集群實際運行情況及時做出調整,具體操作,請參見運維管理-組件管理-網絡-CoreDNS-參數配置。

資源類型

Request/Limit

默認值

備注

CPU

Request

100m

Limit

不設置

調低該值會影響CoreDNS能提供的域名解析QPS。

內存

Request

100 Mi

Limit

2 Gi

調低該值可能會有內存不足OOM風險。

說明

低于1.8.4版本的CoreDNS默認設置可能會與上表有所差異,請進行調整。

關閉kube-dns服務的親和性配置

親和性配置可能導致CoreDNS不同副本間存在較大負載差異,建議按以下步驟關閉:

控制臺操作方式

  1. 登錄容器服務管理控制臺
  2. 在控制臺左側導航欄中,單擊集群

  3. 集群列表頁面中,單擊目標集群名稱或者目標集群右側操作列下的詳情

  4. 在集群管理頁左側導航欄中,選擇網絡 > 服務

  5. 在kube-system命名空間下,單擊服務kube-dns右側的YAML編輯

    • 如果發現sessionAffinity字段為None,則無需進行以下步驟。

    • 如果發現sessionAffinityClientIP,則進行以下步驟。

  6. 刪除sessionAffinitysessionAffinityConfig及所有子鍵,然后單擊更新

    # 刪除以下所有內容。
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800
  7. 再次單擊服務kube-dns右側的YAML編輯,校驗sessionAffinity字段是否為None,為None則Kube-DNS服務變更成功。

命令行方式

  1. 執行以下命令查看kube-dns服務配置信息。

    kubectl -n kube-system get svc kube-dns -o yaml
    • 如果發現sessionAffinity字段為None,則無需執行以下步驟。

    • 如果發現sessionAffinityClientIP,則執行以下步驟。

  2. 執行以下命令打開并編輯名為kube-dns的服務。

    kubectl -n kube-system edit service kube-dns
  3. 刪除sessionAffinity相關設置(sessionAffinitysessionAffinityConfig及所有子鍵),并保存退出。

    # 刪除以下所有內容。
    sessionAffinity: ClientIP
      sessionAffinityConfig:
        clientIP:
          timeoutSeconds: 10800
  4. 修改完成后,再次運行以下命令查看sessionAffinity字段是否為None,為None則Kube-DNS服務變更成功。

    kubectl -n kube-system get svc kube-dns -o yaml

關閉Autopath插件

部分早期版本的CoreDNS開啟了Autopath插件,該插件在一些極端場景下會導致解析結果出錯,請確認其是否處于開啟狀態,并編輯配置文件將其關閉。更多信息,請參見Autopath

說明

關閉Autopath插件后,客戶端發起的域名解析請求QPS最高會增加3倍,解析單個域名耗時最高增加3倍,請關注CoreDNS負載和業務影響。

  1. 執行kubectl -n kube-system edit configmap coredns命令,打開CoreDNS配置文件。

  2. 刪除autopath @kubernetes一行后保存退出。

  3. 檢查CoreDNS Pod運行狀態和運行日志,運行日志中出現reload字樣后說明修改成功。

配置CoreDNS優雅退出

說明

CoreDNS刷新配置過程中,可能會占用額外內存。修改CoreDNS配置項后,請觀察Pod運行狀態,如果出現Pod內存不足的情況,請及時修改CoreDNS Deployment中容器內存限制,建議將內存調整至2 GB。

控制臺操作方式

  1. 登錄容器服務管理控制臺

  2. 在控制臺左側導航欄中,單擊集群

  3. 集群列表頁面中,單擊目標集群名稱或者目標集群右側操作列下的詳情

  4. 在集群管理頁左側導航欄中,選擇配置管理 > 配置項

  5. 在kube-system命名空間下,單擊配置項coredns右側的YAML編輯

  6. 參考下列的CoreDNS配置文件,保證health插件開啟,并調整lameduck參數為15s,然后單擊確定

  7. .:53 {
            errors       
            # health插件在不同的CoreDNS版本中可能有不同的設置情形。
            # 情形一:默認未啟用health插件。   
            # 情形二:默認啟用health插件,但未設置lameduck時間。
            health      
            # 情形三:默認啟用health插件,設置了lameduck時間為5s。   
            health {
                lameduck 5s
            }      
            # 對于以上三種情形,應統一修改成以下,調整lameduck參數為15s。
            health {
                lameduck 15s
            }       
            # 其它插件不需要修改,此處省略。
        }

如果CoreDNS Pod正常運行則說明CoreDNS優雅退出的配置更新成功。如果CoreDNS Pod出現異常,可以通過查看Pod事件及日志定位原因。

命令行操作方式

  1. 執行以下命令打開CoreDNS配置文件。

  2. kubectl -n kube-system edit configmap/coredns
  3. 參考下列的Corefile文件,保證health插件開啟,并調整lameduck參數為15s

  4. .:53 {
            errors     
            # health插件在不同的CoreDNS版本中可能有不同的設置情形。
            # 情形一:默認未啟用health插件。     
            # 情形二:默認啟用health插件,但未設置lameduck時間。
            health
            # 情形三:默認啟用health插件,設置了lameduck時間為5s。   
            health {
                lameduck 5s
            }
            # 對于以上三種情形,應統一修改成以下,調整lameduck參數為15s。
            health {
                lameduck 15s
            }
            # 其它插件不需要修改,此處省略。
        }
  5. 修改CoreDNS配置文件后保存退出。

  6. 如果CoreDNS正常運行則說明CoreDNS優雅退出的配置更新成功。如果CoreDNS Pod出現異常,可以通過查看Pod事件及日志定位原因。

配置Forward插件與上游VPC DNS服務器的默認協議

NodeLocal DNSCache采用TCP協議與CoreDNS進行通信,CoreDNS會根據請求來源使用的協議與上游DNS服務器進行通信。因此默認情況下,來自業務容器的集群外部域名解析請求會依次經過NodeLocal DNSCache、CoreDNS,最終以TCP協議請求VPC內DNS服務器,即ECS上默認配置的100.100.2.136和100.100.2.138兩個 IP。

VPC內DNS服務器對TCP協議支持有限,如果您使用了NodeLocal DNSCache,您需要修改CoreDNS配置,讓其總是優先采用UDP協議與上游DNS服務器進行通信,避免解析異常。建議您使用以下方式修改CoreDNS配置文件,即修改命名空間kube-system下名為coredns的ConfigMap。具體操作,請參見管理配置項。在forward插件中指定請求上游的協議為perfer_udp,修改之后CoreDNS會優先使用UDP協議與上游通信。修改方式如下所示:

# 修改前
forward . /etc/resolv.conf
# 修改后
forward . /etc/resolv.conf {
  prefer_udp
}

配置Ready就緒探針插件

大于1.5.0版本的CoreDNS必須配置ready插件以啟用就緒探針。

  1. 執行如下命令,打開CoreDNS配置文件。

    kubectl -n kube-system edit configmap/coredns
  2. 檢查是否包含ready一行,若無,則增加ready一行,按Esc鍵、輸入:wq!并按Enter鍵,保存修改后的配置文件并退出編輯模式。

    apiVersion: v1
    data:
     Corefile: |
      .:53 {
        errors
        health {
          lameduck 15s
        }
        ready # 如果沒有這一行,請增加本行,注意縮進與Kubernetes保持一致。
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods verified
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . /etc/resolv.conf {
          max_concurrent 1000
                prefer_udp
        }
        cache 30
        loop
        log
        reload
        loadbalance
      }
  3. 檢查CoreDNS Pod運行狀態和運行日志,運行日志中出現reload字樣后說明修改成功。