本覺得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一下,測試經過;