本文介绍如何在腾讯云容器服务集群中配置 ExternalDNS。
什么是 External DNS
ExternalDNS 将公开的 Kubernetes Service 和 Ingress 与 DNS 提供商同步。
受 Kubernetes 集群内部 DNS 服务器 Kubernetes DNS 的启发,ExternalDNS 使 Kubernetes 资源可通过公共 DNS 服务器发现。与 KubeDNS 一样,它从 Kubernetes API 中检索资源列表(Service、Ingress 等),以确定所需的 DNS 记录列表。然而,与 KubeDNS 不同的是,它本身并不是一个 DNS 服务器,而只是用于对接其他 DNS 提供商。更多请查看 ExternalDNS Readme。
操作步骤
配置 API 密钥 的 CAM 权限
{"version": "2.0","statement": [{"effect": "allow","action": ["dnspod:ModifyRecord","dnspod:DeleteRecord","dnspod:CreateRecord","dnspod:DescribeRecordList","dnspod:DescribeDomainList"],"resource": ["*"]},{"effect": "allow","action": ["privatedns:DescribePrivateZoneList","privatedns:DescribePrivateZoneRecordList","privatedns:CreatePrivateZoneRecord","privatedns:DeletePrivateZoneRecord","privatedns:ModifyPrivateZoneRecord"],"resource": ["*"]}]}
部署 ExternalDNS 服务
配置 PrivateDNS 或 DNSPod
Private DNS 是基于腾讯云私有网络 VPC 的私有域名解析及管理服务,为您提供安全、稳定、高效的内网智能解析服务。支持在私有网络中快速构建 DNS 系统,满足定制化解析需求。
如果您想在腾讯云的环境中使用内网的 DNS 服务:
配置下列 YAML 文件中参数:
--tencent-cloud-zone-type=private
在 PrivateDNS 控制台创建 DNS 域名。DNS 域名记录中将会包含 DNS 记录。
如果您想在腾讯云的环境中使用公网的 DNS 服务:
配置下列 YAML 文件中参数:
--tencent-cloud-zone-type=public
在 DNSPod 控制台 创建 DNS 域名。DNS 域名记录中将会包含 DNS 记录。
在 Kubernetes 集群中部署相关资源对象
apiVersion: v1kind: ServiceAccountmetadata:name: external-dns---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata:name: external-dnsrules:- apiGroups: [""]resources: ["services","endpoints","pods"]verbs: ["get","watch","list"]- apiGroups: ["extensions","networking.k8s.io"]resources: ["ingresses"]verbs: ["get","watch","list"]- apiGroups: [""]resources: ["nodes"]verbs: ["list"]---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:name: external-dns-viewerroleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: external-dnssubjects:- kind: ServiceAccountname: external-dnsnamespace: default---apiVersion: v1kind: ConfigMapmetadata:name: external-dnsdata:tencent-cloud.json: |{"regionId": "ap-shanghai", # 必填项,集群所在地域的 ID"secretId": "******","secretKey": "******","vpcId": "vpc-******", # 必填项,集群所在 VPC 的 ID"internetEndpoint": false # 腾讯云API入口。如果需要在非腾讯云的环境部署,改为true,走公网访问。}---apiVersion: apps/v1kind: Deploymentmetadata:name: external-dnsspec:strategy:type: Recreateselector:matchLabels:app: external-dnstemplate:metadata:labels:app: external-dnsspec:containers:- args:- --source=service- --source=ingress- --domain-filter=external-dns-test.com # 将使 ExternalDNS 仅看到与提供的域匹配的托管区域,省略以处理所有可用的托管区域- --provider=tencentcloud- --policy=sync # 设置“upsert-only”将阻止 ExternalDNS 删除任何记录- --tencent-cloud-zone-type=private # 仅管理私有托管区域。设置“public”以使用公网 DNS 服务- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.jsonimage: ccr.ccs.tencentyun.com/tke-market/external-dns:v1.1.0imagePullPolicy: Alwaysname: external-dnsresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/kubernetesname: config-volumereadOnly: truednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}serviceAccount: external-dnsserviceAccountName: external-dnsterminationGracePeriodSeconds: 30volumes:- configMap:defaultMode: 420items:- key: tencent-cloud.jsonpath: tencent-cloud.jsonname: external-dnsname: config-volume
使用示例
创建名为 nginx 的 Service,示例如下:
apiVersion: v1kind: Servicemetadata:name: nginxannotations:external-dns.alpha.kubernetes.io/hostname: nginx.external-dns-test.com # 公网域名地址external-dns.alpha.kubernetes.io/internal-hostname: nginx-internal.external-dns-test.com # 内网域名地址external-dns.alpha.kubernetes.io/ttl: "600"spec:type: LoadBalancerports:- port: 80name: httptargetPort: 80selector:app: nginx---apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80name: http
nginx.external-dns-test.com
将记录服务的 LoadBalancer VIP。nginx-internal.external-dns-test.com
将记录服务的 ClusterIP。所有的 DNS 记录的 TTL 都是 600。执行验证
名为 "nginx" 的 Service 的 ClusterIP 为
192.168.254.214
,LoadBalancer VIP 为 129.211.179.31
,如下图所示:
当您在与集群位于同一个 VPC 内的节点上,ping 名为 "nginx" 的 Service 的 annotation 域名声明时,会自动解析成 ClusterIP 和 LoadBalancer VIP。