Use external-dns to auto-bond route53 in EKS
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,Install EKS clusterHow to install eksctl# eksctl create cluster -f cluster.yaml apiVersion: eksctl.
千家信息网最后更新 2026年11月01日Use external-dns to auto-bond route53 in EKS
Install EKS cluster
How to install eksctl
# eksctl create cluster -f cluster.yaml apiVersion: eksctl.io/v1alpha5kind: ClusterConfig metadata: name: cluster01 region: ap-northeast-2 vpc: subnets: public: ap-northeast-2a: { id: subnet-dbbb4fb2 } ap-northeast-2b: { id: subnet-2b4fa650 } ap-northeast-2c: { id: subnet-99182fd3 } private: ap-northeast-2a: { id: subnet-dbbb4fb2 } ap-northeast-2b: { id: subnet-2b4fa650 } ap-northeast-2c: { id: subnet-99182fd3 } nodeGroups: - name: ng01 labels: { role: workers } instanceType: t2.xlarge minSize: 2 maxSize: 8 volumeSize: 100 volumeType: gp2 ami: auto amiFamily: Ubuntu1804 #privateNetworking: true ssh: publicKeyName: gexj #publicKeyPath: ~/.ssh/gexj.pubRecord run result
[ℹ] using region ap-northeast-2[✔] using existing VPC (vpc-1fa75276) and subnets (private:[subnet-2b4fa650 subnet-99182fd3 subnet-dbbb4fb2] public:[subnet-dbbb4fb2 subnet-2b4fa650 subnet-99182fd3])[!] custom VPC/subnets will be used; if resulting cluster doesn't function as expected, make sure to review the configuration of VPC/subnets[ℹ] nodegroup "ng01" will use "ami-0f37e6cfe5a2e9281" [Ubuntu1804/1.13][ℹ] using EC2 key pair "gexj"[ℹ] using Kubernetes version 1.13[ℹ] creating EKS cluster "cluster01" in "ap-northeast-2" region[ℹ] 1 nodegroup (ng01) was included[ℹ] will create a CloudFormation stack for cluster itself and 1 nodegroup stack(s)[ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-northeast-2 --name=cluster01'[ℹ] CloudWatch logging will not be enabled for cluster "cluster01" in "ap-northeast-2"[ℹ] you can enable it with 'eksctl utils update-cluster-logging --region=ap-northeast-2 --name=cluster01'[ℹ] 2 sequential tasks: { create cluster control plane "cluster01", create nodegroup "ng01" }[ℹ] building cluster stack "eksctl-cluster01-cluster"[ℹ] deploying stack "eksctl-cluster01-cluster"[ℹ] building nodegroup stack "eksctl-cluster01-nodegroup-ng01"[ℹ] deploying stack "eksctl-cluster01-nodegroup-ng01"[✔] all EKS cluster resource for "cluster01" had been created[✔] saved kubeconfig as "/root/.kube/config"[ℹ] adding role "arn:aws:iam::647035961056:role/eksctl-cluster01-nodegroup-ng01-NodeInstanceRole-GDG5Y6EPZ0B8" to auth ConfigMap[ℹ] nodegroup "ng01" has 0 node(s)[ℹ] waiting for at least 2 node(s) to become ready in "ng01"[ℹ] nodegroup "ng01" has 2 node(s)[ℹ] node "ip-172-31-25-102.ap-northeast-2.compute.internal" is ready[ℹ] node "ip-172-31-9-210.ap-northeast-2.compute.internal" is ready[ℹ] kubectl command should work with "/root/.kube/config", try 'kubectl get nodes'[✔] EKS cluster "cluster01" in "ap-northeast-2" region is readyAdd IAM Permissions to the roles created above
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "route53:ChangeResourceRecordSets" ], "Resource": [ "arn:aws:route53:::hostedzone/*" ] }, { "Effect": "Allow", "Action": [ "route53:ListHostedZones", "route53:ListResourceRecordSets" ], "Resource": [ "*" ] } ]}Set up a hosted zone
## If you prefer to try-out ExternalDNS in one of the existing hosted-zones you can skip this step # aws route53 create-hosted-zone --name "gexj.club." --caller-reference "gexj-clube-$(date +%s)" |
{ "Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z3P062U2BQWNDS", "HostedZone": { "Id": "/hostedzone/Z3P062U2BQWNDS", "Name": "gexj.club.", "CallerReference": "gexj-clube-1568880027", "Config": { "PrivateZone": false }, "ResourceRecordSetCount": 2 }, "ChangeInfo": { "Id": "/change/C1GWAKWYESG64Y", "Status": "PENDING", "SubmittedAt": "2019-09-19T08:00:28.557Z" }, "DelegationSet": { "NameServers": [ "ns-771.awsdns-32.net", "ns-378.awsdns-47.com", "ns-1192.awsdns-21.org", "ns-1786.awsdns-31.co.uk" ] }}Deploy ExternalDNS
$ kubectl apply -f external-dns-with-rbac.yaml
# kubectl logs external-dns-5454846d9b-sdjzd -ftime="2019-09-19T08:06:43Z" level=info msg="config: {Master: KubeConfig: RequestTimeout:30s IstioIngressGatewayServices:[istio-system/istio-ingressgateway] ContourLoadBalancerService:heptio-contour/contour Sources:[service ingress] Namespace: AnnotationFilter: FQDNTemplate: CombineFQDNAndAnnotation:false IgnoreHostnameAnnotation:false Compatibility: PublishInternal:false PublishHostIP:false ConnectorSourceServer:localhost:8080 Provider:aws GoogleProject: DomainFilter:[gexj.club] ExcludeDomains:[] ZoneIDFilter:[] AlibabaCloudConfigFile:/etc/kubernetes/alibaba-cloud.json AlibabaCloudZoneType: AWSZoneType:public AWSZoneTagFilter:[] AWSAssumeRole: AWSBatchChangeSize:1000 AWSBatchChangeInterval:1s AWSEvaluateTargetHealth:true AWSAPIRetries:3 AWSPreferCNAME:false AzureConfigFile:/etc/kubernetes/azure.json AzureResourceGroup: CloudflareProxied:false CloudflareZonesPerPage:50 CoreDNSPrefix:/skydns/ RcodezeroTXTEncrypt:false InfobloxGridHost: InfobloxWapiPort:443 InfobloxWapiUsername:admin InfobloxWapiPassword: InfobloxWapiVersion:2.3.1 InfobloxSSLVerify:true InfobloxView: InfobloxMaxResults:0 DynCustomerName: DynUsername: DynPassword: DynMinTTLSeconds:0 OCIConfigFile:/etc/kubernetes/oci.yaml InMemoryZones:[] PDNSServer:http://localhost:8081 PDNSAPIKey: PDNSTLSEnabled:false TLSCA: TLSClientCert: TLSClientCertKey: Policy:upsert-only Registry:txt TXTOwnerID:/hostedzone/Z3P062U2BQWNDS TXTPrefix: Interval:1m0s Once:false DryRun:false LogFormat:text MetricsAddress::7979 LogLevel:info TXTCacheInterval:0s ExoscaleEndpoint:https://api.exoscale.ch/dns ExoscaleAPIKey: ExoscaleAPISecret: CRDSourceAPIVersion:externaldns.k8s.io/v1alpha1 CRDSourceKind:DNSEndpoint ServiceTypeFilter:[] CFAPIEndpoint: CFUsername: CFPassword: RFC2136Host: RFC2136Port:0 RFC2136Zone: RFC2136Insecure:false RFC2136TSIGKeyName: RFC2136TSIGSecret: RFC2136TSIGSecretAlg: RFC2136TAXFR:false NS1Endpoint: NS1IgnoreSSL:false TransIPAccountName: TransIPPrivateKeyFile:}"time="2019-09-19T08:06:43Z" level=info msg="Created Kubernetes client https://10.100.0.1:443"time="2019-09-19T08:06:47Z" level=info msg="All records are already up to dateapiVersion: v1kind: ServiceAccountmetadata: name: external-dns---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRolemetadata: name: external-dnsrules:- apiGroups: [""] resources: ["services"] verbs: ["get","watch","list"]- apiGroups: [""] resources: ["pods"] verbs: ["get","watch","list"]- apiGroups: ["extensions"] resources: ["ingresses"] verbs: ["get","watch","list"]- apiGroups: [""] resources: ["nodes"] verbs: ["list","watch"]---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata: name: external-dns-viewerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dnssubjects:- kind: ServiceAccount name: external-dns namespace: default---apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: external-dnsspec: strategy: type: Recreate template: metadata: labels: app: external-dns spec: serviceAccountName: external-dns containers: - name: external-dns image: registry.opensource.zalan.do/teapot/external-dns:latest args: - --source=service - --source=ingress - --domain-filter=gexj.club # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones - --provider=aws - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both) - --registry=txt - --txt-owner-id=/hostedzone/Z3P062U2BQWNDS securityContext: fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes and AWS token files
Verify ExternalDNS works (Service example)
//After roughly two minutes check that a corresponding DNS record for your service was created. # aws route53 list-resource-record-sets --output json --hosted-zone-id "/hostedzone/Z3P062U2BQWNDS" --query "ResourceRecordSets[?Name == 'nginx.gexj.club.']|[?Type == 'A']" |
[ { "Name": "nginx.gexj.club.", "Type": "A", "AliasTarget": { "HostedZoneId": "ZWKZPGTI48KDX", "DNSName": "ada69bd16dab411e9b32f061aa86c2a6-1959369398.ap-northeast-2.elb.amazonaws.com.", "EvaluateTargetHealth": true } }]apiVersion: v1kind: Servicemetadata: name: nginx annotations: external-dns.alpha.kubernetes.io/hostname: nginx.gexj.clubspec: type: LoadBalancer ports: - port: 80 name: http targetPort: 80 selector: app: nginx --- apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginxspec: template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx ports: - containerPort: 80 name: http
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中关村互联网科技集团
喔噻互联网科技
融贸通互联网科技
哈尔滨新华互联网科技学院
受益于互联网科技的高速发展
互联网和黑科技的看法
乌苏新华互联网科技做什么的
科技类公司包括互联网吗
东莞新华互联网科技学校
华夏恒生科技与互联网科技
美国互联网科技实力
山东星卡互联网科技有限公司官网
杭州披云加互联网科技有限公司
萌小萌互联网科技河南有限公司
互联网时代科技型公司的机会
玉溪新华互联网科技怎么选
广西泛欧互联网科技有限公司
恒生科技指数 中概互联网
互联网高科技绘画
利用互联网等科技手段
互联网高科技
深圳互联网络科技有限公司
期待互联网科技
亿人帮互联网科技
互联网科技研发水平
玉溪新华互联网科技好不好
科技互联网的核心竞争力
互联网公司高科技产品
安徽九吞吴互联网科技有限公司
恒生科技互联网指数十大成分股