使用ExternalDNS服务

ExternalDNSKubernetes的入口和服务配置外部DNS服务器,帮您使用公共DNS服务器来发现Kubernetes资源。ExternalDNS是从Kubernetes API中检索资源列表(如Service、Ingress等资源),以确定所需的DNS记录信息。本文介绍如何在ACK集群中部署和使用ExternalDNS服务,并通过示例验证其功能特性。

步骤一:配置RAM权限

ACK集群的Worker RAM角色授予对应的RAM权限,操作步骤如下:

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

  3. 集群信息页面的基本信息页签下,单击Worker RAM角色右侧的链接,前往RAM控制台创建权限策略。

    1. 在左侧导航栏,单击权限策略。然后在权限策略页面单击创建权限策略

      image

    2. 创建权限策略页面,单击脚本编辑页签,将如下自定义授权策略的内容拷贝到编辑框中。

      展开查看策略内容

      {
          "Version": "1",
          "Statement": [
              {
                  "Action": "alidns:AddDomainRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "alidns:DeleteDomainRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "alidns:UpdateDomainRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "alidns:DescribeDomainRecords",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "alidns:DescribeDomains",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:AddZoneRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:DeleteZoneRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:UpdateZoneRecord",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:DescribeZoneRecords",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:DescribeZones",
                  "Resource": "*",
                  "Effect": "Allow"
              },
              {
                  "Action": "pvtz:DescribeZoneInfo",
                  "Resource": "*",
                  "Effect": "Allow"
              }
          ]
      }
    3. 单击确定,输入策略名称后单击确定即可创建自定义策略。

  4. 在左侧导航栏,单击角色,再单击新增权限,然后单击所有策略类型下拉框中的自定义策略,选中已创建好的自定义策略,然后单击确定

  5. 单击完成

步骤二:部署ExternalDNS服务

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  2. Helm页面,单击创建。参考如下信息完成基本信息配置。

    参数

    示例值

    应用名

    external-dns

    命名空间

    kube-system

    来源

    默认为应用市场

    Chart

    • 应用场景:选择全部

    • 支持架构:选择amd64

    • 搜索框:搜索external-dns。

    选中external-dns,单击下一步

  3. 参数配置页面,选择Chart 版本,并根据实际需求选择合适的alibabaCloudZoneType以及policy。然后单击确定

    1. alibabaCloudZoneType:external-dns使用的DNS服务。默认为public

      1. public:使用阿里云公共DNS服务。

      2. private:使用阿里云PrivateZone服务。

    2. policy:集群内Service同步到PrivateZoneDNS记录的策略。

      1. upsert-only:同步写入或更新,不同步删除。

      2. sync:同步写入、更新、删除。

    # public or private
    alibabaCloudZoneType: public
    
    # upsert-only or sync
    # upsert-only would prevent ExternalDNS from deleting any records, omit to enable full synchronization
    # sync would delete records once target service or ingress are released
    policy: upsert-only

步骤三:使用ExternalDNS服务

说明

ExternalDNS只支持LoadBalancer类型的ServiceIngress配置使用。

Service配置阿里云公共DNS服务

  1. 登录云解析DNS控制台,查找对应域名信息。

    说明

    确保域名符合规范且完成实名认证。

    image

  2. 根据已有经过实名认证的域名,使用以下命令创建测试应用。

    kubectl apply -f - << EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      annotations:
        external-dns.alpha.kubernetes.io/hostname: nginx.****  # ****是您经过实名认证的公共域名。
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        name: http
        targetPort: 80
      selector:
        app: nginx
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
    EOF
    说明

    其中external-dns.alpha.kubernetes.io/hostname用来配置需挂载的DNS名称,ExternalDNS会自动创建IP对应的DNS记录。

    测试应用创建完成后,稍等片刻即可在云解析DNS控制台看到自动添加的DNS记录如下。域名记录2

  3. 使用以下命令,测试DNS解析结果。

    [root@iZbp1hy7cb2g933cmy7w3aZ ~]# curl nginx.****.com
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

Ingress配置阿里云公共DNS服务

  1. 登录云解析DNS控制台,查找对应域名信息。

    说明

    确保域名符合规范且完成实名认证。

    image

  2. 根据已有经过实名认证的域名,使用以下命令,创建测试应用。

    kubectl apply -f - << EOF
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        name: http
        targetPort: 80
      selector:
        app: nginx
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx
    spec:
      ingressClassName: nginx
      rules:
      - host: nginx-ing.****  # ****是您经过实名认证的公共域名。
        http:
          paths:
          - backend:
              service:
                name: nginx
                port:
                  number: 80
            path: /
            pathType: ImplementationSpecific
    EOF
    说明

    其中host用来配置需挂载的DNS名称,ExternalDNS会自动创建IP对应的DNS记录。

    测试应用创建完成后,稍等片刻即可在云解析DNS控制台看到自动添加的DNS记录如下。解析记录ingress

  3. 使用以下命令,测试DNS解析结果。

    [root@iZbp1hy7cb2g933cmy7w3aZ ~]# curl nginx-ing.****.com
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    html { color-scheme: light dark; }
    body { width: 35em; margin: 0 auto;
    font-family: Tahoma, Verdana, Arial, sans-serif; }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

Service配置阿里云PrivateZone服务

如果使用阿里云DNS提供PrivateZone功能,需确保4alibabaCloudZoneType值为private,且PrivateZone对应的私有域名已关联VPC,操作步骤如下:

  1. 登录云解析DNS控制台

  2. 在左侧导航栏单击内网DNS解析(PrivateZone),然后在内网DNS解析(PrivateZone)中单击添加域名(Zone),然后在弹出的添加内置权威域名 (Zone)对话框中,输入内置权威域名 (Zone),并单击确定

  3. 找到目标Zone,单击其操作列下的解析记录,手动添加一条记录,有解析记录后才能关联VPC。

    image

    关于PrivateZone解析记录支持的记录类型及使用说明,请参见PrivateZone解析记录支持的记录类型

  4. 在添加完解析记录后,单击其操作列下的生效范围设置,在阿里云VPC内网下拉框选择集群对应的VPC信息后,再单击确定进行关联。

  5. 验证域名解析。

    1. 创建测试应用。

      kubectl apply -f - << EOF
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
        annotations:
          external-dns.alpha.kubernetes.io/hostname: nginx.****  # ****是您在PrivateZone页面添加的Zone名称。
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"  # 私网类型的负载均衡。
      spec:
        type: LoadBalancer
        ports:
        - port: 80
          name: http
          targetPort: 80
        selector:
          app: nginx
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: nginx
        name: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
              name: nginx
      EOF
      说明

      其中external-dns.alpha.kubernetes.io/hostnamePrivateZone的域名,ExternalDNS会自动创建IP对应的DNS记录。

      测试应用创建完成后,稍等片刻即可在云解析DNS控制台看到自动添加的DNS记录如下。Private-2

    2. 测试DNS解析结果。

      [root@iZbp1hy7cb2g933cmy7w3aZ ~]# curl nginx.****
      <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to nginx!</title>
      <style>
      html { color-scheme: light dark; }
      body { width: 35em; margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif; }
      </style>
      </head>
      <body>
      <h1>Welcome to nginx!</h1>
      <p>If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.</p>
      
      <p>For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.</p>
      
      <p><em>Thank you for using nginx.</em></p>
      </body>
      </html>

Ingress配置阿里云PrivateZone服务

  1. 登录云解析DNS控制台

  2. 在左侧导航栏单击内网DNS解析(PrivateZone),然后在内网DNS解析(PrivateZone)中单击添加域名(Zone),然后在弹出的添加内置权威域名 (Zone)对话框中,输入内置权威域名 (Zone),并单击确定

  3. 找到目标Zone,单击其操作列下的解析记录,手动添加一条记录,有解析记录后才能关联VPC。

    image

    关于PrivateZone解析记录支持的记录类型及使用说明,请参见PrivateZone解析记录支持的记录类型

  4. 在添加完解析记录后,单击其操作列下的生效范围设置,在阿里云VPC内网下拉框选择集群对应的VPC信息后,再单击确定进行关联。

  5. 验证域名解析。

    1. 创建测试应用。

      kubectl apply -f - << EOF
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"  #私网类型的负载均衡。
      spec:
        type: LoadBalancer
        ports:
        - port: 80
          name: http
          targetPort: 80
        selector:
          app: nginx
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: nginx
        name: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - image: nginx
              name: nginx
      ---
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: nginx
      spec:
        ingressClassName: nginx
        rules:
        - host: nginx-ing.****  # ****是您在PrivateZone页面添加的Zone名称。
          http:
            paths:
            - backend:
                service:
                  name: nginx
                  port:
                    number: 80
              path: /
              pathType: ImplementationSpecific
      EOF

      测试应用创建完成后,稍等片刻即可在云解析DNS控制台看到自动添加的DNS记录。private-3

    2. 使用以下命令,测试DNS解析结果。

      [root@iZbp1hy7cb2g933cmy7w3aZ ~]# curl nginx-ing.****
      <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to nginx!</title>
      <style>
      html { color-scheme: light dark; }
      body { width: 35em; margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif; }
      </style>
      </head>
      <body>
      <h1>Welcome to nginx!</h1>
      <p>If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.</p>
      
      <p>For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.</p>
      
      <p><em>Thank you for using nginx.</em></p>
      </body>
      </html>