使用external-dns自动在dnspod上添加dns记录
source link: https://www.bboy.app/2023/08/10/%E4%BD%BF%E7%94%A8external-dns%E8%87%AA%E5%8A%A8%E5%9C%A8dnspod%E4%B8%8A%E6%B7%BB%E5%8A%A0dns%E8%AE%B0%E5%BD%95/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
使用external-dns自动在dnspod上添加dns记录
externalDNS是一个可以把k8s集群内部的service ingress配置信息与你的dns提供商dns记录同步的组件,在部署服务的过程中,你很有可能碰到下面的情况
- 创建了很多的 ingress,但是这些 ingress 的解析需要你手动在你 dns 提供商,比如 dnspod 中同步
- 创建了很多的 svc,有时候这些 svc 的 ip 是动态的,你需要有一个东西去做同步
- 修改了 ingress controller 的 ip,你需要修改大量的dns 解析
上面的所有步骤都是重复和麻烦的,但是externalDNS会很好的解决这些问题,externalDNS会从Kubernetes API检索资源列表,然后和你的 dns 提供商去做同步,简单来说是k8s的 ddns?
https://github.com/kubernetes-sigs/external-dns
腾讯云的文档
https://cloud.tencent.com/document/product/457/72679
部署external-dns
这边我只针对于 dnspod
首先要定义几个固定的资源
ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
namespace: external-dns
ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: external-dns
rules:
- apiGroups: ['']
resources: ['endpoints', 'pods', 'services']
verbs: ['get', 'watch', 'list']
- apiGroups: ['extensions']
resources: ['ingresses']
verbs: ['get', 'watch', 'list']
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["watch", "list"]
ClusterRoleBinding
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: external-dns
添加configmap,这里面保存的是腾讯云的 ak sk还有腾讯云k8s的一些信息,因为我的k8s是本地的,所以有的配置不用添加
apiVersion: v1
kind: ConfigMap
metadata:
name: external-dns
namespace: external-dns
data:
tencent-cloud.json: |
{
"secretId": "xxxxx",
"secretKey": "xxxxxx",
"internetEndpoint": true
}
internetEndpoint定义的是腾讯云API入口,如果配置为 true,代表的是走公网的 api,如果是 false 的话那就是内网的 api,因为我的集群是家里的,所以要配置为 true 走公网
如果你是 tke 的话还有下面几个参数
- regionId 集群所在的地域
- vpcId 集群所在的 vpc 的 id
最后就是定义 deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
namespace: external-dns
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: external-dns
template:
metadata:
labels:
app: external-dns
spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: registry.k8s.io/external-dns/external-dns:v0.13.5
args:
- --source=service
- --source=ingress
- --domain-filter= xxxxx.com
- --provider=tencentcloud
- --policy=sync
- --tencent-cloud-zone-type=public
- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.json
volumeMounts:
- mountPath: /etc/kubernetes
name: config-volume
readOnly: true
volumes:
- configMap:
defaultMode: 420
items:
- key: tencent-cloud.json
path: tencent-cloud.json
name: external-dns
name: config-volume
其他地方没什么可以说的,最主要是下面这些
- --source=service
- --source=ingress
- --domain-filter= xxxxx.com
- --provider=tencentcloud
- --policy=sync
- --tencent-cloud-zone-type=public
- --tencent-cloud-config-file=/etc/kubernetes/tencent-cloud.json
source
从k8s的那些资源去做同步domain-filter
限制同步的域名provider
用什么域名提供商policy
同步策略默认是 sync 还有策略是upsert-only create-onlytencent-cloud-zone-type
这里如果定义的是private那么就是在腾讯云PrivateDNS中创建解析,如果是 public 那么就是在dnspod 中tencent-cloud-config-file
这里就是定义腾讯云配置的路径
测试的话可以直接创建一个 ingress 测试下,默认什么都不加的话会在 dns 提供商上创建ingress controller LoadBalancer的ip
当然你也可以使用下面的annotations来配置你想要的参数
详细的可以看
https://github.com/kubernetes-sigs/external-dns/blob/master/docs/annotations/annotations.md
下面说几个常用的
external-dns.alpha.kubernetes.io/ttl
自定义解析的 ttlexternal-dns.alpha.kubernetes.io/target
自定义解析的值external-dns.alpha.kubernetes.io/internal-hostname
指定内网域名地址,也就是这个域名会解析到ClusterIP的地址external-dns.alpha.kubernetes.io/hostname
指定公网域名地址,也就是这个地址会解析到LoadBalancer的 ip
如果你发现添加了 ingress,但是域名解析没有修改,很有可能是你之前自己已经创建了对应的解析,需要删除原来的解析,之后解析才会自动添加上去
欢迎关注我的博客www.bboy.app
Have Fun
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK