上一篇,提及到要保证kubedns、tomcat、mysql调度到同一个node节点上,这是为什么呢?这个就涉及到了docker网络,如下图:
Docker网络对于host主机来说是一个局域网(内部网络)外界无法直接访问到Docker网络,例如想访问PodA1,是不行。如上图所示,假如PodA1和PodB1进行通信,是没有办法直接通信的。那么如何让PodA1和PodB1通信呢?有很多种方式,比如说添加静态路由、设置vxlan等。今天介绍的Flannel主要作用就是为了实现PodA1,PodA2,PodB1,PodB2,之间能两两进行通信且ip不冲突。用到的主要技术就是VxLan。
一、环境
IP | 角色 | 备注 |
192.63.63.1 | Master | Master、Node都做 |
192.63.63.10 | Node |
|
软件名称 | 版本号 |
etcd | 3.2.9 |
flannel | 0.10.0 |
docker | 17.03.2-ce |
二、环境部署
【etcd】
2.1 etcd修改
这次实验etcd虽然不是集群,但是为了flannel能够与etcd进行通信(因为flannel的数据要存到etcd中),需要修改etcd的默认配置。Etcd启动后监听了两个端口:
端口 | 说明 | 备注 |
2379 | 用于客户端连接。也就是说某个应用要把数据存储到etcd中则通过此端口 | 2.0版本之前此端口是4001,为了兼容以往程序此端口还在使用中。以后版本可能会被丢弃 |
2380 | 用于集群间同步数据。也就是说这个端口用与多个etcd间通信 | 2.0版本之前此端口是4002,为了兼容以往程序此端口还在使用中。以后版本可能会被丢弃 |
Etcd的默认监听ip是localhost也就是127.0.0.1,如果client(flannel)不和etcd在同一个台主机上则无法使用etcd的服务。需要将etcd监听ip地址修改主机的ip地址,即修改master节点ip,192.63.63.1。
将/etc/etcd/etcd.conf中ETCD_LISTEN_CLIENT_URLS修改为“http://192.63.63.1:2379,http://192.63.63.1:4001"。
由于etcd监听ip修改了,也需要修改kube-apiserver的配置文件(/etc/kubernetes/apiserver)。修改etcd-server的地址:KUBE_ETCD_SERVERS="--etcd-servers=http://192.63.63.1:2379"
重启etcd和kube-apiserver
2.2 创建网络配置
etcdctl --endpoint="http://192.63.63.1:2379" set /coreos.com/network/config \
'{ "Network": "172.17.0.0/16", "SubnetMin": "172.17.0.0", "SubnetMax": "172.17.10.0", "Backend": {"Type": "vxlan","VNI":3}}'
参数 | 说明 |
Network | 设置容器ip网段,docker0默认是172.17.0.0/16 |
SubnetMin | 起始网段,可不写 |
SubnetMax | 终止网段,可不写 |
Backend | 数据字段 |
type | 不写默认为udp方式,此处指定为vxlan方式 |
VNI | 指定vlan id 默认是1 |
通过这个配置后,flannel在分配ip的时候就完全依赖这个配置项。
问题1:
在执行上面的命令行可能会出现这个错误:
Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp [::1]:2379: getsockopt: connection refused
; error #1: dial tcp [::1]:4001: getsockopt: connection refused
error #0: dial tcp [::1]:2379: getsockopt: connection refused
error #1: dial tcp [::1]:4001: getsockopt: connection refused
解决方式:
将etcd中ETCD_ADVERTISE_CLIENT_URLS设置成与ETCD_LISTEN_CLIENT_URLS一样取值,如:"http://192.63.63.1:2379,http://192.63.63.1:4001"
【flannel】
2.3 flannel修改
特别说明一下,所有node节点均需要安装flannel。将下载好的flannel进行解压:
文件 | 说明 |
flanneld | 核心文件 |
mk-docker-opts.sh | 用于修改docker配置项 |
1)将文件拷贝到各自目录中
cp flanneld /usr/bin
mkdir -p /usr/libexec/flannel/
cp mk-docker-opts.sh /usr/libexec/flannel/
2)添加到systemd服务中
创建配置/etc/flannel/flanneld.conf
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="-etcd-endpoints=http://192.63.63.1:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="-etcd-prefix=/coreos.com/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
创建服务文件/usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
EnvironmentFile=-/etc/flannel/flanneld.conf
ExecStart=/usr/bin/flanneld $FLANNEL_ETCD_ENDPOINTS $FLANNEL_ETCD_PREFIX $FLANNEL_OPTIONS
ExecStartPost=/usr/libexec/flannel/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
3)修改etcd.service文件
将/usr/lib/systemd/system/docker.service文件中ExecStart=/usr/bin/dockerd修改为下面两行:
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
4)重启各个服务
mkdir -p /run/flannel/
systemctl daemon-reload
systemctl start flanneld
systemctl restart docker
启动k8s各个服务
三、验证flannel功能是正常
创建kubedns以及web应用。
至此,flannel的配置介绍完了。