本觉得docker准备稳当以后,就能够直接上k8s了,结果yum install kubernetes,报错:Error: docker-ce conflicts with docker-1.9.1 .....php
这才想起来,本身的docker不是从centos官方源获取的,而是用了docker的源安装docker-ce,参见上一遍docker的部署文档。html
centos官方源提供的k8s在版本1.2,配套docker 1.9,而我用的docker-ce在版本18.03,经查k8s的changelog,至少要到1.8才能支持到docker 17.03,而后到1.11,都未提到过docker 18;linux
但参考了较新的k8s部署教程,已经有k8s 1.10配套docker-ce 18.03的先例,能够一试;git
参考了现网已有的大部分k8s部署教程,大都太流程化,不够细致;github
安装k8s一般会提到flannel,它提供容器的跨主机通讯支持,已经涉及到SDN的领域,这一篇对flannel的部署及原理介绍特别值得读一下;docker
考虑到k8s须要用最新版,flannel也就用最新版,不经过yum安装了,因而本身动手部署了flannel,把从细节收获的信息记下来,提供一个不同的视角;centos
----如下是正文----网络
flannel依赖etcd提供配置管理;为简化,我只使用了一个单点的etcd,没有组etcd集群;post
下载flannel,从github找到最新的发布版,我下到的是0.10.0;https://github.com/coreos/flannel/releases测试
解压后,获得一个二进制文件flanneld,一个脚本mk-docker-opts.sh,以及一个README.md;最后这个文件忽略就好了,其它两个放到/usr/bin下;
mv flanneld /usr/bin mv mk-docker-opts.sh /usr/bin
添加systemd的service管理文件:
# cat /usr/lib/systemd/system/flanneld.service [Unit] Description=flannel Before=docker.service [Service] ExecStart=/usr/bin/flanneld [Install] WantedBy=multi-user.target RequiredBy=docker.service
环境变量的管理也仿照上一篇对docker的环境变量管理,添加了一个Drop-in file:
# cat /etc/systemd/system/flanneld.service.d/flannel.conf [Service] Environment="FLANNELD_ETCD_ENDPOINTS=http://xxxx:2379" Environment="FLANNELD_ETCD_PREFIX=/flannel/network"
flannel的环境变量全都是参数加上“FLANNELD_”前缀,见flanneld环境变量说明;
查看环境变量是否生效,而后启动flanneld:
systemctl daemon-reload systemctl show flanneld --property Environment
systemctl start flanneld
查看启动日志:
systemctl status flanneld -l
发现报错了:Couldn't fetch network config: 100: Key not found
想起来etcd里还没写入网络配置信息呢;
docker默认用172.17.0.0/16这个段,我想换个段,以明确知道是在使用flanneld提供的网络,因而就用了172.10.0.0/16
etcdctl mk /flannel/network/config '{"Network":"172.10.0.0/16", "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0"}'
由于flannel一直在尝试从etcd读配置信息,因此不须要重启flanneld,再看启动日志,flanneld已经获取到想要的子网地址了;
此时,在/run/flannel/subnet.env位置会生成这个host所分配到的子网信息:
# cat /run/flannel/subnet.env FLANNEL_NETWORK=172.10.0.0/16 FLANNEL_SUBNET=172.10.63.1/24 FLANNEL_MTU=1472 FLANNEL_IPMASQ=false
而这个文件正是mk-docker-opts.sh脚本的输入文件:
# /usr/bin/mk-docker-opts.sh -c # cat /run/docker_opts.env DOCKER_OPTS=" --bip=172.10.63.1/24 --ip-masq=true --mtu=1472"
这时看一下etcd,多了一条信息:
# etcdctl get /flannel/network/subnets/172.10.63.0-24 {"PublicIP":"xxxxxx"}
看一下主机网卡
# ip a |grep flannel 146: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN qlen 500
看一下网卡详情
# ip -d link show dev flannel0 147: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 500 link/none promiscuity 0 tun
将生成docker_opts.env的命令加到flanneld的systemd启动配置中:
[Unit] Description=flannel Before=docker.service [Service] ExecStart=/usr/bin/flanneld ExecStartPost=/usr/bin/mk-docker-opts.sh -c # 新加 [Install] WantedBy=multi-user.target RequiredBy=docker.service
推荐Kernel 3.9以上的主机启用vxlan网络(来源记不清了),CentOS7的内核已经到3.10,能够支持;
修改网络配置:
etcdctl set /flannel/network/config '{"Network":"172.10.0.0/16", "SubnetMin": "172.10.1.0", "SubnetMax": "172.10.254.0", "Backend": {"Type": "vxlan"}}'
重启flanneld:
systemctl restart flanneld
查看启动日志,已经能看到在使用vxlan backend了;
看一下/run/flannel/subnet.env文件,发现子网没变,可是MTU变了:
# cat /run/flannel/subnet.env FLANNEL_NETWORK=172.10.0.0/16 FLANNEL_SUBNET=172.10.63.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false
再看一下etcd
# etcdctl get /flannel/network/subnets/172.10.63.0-24 {"PublicIP":"xxxx","BackendType":"vxlan","BackendData":{"VtepMAC":"e2:73:8e:db:83:56"}}
再看一下主机网卡
# ip a|grep flannel 145: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN
再看一下网卡详情
# ip -d link show dev flannel.1 145: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT link/ether e2:73:8e:db:83:56 brd ff:ff:ff:ff:ff:ff promiscuity 0 vxlan id 1 local 10.10.10.127 dev bond0 srcport 32768 65000 dstport 8472 nolearning ageing 300
再从新生成一次docker_opts.env:
# /usr/bin/mk-docker-opts.sh -c
# cat /run/docker_opts.env DOCKER_OPTS=" --bip=172.10.63.1/24 --ip-masq=true --mtu=1450"
修改/lib/systemd/system/docker.service:
EnvironmentFile=/run/docker_opts.env # 新加 ExecStart=/usr/bin/dockerd $DOCKER_OPTS
重启docker服务:
systemctl daemon-reload
systemctl restart docker
查看bridge网络的信息:
# docker network ls |grep bridge d5ad3f19dc63 bridge bridge local # docker network inspect d5ad3f19dc63 | grep Subnet "Subnet": "172.10.63.1/24",
这就已是在flannel提供的网段内了;
而后在另外一台主机上也照作一遍,分别启动一个container,互ping一下,测试经过;