实验环境
系统:Centos 7.3
docker version: 1.13.1
flannel version:
firwalld: dead
三台测试的集群ip-5: 192.168.159.5、ip-6: 192.168.159.6、ip-7: 192.168.159.7
安装etcd集群
1.关闭防火墙和selinux
systemctl disable firewalld
systemctl stop firewalld
修改/etc/selinux/config中selinux参数是disable.
2. 配置三台服务器免密登录
配置三台服务器免密登录还需要配置运行脚本的服务器免密登录自己
3.配置三台服务器时间同步
yum install -y ntp ntpdate && ntpdate pool.ntp.org
4.执行脚本
需要修改脚本中的IP地址为自己集群的IP地址,以及修改安装的etcd版本号或者是采用默认即可。
# vim deploy-etcd.sh
#!/bin/bash
set -x
set -e
#更改这里的IP, 只支持部署3个节点etcd集群
declare -A NODE_MAP=( ["etcd0"]="192.168.159.5" ["etcd1"]="192.168.159.6" ["etcd2"]="192.168.159.7" )
etcd::download()
{
ETCD_VER=v3.0.15 #指定要安装的版本号
DOWNLOAD_URL=https://github.com/coreos/etcd/releases/download
[ -f ${PWD}/temp-etcd/etcd ] && return
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o ${PWD}/etcd-${ETCD_VER}-linux-amd64.tar.gz
mkdir -p ${PWD}/temp-etcd && tar xzvf ${PWD}/etcd-${ETCD_VER}-linux-amd64.tar.gz -C ${PWD}/temp-etcd --strip-components=1
}
etcd::config()
{
local node_index=$1
cat <<EOF >${PWD}/${node_index}.conf
ETCD_NAME=${node_index}
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://${NODE_MAP[${node_index}]}:2380"
ETCD_LISTEN_PEER_URLS="http://${NODE_MAP[${node_index}]}:2380"
ETCD_LISTEN_CLIENT_URLS="http://${NODE_MAP[${node_index}]}:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://${NODE_MAP[${node_index}]}:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-378"
ETCD_INITIAL_CLUSTER="etcd0=http://${NODE_MAP['etcd0']}:2380,etcd1=http://${NODE_MAP['etcd1']}:2380,etcd2=http://${NODE_MAP['etcd2']}:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
# ETCD_DISCOVERY=""
# ETCD_DISCOVERY_SRV=""
# ETCD_DISCOVERY_FALLBACK="proxy"
# ETCD_DISCOVERY_PROXY=""
#
# ETCD_CA_FILE=""
# ETCD_CERT_FILE=""
# ETCD_KEY_FILE=""
# ETCD_PEER_CA_FILE=""
# ETCD_PEER_CERT_FILE=""
# ETCD_PEER_KEY_FILE=""
EOF
}
etcd::gen_unit()
{
cat <<EOF >${PWD}/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/etc/etcd/10-etcd.conf
ExecStart=/usr/bin/etcd
Restart=always
RestartSec=8s
LimitNOFILE=40000
[Install]
WantedBy=multi-user.target
EOF
}
SSH_OPTS="-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oLogLevel=ERROR -C"
etcd::scp()
{
local host="$1"
local src=($2)
local dst="$3"
scp -r ${SSH_OPTS} ${src[*]} "${host}:${dst}"
}
etcd::ssh()
{
local host="$1"
shift
ssh ${SSH_OPTS} -t "${host}" "$@" >/dev/null 2>&1
}
etcd::ssh_nowait()
{
local host="$1"
shift
ssh ${SSH_OPTS} -t "${host}" "nohup $@" >/dev/null 2>&1 &
}
etcd::deploy()
{
for key in ${!NODE_MAP[@]}
do
etcd::config $key
etcd::ssh "root@${NODE_MAP[$key]}" "mkdir -p /var/lib/etcd /etc/etcd"
etcd::scp "root@${NODE_MAP[$key]}" "${key}.conf" "/etc/etcd/10-etcd.conf"
etcd::scp "root@${NODE_MAP[$key]}" "etcd.service" "/usr/lib/systemd/system"
etcd::scp "root@${NODE_MAP[$key]}" "${PWD}/temp-etcd/etcd ${PWD}/temp-etcd/etcdctl" "/usr/bin"
etcd::ssh "root@${NODE_MAP[$key]}" "chmod 755 /usr/bin/etcd*"
etcd::ssh_nowait "root@${NODE_MAP[$key]}" "systemctl daemon-reload && systemctl enable etcd && nohup systemctl start etcd"
done
}
etcd::clean()
{
for key in ${!NODE_MAP[@]}
do
rm -f ${PWD}/${key}.conf
done
rm -f ${PWD}/etcd.service
}
etcd::download
etcd::gen_unit
etcd::deploy
etcd::clean
echo -e "\033[32m 部署完毕! 执行 etcdctl cluster-health,检测是否OK。\033[0m"
5.查看集群的健康状态
安装flannel集群
下载flannel二进制安装包(集群中每个节点都安装)
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
tar -xf flannel-v0.10.0-linux-amd64.tar.gz
cp flanneld /usr/bin/
定义flannel网络ip池(只在一个节点执行)
创建文件 flannel-config.json
{
"Network": "10.3.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan"
}
}
从上面的配置文件可以看出:
flannel Net
定义该网络的 IP 池为10.3.0.0/16
。SubnetLen
指定每个主机分配到的 subnet 大小为 24 位,即10.3.X.0/24
。Backend
为vxlan
,即主机间通过 vxlan 通信。
然后执行以下命令:
etcdctl set /docker-flannel/network/config < flannel-config.json
新建启动文件: /usr/lib/systemd/system/flanneld.service(每个节点都配置)
根据自己的ectd集群节点修改相应的IP的值
[Unit]
Description=flannel
After=etcd.service network.target
[Service]
ExecStart=/usr/bin/flanneld --etcd-endpoints=http://192.168.159.5:2379,http://192.168.159.6:2379,http://192.168.159.7:2379 -etcd-prefix=/docker-flannel/network --iface=eth0
[Install]
WantedBy=multi-user.target
--etcd-endpoints
指定 etcd url。--iface
指定主机间数据传输使用的 interface。--etcd-prefix
指定 etcd 存放 flannel 网络配置信息的 key。只能指到目录级别,比如上面的key为:/docker-flannel/network/config ,只能指到/docker-flannel/network
启动flanneld(集群中每个节点都执行)
systemctl enable flanneld
systemctl start flanneld
查看flannel状态
systemctl status flanneld
查看各个节点分到的子网的地址段
ip-5节点的网段是:10.3.59.0/32
ip-6节点的网段是:10.3.9.0/32
ip-7节点的网段是:10.3.76.0/32
Docker中使用flannel网络
修改文件 /usr/lib/systemd/system/docker.service,增加参数:
根据配置文件 /run/flannel/subnet.env来配置
重启docker
systemctl daemon-reload
systemctl restart docker
每个节点启动一个容器,并测试它和集群中其他节点容器的连通性。
flannel在一个大的网络中为每个节点分配了子网, flannel.1 将这些 subnet 连接起来了,相互之间可以路由。flannel 没有提供隔离。
分析网络的流量: