简介
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