使用ExternalDNS与NS1 DNS实现Kubernetes服务自动发现

使用ExternalDNS与NS1 DNS实现Kubernetes服务自动发现

external-dns Configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services external-dns 项目地址: https://gitcode.com/gh_mirrors/ex/external-dns

前言

在现代云原生架构中,服务发现是至关重要的组件。ExternalDNS作为Kubernetes生态中的重要工具,能够自动将服务暴露到外部DNS系统中。本文将详细介绍如何将ExternalDNS与NS1 DNS服务集成,实现Kubernetes服务的自动化DNS记录管理。

环境准备

在开始之前,请确保您已具备以下条件:

  • 运行中的Kubernetes集群(版本1.16+)
  • 已安装kubectl命令行工具
  • 拥有NS1账户及相应权限
  • ExternalDNS版本≥0.5(推荐使用最新稳定版)

NS1 DNS区域配置

创建DNS区域

在NS1平台上创建DNS区域是集成的第一步。您可以通过以下两种方式创建:

  1. 通过NS1门户创建

    • 登录NS1控制面板
    • 导航至DNS区域管理页面
    • 添加新的主区域(如example.com)
  2. 通过API创建

    curl -X PUT -H "X-NSONE-Key: $YOUR_API_KEY" \
    -d '{"zone":"example.com"}' \
    https://api.nsone.net/v1/zones/example.com
    

建议为测试环境使用单独的二级域名(如test.example.com),避免影响生产环境。

API密钥管理

NS1采用API优先的设计理念,所有操作均可通过API完成。为ExternalDNS创建专用API密钥是安全最佳实践。

创建API密钥步骤

  1. 登录NS1门户
  2. 点击右上角用户名,进入"账户设置" → "用户与团队"
  3. 切换到"API密钥"标签页
  4. 点击"添加密钥"按钮
  5. 输入应用名称并配置适当权限
  6. 点击"创建密钥"

安全建议

  • 为ExternalDNS创建专用密钥,而非使用账户主密钥
  • 遵循最小权限原则,仅授予必要的DNS区域管理权限
  • 定期轮换密钥

Kubernetes密钥存储

将NS1 API密钥安全地存储在Kubernetes中:

kubectl create secret generic ns1-apikey \
--from-literal=NS1_API_KEY=your_api_key_here \
-n kube-system

ExternalDNS部署

Helm部署方式(推荐)

创建values.yaml配置文件:

provider: ns1
env:
- name: NS1_APIKEY
  valueFrom:
    secretKeyRef:
      name: ns1-apikey
      key: NS1_API_KEY
policy: sync # 同步策略
domainFilters:
- example.com # 限制管理的域名范围

执行Helm安装:

helm install external-dns \
--namespace kube-system \
--values values.yaml \
external-dns/external-dns

原生YAML部署

根据集群是否启用RBAC,选择相应部署方式:

非RBAC集群
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns
  namespace: kube-system
spec:
  template:
    spec:
      containers:
      - name: external-dns
        image: registry.k8s.io/external-dns/external-dns:v0.17.0
        args:
        - --source=service
        - --source=ingress
        - --domain-filter=example.com
        - --provider=ns1
        - --policy=sync
        env:
        - name: NS1_APIKEY
          valueFrom:
            secretKeyRef:
              name: ns1-apikey
              key: NS1_API_KEY
RBAC集群

需要额外创建ServiceAccount和ClusterRole:

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"]

服务部署示例

下面以Nginx服务为例,演示ExternalDNS的自动记录管理:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  annotations:
    external-dns.alpha.kubernetes.io/hostname: web.example.com
    external-dns.alpha.kubernetes.io/ttl: "300"
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

关键注解说明

  • hostname: 指定要注册的完整域名
  • ttl: 可选,设置DNS记录TTL(秒)
  • target: 可选,显式指定目标地址

部署后,ExternalDNS将自动:

  1. 检测新服务
  2. 获取外部IP
  3. 在NS1中创建/更新A记录

验证与调试

验证DNS记录是否创建成功:

dig +short web.example.com

查看ExternalDNS日志:

kubectl logs -l app=external-dns -n kube-system

常见问题排查:

  1. 确保API密钥有足够权限
  2. 检查域名过滤器配置
  3. 验证服务是否获得外部IP
  4. 检查网络策略是否允许出站连接

生产环境建议

  1. 多集群管理:为每个集群使用不同的DNS子域
  2. 记录所有权:使用--txt-owner-id参数标记记录所有权
  3. 监控告警:监控ExternalDNS的运行状态和错误日志
  4. 变更策略:生产环境建议使用--policy=sync而非默认的upsert-only

清理资源

完成测试后,执行以下命令清理:

kubectl delete service nginx
kubectl delete deployment nginx
helm uninstall external-dns -n kube-system

结语

通过本文的指导,您已成功将ExternalDNS与NS1 DNS集成,实现了Kubernetes服务的自动化DNS管理。这种集成不仅提高了运维效率,还确保了服务发现的准确性和及时性。在实际生产环境中,建议结合自身需求调整配置参数,并建立完善的监控机制。

external-dns Configure external DNS servers (AWS Route53, Google CloudDNS and others) for Kubernetes Ingresses and Services external-dns 项目地址: https://gitcode.com/gh_mirrors/ex/external-dns

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戚游焰Mildred

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值