云容器引擎 CCE-工作负载DNS配置说明:工作负载的DNS配置实践

时间:2024-05-31 08:37:30

工作负载的DNS配置实践

前面介绍了Linux系统 域名 解析文件以及Kubernetes为应用提供的DNS相关配置项,下面将举例介绍应用如何进行DNS配置。

  • 场景1 对接Kubernetes内置的Kube-DNS/CoreDNS

    场景说明:

    这种方式适用于应用中的域名解析只涉及集群内部域名,或者集群内部域名+外部域名两种方式,应用默认采用这种配置。

    示例:

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: ClusterFirst
      imagePullSecrets:
        - name: default-secret

    该配置下容器的域名解析文件将如下所示:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • 场景2 直接对接云DNS

    场景说明:

    这种方式适用于应用只访问注册到互联网的外部域名,该场景不能解析集群内部域名。

    示例:

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: Default  #使用kubelet的“--resolv-conf”参数指向的域名解析文件(CCE集群在该配置下对接云DNS)
      imagePullSecrets:
        - name: default-secret

    该配置下容器的域名解析文件将如下所示:

    nameserver 100.125.x.x
  • 场景3 主机网络模式的应用对接Kube-DNS/CoreDNS

    场景说明:

    对于配置主机网络模式的应用,默认对接云DNS,如果应用需要对接Kube-DNS/CoreDNS,需将dnsPolicy设置为“ClusterFirstWithHostNet”。

    示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: default-secret

    该配置下容器的域名解析文件将如下所示:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
  • 场景4 自定义应用的域名配置

    场景说明:

    用户可以完全自定义配置应用的域名解析文件,这种方式非常灵活,dnsPolicy和dnsConfig配合使用,几乎能够满足所有使用场景,如对接用户自建DNS的场景、串联多个DNS的场景以及优化DNS配置选项的场景等等。

    示例1:对接用户自建DNS

    该配置下,dnsPolicy为“None”,应用的域名解析文件完全根据dnsConfig配置生成。

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
        - 10.2.3.4  #用户自建DNS的IP地址
        searches:
        - ns1.svc.cluster.local
        - my.dns.search.suffix
        options:
        - name: ndots
          value: "2"
        - name: timeout
          value: "3"
      imagePullSecrets:
        - name: default-secret

    该配置下容器的域名解析文件将如下所示:

    nameserver 10.2.3.4
    search ns1.svc.cluster.local my.dns.search.suffix
    options timeout:3 ndots:2

    示例2:修改域名解析文件的ndots选项,减少无效的DNS查询

    该配置下,dnsPolicy不为“None”,会在基于dnsPolicy生成的域名解析文件的基础上,追加dnsConfig中配置的dns参数。

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: "ClusterFirst"
      dnsConfig:
        options:
        - name: ndots
          value: "2" #该配置会将基于ClusterFirst策略生成的域名解析文件的ndots:5参数改写为ndots:2
      imagePullSecrets:
        - name: default-secret

    该配置下容器的域名解析文件将如下所示:

    nameserver 10.247.3.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:2

    示例3:串联使用多个DNS

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
      - name: test
        image: nginx:alpine
      dnsPolicy: ClusterFirst  # 追加域名解析配置,集群中会默认对接CoreDNS
      dnsConfig:
        nameservers:
        - 10.2.3.4 # 用户自建DNS的IP地址
      imagePullSecrets:
        - name: default-secret

    容器DNS配置文件中nameserver最多可设置3个 DNS地址

    • 当dnsPolicy设置为ClusterFirst时,如果集群使用CoreDNS,除CoreDNS地址外可追加2个自定义DNS地址,超出部分无效。
    • 当dnsPolicy设置为ClusterFirst时,如果集群同时使用CoreDNSNodeLocal DNSCache,除CoreDNS和NodeLocal DNSCache地址外可追加1个自定义DNS地址,超出部分无效。

    该配置下容器的域名解析文件将如下所示:

    nameserver 10.247.3.10 10.2.3.4
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
support.huaweicloud.com/usermanual-cce/cce_10_0365.html