mirror of
https://github.com/kubernetes-sigs/external-dns.git
synced 2025-08-05 17:16:59 +02:00
217 lines
5.6 KiB
Markdown
217 lines
5.6 KiB
Markdown
# Tencent Cloud
|
|
|
|
## External Dns Version
|
|
|
|
* Make sure to use **>=0.13.1** version of ExternalDNS for this tutorial
|
|
|
|
## Set up PrivateDns or DNSPod
|
|
|
|
Tencent Cloud DNSPod Service is the domain name resolution and management service for public access.
|
|
Tencent Cloud PrivateDNS Service is the domain name resolution and management service for VPC internal access.
|
|
|
|
* If you want to use internal dns service in Tencent Cloud.
|
|
1. Set up the args `--tencent-cloud-zone-type=private`
|
|
2. Create a DNS domain in PrivateDNS console. DNS domain which will contain the managed DNS records.
|
|
|
|
* If you want to use public dns service in Tencent Cloud.
|
|
1. Set up the args `--tencent-cloud-zone-type=public`
|
|
2. Create a Domain in DnsPod console. DNS domain which will contain the managed DNS records.
|
|
|
|
## Set up CAM for API Key
|
|
|
|
In Tencent CAM Console. you may get the secretId and secretKey pair. make sure the key pair has those Policy.
|
|
|
|
```json
|
|
{
|
|
"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": [
|
|
"*"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
# Deploy ExternalDNS
|
|
|
|
## Manifest (for clusters with RBAC enabled)
|
|
|
|
```yaml
|
|
apiVersion: v1
|
|
kind: ServiceAccount
|
|
metadata:
|
|
name: external-dns
|
|
---
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: ClusterRole
|
|
metadata:
|
|
name: external-dns
|
|
rules:
|
|
- 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/v1
|
|
kind: ClusterRoleBinding
|
|
metadata:
|
|
name: external-dns-viewer
|
|
roleRef:
|
|
apiGroup: rbac.authorization.k8s.io
|
|
kind: ClusterRole
|
|
name: external-dns
|
|
subjects:
|
|
- kind: ServiceAccount
|
|
name: external-dns
|
|
namespace: default
|
|
---
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: external-dns
|
|
data:
|
|
tencent-cloud.json: |
|
|
{
|
|
"regionId": "ap-shanghai",
|
|
"secretId": "******",
|
|
"secretKey": "******",
|
|
"vpcId": "vpc-******",
|
|
"internetEndpoint": false # Default: false. Access the Tencent API through the intranet. If you need to deploy on the public network, you need to change to true
|
|
}
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: external-dns
|
|
spec:
|
|
strategy:
|
|
type: Recreate
|
|
selector:
|
|
matchLabels:
|
|
app: external-dns
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: external-dns
|
|
spec:
|
|
containers:
|
|
- args:
|
|
- --source=service
|
|
- --source=ingress
|
|
- --domain-filter=external-dns-test.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
|
|
- --provider=tencentcloud
|
|
- --policy=sync # set `upsert-only` would prevent ExternalDNS from deleting any records
|
|
- --tencent-cloud-zone-type=private # only look at private hosted zones. set `public` to use the public dns service.
|
|
- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.json
|
|
image: registry.k8s.io/external-dns/external-dns:v0.15.0
|
|
imagePullPolicy: Always
|
|
name: external-dns
|
|
resources: {}
|
|
terminationMessagePath: /dev/termination-log
|
|
terminationMessagePolicy: File
|
|
volumeMounts:
|
|
- mountPath: /etc/kubernetes
|
|
name: config-volume
|
|
readOnly: true
|
|
dnsPolicy: ClusterFirst
|
|
hostAliases:
|
|
- hostnames:
|
|
- privatedns.internal.tencentcloudapi.com
|
|
- dnspod.internal.tencentcloudapi.com
|
|
ip: 169.254.0.95
|
|
restartPolicy: Always
|
|
schedulerName: default-scheduler
|
|
securityContext: {}
|
|
serviceAccount: external-dns
|
|
serviceAccountName: external-dns
|
|
terminationGracePeriodSeconds: 30
|
|
volumes:
|
|
- configMap:
|
|
defaultMode: 420
|
|
items:
|
|
- key: tencent-cloud.json
|
|
path: tencent-cloud.json
|
|
name: external-dns
|
|
name: config-volume
|
|
```
|
|
|
|
# Example
|
|
|
|
## Service
|
|
|
|
```yaml
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: nginx
|
|
annotations:
|
|
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: LoadBalancer
|
|
ports:
|
|
- port: 80
|
|
name: http
|
|
targetPort: 80
|
|
selector:
|
|
app: nginx
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: nginx
|
|
spec:
|
|
selector:
|
|
matchLabels:
|
|
app: nginx
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: nginx
|
|
spec:
|
|
containers:
|
|
- image: nginx
|
|
name: nginx
|
|
ports:
|
|
- containerPort: 80
|
|
name: http
|
|
```
|
|
|
|
`nginx.external-dns-test.com` will record to the Loadbalancer VIP.
|
|
`nginx-internal.external-dns-test.com` will record to the ClusterIP.
|
|
all of the DNS Record ttl will be 600.
|
|
|
|
# Attention
|
|
|
|
This makes ExternalDNS safe for running in environments where there are other records managed via other means.
|
|
|