部署基于etcd的coredns集群
前言
现需要为公司搭建私有DNS,私有服务器都使用私有DNS的地址,便于访问内部自定义的域名。采用CoreDNS + ETCD方案部署,coredns和etcd都以三实例运行,etcd为集群模式,使用nginx做coredns的udp负载均衡,避免单机性能问题。另使用prometheus监控coredns和etcd。
本文中的etcd、coredns、prometheus都以二进制方式运行,也可以用docker容器。
环境信息
| IP | 系统版本 | 应用 | 备注 |
|---|---|---|---|
| 192.168.0.10 | CentOS 7.9 x86_64 | Nginx 1.21 | udp负载均衡 |
| 192.168.0.11 | CentOS 7.9 x86_64 | coredns v1.10.0, etcd v3.5.4 | |
| 192.168.0.12 | CentOS 7.9 x86_64 | coredns v1.10.0, etcd v3.5.4 | |
| 192.168.0.13 | CentOS 7.9 x86_64 | coredns v1.10.0, etcd v3.5.4 | |
| 192.168.0.14 | CentOS 7.9 x86_64 | prometheus |
大致架构如下图
client --> nginx["nginx-192.168.0.10:53"]
subgraph coredns+etcd集群
nginx["nginx-192.168.0.10:53"] --> dns11["coredns-192.168.0.11:53"]
nginx --> dns12["coredns-192.168.0.12:53"]
nginx --> dns13["coredns-192.168.0.13:53"]
dns11 --> etcd11["etcd-192.168.0.11:2379"]
dns11 --> etcd12["etcd-192.168.0.12:2379"]
dns11 --> etcd13["etcd-192.168.0.13:2379"]
dns12 --> etcd11
dns12 --> etcd12
dns12 --> etcd13
dns13 --> etcd11
dns13 --> etcd12
dns13 --> etcd13
end
步骤
1. 部署etcd
- 官方下载etcd的二进制压缩包,将解压后目录内的二进制文件放到
/usr/local/bin - 找个空目录,执行启动脚本。注意修改每个etcd服务器的IP。脚本里面用python自动获取本机ip,然后根据ip启动对应的etcd。(PS:其实脚本里面的启动函数写重复了,只需要写一个然后传参就行了。)
#!/bin/bash
set -u
script_dir=$(cd $(dirname $0) && pwd)
# 注意修改IP
etcd1IP='192.168.0.11'
etcd2IP='192.168.0.12'
etcd3IP='192.168.0.13'
etcdClusterToken='etcd-cluster-1'
function getLocalIP(){
# 通过python获取本机IP, 如果新的linux发行版默认没有python2, 注意更改为python3
cat > /tmp/getLocalIP.py <<EOF
#!/usr/bin/env python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 53))
print(s.getsockname()[0])
EOF
IP=$(python /tmp/getLocalIP.py)
}
function start() {
nohup etcd --name $1 \
--listen-client-urls http://$2:2379 \
--advertise-client-urls http://$2:2379 \
--listen-peer-urls http://$2:2380 \
--initial-advertise-peer-urls http://$2:2380 \
--initial-cluster-token ${etcdClusterToken} \
--initial-cluster="etcd1=http://${etcd1IP}:2380,etcd2=http://${etcd2IP}:2380,etcd3=http://${etcd3IP}:2380" \
--initial-cluster-state 'new' \
--enable-pprof \
--logger 'zap' \
--log-outputs=stderr \
--data-dir="${script_dir}/data" > ${script_dir}/logs/app.log 2>&1 &
}
function main() {
mkdir -p ./{data,logs}
getLocalIP
case $IP in
$etcd1IP)
start etcd1 ${IP}
;;
$etcd2IP)
start etcd2 ${IP}
;;
$etcd3IP)
start etcd3 ${IP}
;;
*)
echo "Unknown Node ip"
esac
}
main
- 测试集群是否正常
# 如果正常则全部显示successfully
etcdctl --endpoints http://192.168.0.11:2379,http://192.168.0.12:2379,http://192.168.0.13:2379 endpoint health
2. 部署coredns
- 从官方github仓库下载二进制包,个人一般会把coredns的二进制文件放到
coredns/bin目录下 - 编写配置文件
coredns.conf/Corefile。注意修改本机IP和etcd实例的host
.:53 {
# 绑定本机IP
bind 192.168.0.11
etcd {
path /coredns
endpoint http://192.168.0.11:2379 http://192.168.0.12:2379 http://192.168.0.13:2379
fallthrough
}
# 最后所有的都转发到系统配置的上游dns服务器去解析
forward . /home/apps/coredns/conf/forwards
# 缓存时间ttl
cache 1800
# 自动加载配置文件的间隔时间
reload 6s
# 输出日志
#log
# 输出错误
errors
# 监控
prometheus 192.168.0.11:19097
}
其中forwards内容如下:
nameserver 223.6.6.6
nameserver 223.5.5.5
- 通过脚本启动coredns
#!/bin/bash
# description: 启动CoreDNS
set -u
scriptDir=$(cd $(dirname $0) && pwd)
baseDir=$(cd ${scriptDir}/.. && pwd)
pidFile=${baseDir}/logs/app.pid
function prepare(){
# 检查当前用户是否为root
if [[ $(whoami) != "root" ]]; then
echo "please use root privilege"
exit 1
fi
# 检查是否存在配置文件, 无则报错退出
if [[ ! -f ${baseDir}/conf/Corefile ]]; then
echo "${baseDir}/conf/Corefile not found"
exit 1
fi
# 检测是否存在日志目录, 无则创建
if [[ ! -d ${baseDir}/logs ]]; then
mkdir -p ${baseDir}/logs
fi
# 检查进程是否已存在, 存在则退出
ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
if [[ $? -eq 0 ]]; then
echo "coredns is running"
exit 1
fi
}
function startApp(){
nohup ${scriptDir}/coredns --conf ${baseDir}/conf/Corefile \
-pidfile ${pidFile} > ${baseDir}/logs/start.log 2>&1 &
}
function check(){
# 检查是否正常启动
for i in $(seq 2); do
echo "checking coredns whether is running or not ..."
sleep 1
done
ps -ef | grep -v grep | grep ${scriptDir}/coredns > /dev/null
if [[ $? -eq 0 ]]; then
echo "coredns is running"
fi
}
function main(){
prepare
startApp
check
}
main
3. nginx配置udp负载均衡
PS:强调一点,nginx早就支持tcp和udp的四层网络代理转发了,别再听信一些老掉牙的教程说nginx只支持http的七层网络代理转发。
nginx在stream域的配置udp的网络转发,以下为示例
stream {
upstream coredns {
server 192.168.0.11:53;
server 192.168.0.12:53;
server 192.168.0.13:53;
}
server {
listen 53 udp;
proxy_pass coredns;
}
}
4. 测试dns是否可用
- 通过etcdctl添加一条dns解析记录。这里将
zhangsan.com解析到192.168.0.10
etcdctl --endpoints http://192.168.0.11:2379,http://192.168.0.12:2379,http://192.168.0.13:2379 put /coredns/com/zhangsan/x1 '{"host":"192.168.0.10", "ttl": 60}'
- 使用nslookup工具测试。如果提示没有命令,centos 可安装
bind-utils,ubuntu可安装dns-utils。
nslookup zhangsan.com 192.168.0.10
- 如果上条命令正常返回解析结果,说明coredns集群搭建完成,后面新增服务器只需要将dns配置为nginx的地址即可。
5. 配置prometheus监控
prometheus的安装和使用略过,以下仅为etcd和coredns的监控配置示例,使用的是基于文件的服务发现。
- job_name: "etcd"
file_sd_configs:
- files: ['/home/apps/prometheus/sd_configs/etcd/*.yaml']
refresh_interval: 10s
- job_name: "coredns"
file_sd_configs:
- files: ['/home/apps/prometheus/sd_configs/coredns/*.yaml']
refresh_interval: 10s
sd_configs/etcd/nodes.yaml内容如下:
- targets: ['192.168.0.11:2379']
labels:
instance: 192.168.0.11
- targets: ['192.168.0.12:2379']
labels:
instance: 192.168.0.12
- targets: ['192.168.0.13:2379']
labels:
instance: 192.168.0.13
sd_configs/coredns/nodes.yaml内容如下:
- targets: ['192.168.0.11:19097']
labels:
instance: 192.168.0.11
- targets: ['192.168.0.12:19097']
labels:
instance: 192.168.0.12
- targets: ['192.168.0.13:19097']
labels:
instance: 192.168.0.13
之后去grafana官网找个合适的dashboard进行import即可。
部署基于etcd的coredns集群的更多相关文章
- Centos 7.9 基于二进制文件部署kubernetes v1.25.5集群
简述 Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器 ...
- 基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用
基于Hadoop2.7.3集群数据仓库Hive1.2.2的部署及使用 HBase是一种分布式.面向列的NoSQL数据库,基于HDFS存储,以表的形式存储数据,表由行和列组成,列划分到列族中.HBase ...
- 企业运维实践-还不会部署高可用的kubernetes集群?使用kubeadm方式安装高可用k8s集群v1.23.7
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- 基于zookeeper的Swarm集群搭建
简介 Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理. 对客户端而言,Swarm集群就像是另一台普通的docker主机. Swarm集群中的每台 ...
- 使用 Kubeadm 安装部署 Kubernetes 1.12.1 集群
手工搭建 Kubernetes 集群是一件很繁琐的事情,为了简化这些操作,就产生了很多安装配置工具,如 Kubeadm ,Kubespray,RKE 等组件,我最终选择了官方的 Kubeadm 主要是 ...
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
- Tomcat:基于Apache+Tomcat的集群搭建
根据Tomcat的官方文档说明可以知道,使用Tomcat配置集群需要与其它Web Server配合使用才可以完成,典型的有Apache和IIS. 这里就使用Apache+Tomcat方式来完成基于To ...
- 基于Kubernetes的WAF集群介绍
Kubernetes是Google开源的容器集群管理系统.它构建Docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,可看作是基于容器技术的PaaS平台. 本文旨 ...
- 基于prometheus监控k8s集群
本文建立在你已经会安装prometheus服务的基础之上,如果你还不会安装,请参考:prometheus多维度监控容器 如果你还没有安装库k8s集群,情参考: 从零开始搭建基于calico的kuben ...
- [原创]自动化部署K8S(v1.10.11)集群
标准运维实现自动化部署K8S集群主要分两步,第一步是部署gse-agent,拱第二步执行部署. 第一步:部署gse-agent.如下: 第二步:部署k8s集群.主要通过作业平台分为5小步执 ...
随机推荐
- 2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A.B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调 ...
- 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums
2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...
- 2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,
2021-08-19:超级洗衣机.假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的.在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机, ...
- ComboBox1 绑定手动创建的DataTable
'************************************************** '*过程名称:DT_PAFORMAL '*功能说明:员工类别 '**************** ...
- 记录内网Docker启动Stable-Diffusion遇到的几个坑
摘要:最近看到K8s启动stable-diffusion的文章,想着在自己开发环境复现一下.没想到在内网环境还遇到这么多问题,记录一下. 本文分享自华为云社区<内网Docker启动Stable- ...
- dnu
背景 作为一个喜欢搬运 YouTube 视频的网友,我发现将视频下载下来再上传到 B 站十分繁琐,因此我决定开发一个小工具,能够方便快捷地将 YouTube 视频下载并上传至 B 站,以节省我的时间和 ...
- 【重学C++】01| C++ 如何进行内存资源管理?
文章首发 [重学C++]01| C++ 如何进行内存资源管理? 前言 大家好,我是只讲技术干货的会玩code,今天是[重学C++]的第一讲,我们来学习下C++的内存管理. 与java.golang等自 ...
- 基于飞桨paddlespeech训练中文唤醒词模型
飞桨Paddlespeech中的语音唤醒是基于hey_snips数据集做的.Hey_snips数据集是英文唤醒词,对于中国人来说,最好是中文唤醒词.经过一番尝试,我发现它也能训练中文唤醒词,于是我决定 ...
- WPF中有中心点的slider滑动条
想要实现的效果 原生滑动条 需要认识一下滑动条的组成 在原生控件中生成"资源字典"对应的样式 然后在track所在的列进行添砖加瓦 由于track在row="1" ...
- NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记
NVIDIA Maxine Video Effects SDK 編程指南 - 实践小记 本篇博客重点只说Video Effect的部分,此外还有Audio Effect的部分.还有AR部分,不在本篇范 ...