全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:DNS策略配置和域名解析说明

更新时间:Jul 11, 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。

相关文档