在搭建Kubernetes的环境的时候,你可能会遇到一些问题,不!你会遇到很多问题。比如,首先你要实现跨物理机的容器访问——是不同物理内的容器能够互相访问,而不是你平常所看到的乱七八糟的端口映射。方案有很多,比如OVS、flannel、socketplane什么的,下面是我搭建etcd和flannel的过程,希望对需要这样的环境的人有所帮助,少走弯路。再说一次:跨物理机的容器之间能直接访问
架构
实验的架构非常简单,三台机器,为了简化,我只设置了一台etcd,没有做集群,三台机器安装flannel和Docker。
- 172.16.164.5 //etcd、flannel、docker
- 172.16.164.6 //flannel、docker
- 172.16.164.7 //flannel、docker
安装etcd
- 172.16.164.5
etcd的安装是尤其简单的——如果你有翻墙的话,下载二进制直接运行就是了,在这里我设置成了一个新的集群。-
#也许你需要翻墙,github使用的是amazon的s3存储
-
wget https://github.com/coreos/etcd/releases/download/v2.3.2/etcd-v2.3.2-linux-amd64.tar.gz
-
tar xvf etcd-v2.3.2-linux-amd64.tar.gz
-
cd etcd-v2.3.2-linux-amd64
-
mv etcd* /usr/bin
-
cat /usr/lib/systemd/system/etcd.service
-
[Unit]
-
Description=etcd
-
[Service]
-
Environment=ETCD_NAME=kubernetes
-
Environment=ETCD_DATA_DIR=/var/lib/etcd
-
Environment=ETCD_LISTEN_CLIENT_URLS=http://172.16.164.5:4001,http://localhost:4001
-
Environment=ETCD_LISTEN_PEER_URLS=http://172.16.164.5:7001,http://localhost:7001
-
Environment=ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.16.164.5:7001,http://localhost:7001
-
Environment=ETCD_ADVERTISE_CLIENT_URLS=http://172.16.164.5:4001,http://localhost:4001
-
Environment=ETCD_INITIAL_CLUSTER_STATE=new
-
Environment=ETCD_INITIAL_CLUSTER_TOKEN=Kubernetes
-
Environment=ETCD_INITIAL_CLUSTER=kubernetes=http://172.16.164.5:7001,kubernetes=http://localhost:7001
-
ExecStart=/usr/bin/etcd
-
[Install]
-
WantedBy=multi-user.target
systemctl start etcd
启动etcd,可以通过etcdctl ls /
或者etcdctl mkdir /test
测试etcd可用性。添加网段
确定etcd可以使用之后,我们需要设置分配给docker网络的网段etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16", "SubnetMin": "172.17.1.0", "SubnetMax": "172.17.254.0"}'
安装flannel
-
- 172.16.164.5
- 172.16.164.6
- 172.16.164.7
三台主机都要执行
其实flannel也是和etcd一样,不用安装的,直接从官方下载二进制执行文件就可以了,当然,你也可以自己编译。-
wget https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz
-
tar xvf flannel-0.5.5-linux-amd64.tar.gz
-
mv flannel-0.5.5-linux-amd64 /opt/flannel
-
cat /usr/lib/systemd/system/flanneld.service
-
[Unit]
-
Description=flannel
-
[Service]
-
ExecStart=/opt/flannel/flanneld \
-
-etcd-endpoints=http://172.16.164.5:4001
-
[Install]
-
WantedBy=multi-user.target
systemctl start flanneld
启动服务,正常情况下,你执行ip a
已经可以看到flannel0
桥接网卡了,etcd上执行etcdctl ls /coreos.com/network/subnets
也能够看到flannel申请的网段。修改Docker参数
要像使docker使用flannel的网络传递数据,要修改一些启动参数。-
cd /opt/flannel/
-
./mk-docker-opts.sh -i
mk-docker-opts.sh --help
可一直到这个脚本会生成一些docker参数,放到/run/docker_opts.env文件中,我们只需要将这些参数,加入到docker的启动参数-
cat /etc/sysconfig/docker | grep OPT
-
OPTIONS='--selinux-enabled --bip=172.17.64.1/24 --ip-masq=true --mtu=1472'
-
Paste_Image.png
配置完毕后,便可以启动docker了。
-
sytemctl stop docker
-
ifconfig down docker0
-
systemctl start docker
-
ip a s docker0
-
#可以看到docker0已经获取了flannel网段的地址
Paste_Image.png
最后
三台机器都配置好了之后,我们在三台机器上分别开启一个docker容器,测试它们的网络是不是通的。
-
docker run -ti centos bash
-
#一次查看容器IP
-
cat /etc/hosts
-
172.17.97.2 334cec104721
-
#测试连通性,都成功就OK了
-
#到跨物理机容器
-
ping -c 1 172.16.164.7
-
ping -c 1 172.17.67.1
-
#到宿主机
-
ping -c 1 172.16.164.7
-
#到别的物理机
-
ping -c 1 172.16.164.6