全部產品
Search
文件中心

Container Service for Kubernetes:DNS策略配置和網域名稱解析說明

更新時間:Jul 12, 2024

本文介紹如何針對不同的情境使用dnsPolicy欄位為叢集的Pod配置DNS策略,以及如何使用HostAliases欄位在容器Pod內部解析網域名稱到固定IP地址。

前提條件

背景資訊

叢集DNS網域名稱解析原理詳情,請參見Kubernetes叢集中DNS網域名稱解析原理

ACK叢集預設部署了一套CoreDNS工作負載,並通過kube-dns的服務名暴露DNS服務。ACK部署的CoreDNS工作負載後端是兩個名為coredns的Pod,叢集會根據Pod內的配置,將網域名稱請求發送至叢集DNS伺服器擷取結果。

  • 可以執行以下命令查看kube-dns的服務詳情。

    kubectl get svc kube-dns -n kube-system
  • 可以執行以下命令查看CoreDNS的Pod的詳情。

    kubectl get deployment coredns -n kube-system

使用dnsPolicy欄位為叢集的Pod配置DNS策略

ACK支援通過dnsPolicy欄位為每個Pod配置不同的DNS策略。目前ACK叢集支援四種策略:

  • ClusterFirst:這是預設的DNS策略,意味著當Pod需要進行網域名稱解析時,首先會查詢叢集內部的CoreDNS服務。通過CoreDNS來做網域名稱解析,表示Pod的/etc/resolv.conf檔案被自動設定指向kube-dns服務地址。

  • None:使用該策略,Kubernetes會忽略叢集的DNS策略。需要您提供dnsConfig欄位來指定DNS配置資訊,否則Pod可能無法正確解析任何網域名稱。

  • Default:Pod直接繼承叢集節點的網域名稱解析配置。即在ACK叢集直接使用ECS的/etc/resolv.conf檔案(檔案內配置的是阿里雲DNS服務)。

  • ClusterFirstWithHostNet:強制在hostNetwork網路模式下使用ClusterFirst策略(預設使用Default策略)。

針對上述四種策略,本文列舉四種情境分別介紹如何配置dnsPolicy。

情境一:使用ACK叢集提供的CoreDNS來做網域名稱解析

如需使用ACK叢集提供的CoreDNS來做網域名稱解析,可使用dnsPolicy: ClusterFirst策略。樣本配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: ClusterFirst

情境二:Pod層面自訂DNS配置

當您需要給Deployment類型的工作負載指定DNS配置時,可使用dnsPolicy: None策略。樣本配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: None
  dnsConfig:
    nameservers: ["169.254.xx.xx"]
    searches:
    - default.svc.cluster.local
    - svc.cluster.local
    - cluster.local
    options:
    - name: ndots
      value: "2"

其中,dnsConfig中的參數說明如下:

參數

描述

nameservers

將用作Pod的DNS伺服器的IP地址清單。最多可以指定3個IP地址。當Pod的dnsPolicy設定為None時,列表必須至少包含一個IP地址,否則此屬性是可選的。列出的DNS的IP列表將合并到基於dnsPolicy產生的網域名稱解析檔案的nameserver欄位中,並重複資料刪除的地址。

searches

Pod中主機名稱尋找的DNS搜尋域列表。此屬性是可選的。指定後,提供的列表將合并到從所選DNS策略產生的基本搜尋網域名稱中,並重複資料刪除的網域名稱。Kubernetes最多允許6個搜尋域。

說明

當DNS Server不可達時,僅會嘗試第一個搜尋域。

options

可選的對象列表,其中每個對象可以具有name屬性(必需)和value屬性(可選)。此屬性中的內容將合并到從指定的DNS策略產生的選項中,並重複資料刪除的條目。關於options更多詳細資料,請參見DNS解析及緩衝策略說明

更多資訊,請參見Kubernetes官網的DNS配置說明

情境三:採用阿里雲ECS的DNS配置

當您的應用Pod不需要訪問叢集內的其他服務,只需要通過阿里雲DNS來做解析,也不希望DNS解析經過CoreDNS,可以採用dnsPolicy: Default策略。樣本配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine
  dnsPolicy: Default

情境四:在HostNetwork網路模式下訪問叢集服務

如果您的應用Pod使用hostNetwork:true來配置網路,Pod中啟動並執行應用程式可以直接看到宿主機的網路介面,其DNS策略預設為Default,不能訪問叢集內的服務。如果您希望在此網路模式下訪問叢集內服務,可使用dnsPolicy: ClusterFirstWithHostNet策略。樣本配置如下:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  namespace: default
spec:
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  containers:
  - image: alpine
    command:
      - sleep
      - "10000"
    imagePullPolicy: Always
    name: alpine

使用HostAliases欄位在容器Pod內部解析網域名稱到固定IP地址

在容器Pod內部解析網域名稱到固定IP地址有如下兩種方法:

  • 全域配置(影響整個叢集中所有Pod對特定網域名稱的解析結果:當您希望在容器Pod內部解析某一網域名稱到固定IP地址時,可以在CoreDNS啟用hosts外掛程式,具體操作,請參見CoreDNS的擴充配置

  • 針對單個Pod的配置:若您希望僅在某個容器Pod內部解析網域名稱到固定IP地址生效,您可以通過HostAliases欄位修改容器Pod內的/etc/hosts檔案實現該操作。樣本配置如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: hostaliases-pod
    spec:
      hostAliases:
      - ip: "127.0.**.**"
        hostnames:
        - "foo.local"
        - "bar.local"
      - ip: "10.1.**.**"
        hostnames:
        - "foo.remote"
      containers:
      - name: cat-hosts
        image: busybox:1.28
        command:
        - cat
        args:
        - "/etc/hosts"

    當為Pod的spec欄位中增加hostAliases欄位後,Pod啟動後/etc/hosts檔案會被初始化成以下內容。

    # Kubernetes-managed hosts file.
    127.0.**.**	localhost
    ::1	localhost ip6-localhost ip6-loopback
    fe00::0	ip6-localnet
    fe00::0	ip6-mcastprefix
    fe00::1	ip6-allnodes
    fe00::2	ip6-allrouters
    10.200.**.**	hostaliases-pod
    
    # Entries added by HostAliases.
    127.0.**.**	foo.local	bar.local
    10.1.**.**	foo.remote	bar.remote

    可以看到,foo.local、bar.local、foo.remote網域名稱都已經綁定到固定的IP。

相關文檔