一 環境準備
1.1 Flannel概述
Flannel是一種基於overlay網絡的跨主機容器網絡解決方案,即將TCP數據包封裝在另外一種網絡包裏面進行路由轉發和通訊,Flannel是CoreOS開發,專門用於docker多機互聯的一個工具,讓集羣中的不一樣節點主機建立的容器都具備全集羣惟一的虛擬ip地址
1.2 原理說明
Flannel爲每一個host分配一個subnet,容器從subnet中分配IP,這些IP能夠在host間路由,容器間無需使用nat和端口映射便可實現跨主機通訊。每一個subnet都是從一個更大的IP池中劃分的,flannel會在每一個主機上運flanneld的agent,負責從池子中分配subnet。
Flannel使用etcd存放網絡配置、已分配的subnet、host的IP等信息,Flannel數據包在主機間轉發是由backend實現的,目前已經支持UDP、VxLAN、host-gw、AWS VPC和GCE路由等多種backend。
1.3 基礎環境
ntp配置:略 #建議配置ntp服務,保證時間一致性
etcd版本:v3.3.9
docker版本:18.06.1-ce
防火牆及SELinux:關閉防火牆和SELinux
名稱
|
地址
|
主機名
|
備註
|
docker01
|
172.24.8.111
|
docker01.example.com
|
|
docker02
|
172.24.8.112
|
docker02.example.com
|
|
etcd1
|
172.24.8.113
|
etcd1.example.com
|
用於保存相關IP信息
|
docker01中容器網段
|
10.1.15.2/24
|
container01
|
網段10.1.15.0/24
|
docker02中容器網段
|
10.1.20.2/24
|
container03
|
網段10.1.20.0/24
|
1 # hostnamectl set-hostname docker01.example.com
2 # hostnamectl set-hostname docker02.example.com
3 # hostnamectl set-hostname etcd1.example.com
提示:主機名非必須。
1.4 架構示意圖
數據轉發流程
- 容器直接使用目標容器的ip訪問,默認經過容器內部的eth0發送出去。
- 報文經過veth pair被髮送到vethXXX。
- vethXXX直接鏈接到虛擬交換機docker0的,報文經過虛擬bridge docker0發送出去。
- 查找路由表,外部容器ip的報文都會轉發到flannel0虛擬網卡,這是一個P2P的虛擬網卡,而後報文就被轉發到監聽在另外一端的flanneld。
- flanneld經過etcd維護了各個節點之間的路由表,把原來的報文UDP封裝一層,經過配置的iface發送出去。
- 報文經過主機之間的網絡找到目標主機。
- 報文繼續往上,到傳輸層,交給監聽在8285端口的flanneld程序處理。
- 數據被解包,而後發送給flannel0虛擬網卡。
- 查找路由表,發現對應容器的報文要交給docker0。
- docker0找到連到本身的容器,把報文發送過去。
1.5 相關順序
部署順序建議爲:etcd---->flannel---->docker,也可獨立分開部署,可能須要重啓相關服務,才能使flannel從etcd獲取網絡信息,docker才能從flannel獲取相關IP。
啓動順序必須爲:etcd---->flannel---->docker,必須保證etcd啓動正常,才能使flannel獲取正確地址段,docker容器才能從flannel獲取惟一地址。
二 etcd節點部署
2.1 單節點部署etcd
1 root@etcd1:~# mkdir -p /var/log/etcd/ #建議建立etcd日誌保存目錄
2 root@etcd1:~# mkdir -p /data/etcd #建議建立單獨的etcd數據目錄
3 root@etcd1:~# ETCD_VER=v3.3.10
4 root@etcd1:~# GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
5 root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
6 root@etcd1:~# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
7 root@etcd1:~# tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
8 root@etcd1:~# rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
9
10 root@etcd1:~# cp /tmp/etcd-download-test/etcd* /usr/local/bin/
11 root@etcd1:~# etcd --version
2.2 採用systemd管理
1 root@etcd1:~# vi /lib/systemd/system/etcd.service #建立用於systemd管理的文件
2 [Unit]
3 Description=etcd
4 Documentation=https://github.com/coreos/etcd
5 Conflicts=etcd.service
6
7 [Service]
8 Type=notify
9 Restart=always
10 RestartSec=5s
11 LimitNOFILE=40000
12 TimeoutStartSec=0
13
14 ExecStart=/usr/local/bin/etcd --name etcd1 --data-dir /data/etcd \
15 --listen-client-urls http://172.24.8.113:2379,http://127.0.0.1:2379 \
16 --advertise-client-urls http://172.24.8.113:2379
17
18 [Install]
19 WantedBy=multi-user.target
提示:使用yum安裝etcd則etcd.service會自動建立,且引用/etc/etcd/etcd.conf中的配置文件參數啓動。
2.4 Etcd中添加相應網段
按照1.3基礎環境規劃網段,添加etcd鍵值。
1 root@etcd1:~# etcdctl --endpoints http://172.24.8.113:2379 set /flannel/network/config '{"Network": "10.1.0.0/16", "SubnetLen": 24, "SubnetMin": "10.1.15.0","SubnetMax": "10.1.20.0", "Backend": {"Type": "vxlan"}}'
2 Network(字符串):CIDR格式的IPv4網絡,用於整個flannel網絡。(這是惟一的強制密鑰。)
3 SubnetLen(整數):分配給每一個主機的子網大小,除非Network小於24,不然默認爲24(即/24)。
4 SubnetMin(字符串):子網分配應從哪一個IP範圍開始,默認爲第一個子網Network。
5 SubnetMax(字符串):子網分配應結束的IP範圍的結尾,默認爲最後一個子網Network。
6 Backend(後端):要使用的後端類型和該後端的特定配置。
7 root@etcd1:~# etcdctl get /flannel/network/config
8 {"Network": "10.0.0.0/16", "SubnetLen": 24, "SubnetMin": "10.1.15.0","SubnetMax": "10.1.20.0", "Backend": {"Type": "vxlan"}}
三 flannel節點部署
3.1 安裝flannel
1 root@etcd1:~# mkdir /tmp/flannel-download-test
2 root@etcd1:~# FLANNEL_VER=v0.10.0
3 root@etcd1:~# GITHUB_URL=https://github.com/coreos/flannel/releases/download
4 root@etcd1:~# DOWNLOAD_URL=${GITHUB_URL}
5 root@etcd1:~# curl -L ${DOWNLOAD_URL}/${FLANNEL_VER}/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -o /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz
6 root@etcd1:~# tar xzvf /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -C /tmp/flannel-download-test
7 root@etcd1:~# rm -f /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz
8
9 root@etcd1:~# cp /tmp/flannel-download-test/flanneld /usr/local/bin/
10 root@etcd1:~# cp /tmp/flannel-download-test/mk-docker-opts.sh /usr/local/bin/
3.2 採用systemd管理
1 root@etcd1:~# vi /lib/systemd/system/flanneld.service #建立用於systemd管理的文件
2 [Unit]
3 Description=Flanneld overlay address etcd agent
4 Documentation=https://github.com/coreos/flannel
5 After=network.target
6 After=network-online.target
7 Wants=network-online.target
8 After=etcd.service #指定flannel在etcd以後、docker以前啓動
9 Before=docker.service
10
11 [Service]
12 User=root
13 Type=notify
14 LimitNOFILE=65536
15 EnvironmentFile=/etc/flannel/flanneld.conf #指定flannel配置文件
16 ExecStart=/usr/local/bin/flanneld \
17 -etcd-endpoints=${FLANNEL_ETCD_ENDPOINTS} \
18 -etcd-prefix=${FLANNEL_ETCD_PREFIX} $FLANNEL_OPTIONS
19 #使用引用flannel配置文件中的參數形式
20 ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker #看法讀部分
21 Restart=on-failure
22
23
24 [Install]
25 WantedBy=multi-user.target
3.3 建立flannel配置文件
1 root@docker01:~# mkdir /etc/flannel
2 root@docker01:~# vi /etc/flannel/flanneld.conf
3 # Flanneld configuration options
4 # etcd url location. Point this to the server where etcd runs
5 FLANNEL_ETCD_ENDPOINTS="http://172.24.8.113:2379" #指定etcd服務器的監聽地址
6
7 # etcd config key. This is the configuration key that flannel queries
8 # For address range assignment
9 FLANNEL_ETCD_PREFIX="/flannel/network" #指定etcd網絡參數所存儲鍵值的key
10
11 # Any additional options that you want to pass
12 FLANNEL_OPTIONS="-iface=eth0" #指定用於主機間通訊的接口,參數值也可爲IP地址
提示:使用yum安裝etcd則flannel.service會自動建立,若經過yum安裝,全部相關systemd管理文件會自動建立,可參考:
https://www.cnblogs.com/kevingrace/p/6859114.html
https://www.cnblogs.com/devilwind/p/8880677.html
進行配置和修改。
docker02節點參考以上配置便可。
解讀:
/etc/sysconfig/flanneld:配置相關flannel啓動參數,用於flannel從etcd獲取惟一地址段;
mk-docker-opts.sh:mk-docker-opts.sh運行後會講flannel獲取的網絡參數寫入/run/flannel/subnet.env文件;
-k DOCKER_NETWORK_OPTIONS:-k會將默認組合鍵,即DOCKER_OPTS=轉換爲DOCKER_NETWORK_OPTIONS,主要方便於yum安裝的docker直接引用(即docker.service中的Service字段ExecStart行爲已經包括$DOCKER_NETWORK_OPTIONS,從而不須要再次添加$DOCKER_OPTS);
-d /run/flannel/docker:將/run/flannel/subnet.env文件轉換爲docker能識別的格式後保存爲/run/flannel/docker。
四 配置docker
4.1 docker環境
docker01和docker02節點均須要安裝docker,具體方式見《002.docker版本及安裝》。
4.2 修改docker啓動參數
1 root@docker01:~# vi /lib/systemd/system/docker.service
2 #……
3 EnvironmentFile=/run/flannel/docker #添加flannel轉換後的docker能識別的配置文件
4 ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
5 #……
提示:須要將docker修改成採用flannel網絡。
docker02節點參考以上配置便可。
五 啓動相關服務
5.1 啓動etcd服務
1 root@etcd1:~# systemctl daemon-reload #只須要在etcd節點
2 root@etcd1:~# systemctl restart etcd.service
3 root@etcd1:~# systemctl enable etcd.service
4 root@etcd1:~# ps -ef | grep etcd #驗證是否啓動正常
5.2 啓動flannel服務
1 root@docker01:~# systemctl daemon-reload #docker01和docker02節點
2 root@docker01:~# systemctl restart flanneld.service
3 root@docker01:~# systemctl enable flanneld.service
4 root@docker01:~# ps -ef | grep flanneld #驗證是否啓動正常
5.3 啓動docker服務
1 root@docker01:~# systemctl daemon-reload
2 root@docker01:~# systemctl restart docker.service
3 root@docker01:~# systemctl enable docker.service
提示:docker02節點參考以上配置便可。
六 驗證確認
6.1 驗證flannel獲取網絡參數
1 root@docker01:~# cat /run/flannel/docker #檢查flannel獲取網絡參數狀況
2 DOCKER_OPT_BIP="--bip=10.1.19.1/24"
3 DOCKER_OPT_IPMASQ="--ip-masq=true"
4 DOCKER_OPT_MTU="--mtu=1450"
5 DOCKER_NETWORK_OPTIONS=" --bip=10.1.19.1/24 --ip-masq=true --mtu=1450"
6 root@docker01:~# ifconfig | grep -A6 docker
7 root@docker01:~# ifconfig | grep -A6 flannel
七 測試確認
7.1 建立測試容器
1 root@docker01:~# docker run -id --name Container01 busybox
2 root@docker02:~# docker run -id --name Container01 busybox
提示:flannel爲動態分配IP,所以實際IP可能和實例架構圖不一致,請根據實際狀況規劃相關業務IP。