CentOS7 手動部署flannel並啓用vxlan

本覺得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 

下載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

flanneld服務配置 

添加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

flanneld環境變量配置 

環境變量的管理也仿照上一篇對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

查看環境變量是否生效,而後啓動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裏還沒寫入網絡配置信息呢;

flanneld網絡配置 

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

flanneld vxlan網絡配置

推薦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使用flannel網絡

再從新生成一次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一下,測試經過;

相關文章
相關標籤/搜索