7

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

 1 year ago
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.
neoserver,ios ssh client

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

August 10, 2023 本文有 1134 个字 需要花费 3 分钟阅读
20230810-2.webp

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK