首页 公告 项目 RSS

使用external-dns自动在dnspod上添加dns记录

August 10, 2023 本文有 1134 个字 需要花费 3 分钟阅读

简介

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-only
  • tencent-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 自定义解析的 ttl
  • external-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