ExternalDNS为Kubernetes的入口和服务配置外部DNS服务器,帮您使用公共DNS服务器来发现Kubernetes资源。ExternalDNS是从Kubernetes API中检索资源列表(如Service、Ingress等资源),以确定所需的DNS记录信息。本文介绍如何在ACK集群中部署和使用ExternalDNS服务,并通过示例验证其功能特性。
步骤一:配置RAM权限
对ACK集群的Worker RAM角色授予对应的RAM权限,操作步骤如下:
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息。
在集群信息页面的基本信息页签下,单击Worker RAM角色右侧的链接。
在左侧导航栏,单击权限策略。然后在权限策略页面单击创建权限策略
在创建权限策略页面,单击脚本编辑页签,将如下自定义授权策略的内容拷贝到编辑框中。
{ "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的角色页面单击新增权限,然后单击所有策略类型下拉框中的自定义策略,选中已创建好的自定义策略,然后单击确定。
单击完成。
步骤二:部署ExternalDNS服务
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击创建。参考如下信息完成基本信息配置。
参数
示例值
应用名
external-dns
命名空间
kube-system
来源
默认为应用市场
Chart
应用场景:选择全部。
支持架构:选择amd64。
搜索框:搜索external-dns。
选中external-dns,单击下一步。
在参数配置页面,选择Chart 版本,根据实际需求选择合适的
alibabaCloudZoneType
,默认为public
。然后单击确定。public
表示使用阿里云公共DNS服务。private
表示使用阿里云PrivateZone服务。
步骤三:使用ExternalDNS服务
ExternalDNS只支持LoadBalancer类型的Service和Ingress配置使用。
为Service配置阿里云公共DNS服务
登录云解析DNS控制台,查找对应域名信息。
说明确保域名符合规范且完成实名认证。
根据已有经过实名认证的域名,使用以下命令创建测试应用。
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记录如下。
使用以下命令,测试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服务
登录云解析DNS控制台,查找对应域名信息。
说明确保域名符合规范且完成实名认证。
根据已有经过实名认证的域名,使用以下命令,创建测试应用。
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记录如下。
使用以下命令,测试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功能,需确保4中alibabaCloudZoneType
值为private
,且PrivateZone对应的私有域名已关联VPC,操作步骤如下:
登录云解析DNS控制台。
在左侧导航栏单击内网DNS解析(PrivateZone),然后在内网DNS解析(PrivateZone)中单击添加域名(Zone),然后在弹出的添加内置权威域名 (Zone)对话框中,输入内置权威域名 (Zone),并单击确定。
找到目标Zone,单击其操作列下的解析记录,手动添加一条记录,有解析记录后才能关联VPC。
关于PrivateZone解析记录支持的记录类型及使用说明,请参见PrivateZone解析记录支持的记录类型。
在添加完解析记录后,单击其操作列下的生效范围设置,在阿里云VPC内网下拉框选择集群对应的VPC信息后,再单击确认进行关联。
使用以下命令,创建测试应用。
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: nginx name: nginx EOF
说明其中
external-dns.alpha.kubernetes.io/hostname
为PrivateZone的域名,ExternalDNS会自动创建IP对应的DNS记录。测试应用创建完成后,稍等片刻即可在云解析DNS控制台看到自动添加的DNS记录如下。
使用以下命令,测试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服务
登录云解析DNS控制台。
在左侧导航栏单击内网DNS解析(PrivateZone),然后在内网DNS解析(PrivateZone)中单击添加域名(Zone),然后在弹出的添加内置权威域名 (Zone)对话框中,输入内置权威域名 (Zone),并单击确定。
找到目标Zone,单击其操作列下的解析记录,手动添加一条记录,有解析记录后才能关联VPC。
关于PrivateZone解析记录支持的记录类型及使用说明,请参见PrivateZone解析记录支持的记录类型。
在添加完解析记录后,单击其操作列下的生效范围设置,在阿里云VPC内网下拉框选择集群对应的VPC信息后,再单击确认进行关联。
使用以下命令,创建测试应用。
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记录如下。
使用以下命令,测试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>