使用ExternalDNS与NS1 DNS实现Kubernetes服务自动发现
前言
在现代云原生架构中,服务发现是至关重要的组件。ExternalDNS作为Kubernetes生态中的重要工具,能够自动将服务暴露到外部DNS系统中。本文将详细介绍如何将ExternalDNS与NS1 DNS服务集成,实现Kubernetes服务的自动化DNS记录管理。
环境准备
在开始之前,请确保您已具备以下条件:
- 运行中的Kubernetes集群(版本1.16+)
- 已安装kubectl命令行工具
- 拥有NS1账户及相应权限
- ExternalDNS版本≥0.5(推荐使用最新稳定版)
NS1 DNS区域配置
创建DNS区域
在NS1平台上创建DNS区域是集成的第一步。您可以通过以下两种方式创建:
-
通过NS1门户创建:
- 登录NS1控制面板
- 导航至DNS区域管理页面
- 添加新的主区域(如example.com)
-
通过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密钥步骤
- 登录NS1门户
- 点击右上角用户名,进入"账户设置" → "用户与团队"
- 切换到"API密钥"标签页
- 点击"添加密钥"按钮
- 输入应用名称并配置适当权限
- 点击"创建密钥"
安全建议:
- 为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将自动:
- 检测新服务
- 获取外部IP
- 在NS1中创建/更新A记录
验证与调试
验证DNS记录是否创建成功:
dig +short web.example.com
查看ExternalDNS日志:
kubectl logs -l app=external-dns -n kube-system
常见问题排查:
- 确保API密钥有足够权限
- 检查域名过滤器配置
- 验证服务是否获得外部IP
- 检查网络策略是否允许出站连接
生产环境建议
- 多集群管理:为每个集群使用不同的DNS子域
- 记录所有权:使用
--txt-owner-id
参数标记记录所有权 - 监控告警:监控ExternalDNS的运行状态和错误日志
- 变更策略:生产环境建议使用
--policy=sync
而非默认的upsert-only
清理资源
完成测试后,执行以下命令清理:
kubectl delete service nginx
kubectl delete deployment nginx
helm uninstall external-dns -n kube-system
结语
通过本文的指导,您已成功将ExternalDNS与NS1 DNS集成,实现了Kubernetes服务的自动化DNS管理。这种集成不仅提高了运维效率,还确保了服务发现的准确性和及时性。在实际生产环境中,建议结合自身需求调整配置参数,并建立完善的监控机制。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考