008.Docker Flannel+Etcd分散式網路部署
阿新 • • 發佈:2018-12-25
一 環境準備
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。1.3 基礎環境
ntp配置:略 #建議配置ntp服務,保證時間一致性 etcd版本:v3.3.9 docker版本:18.06.1-ce 防火牆及SELinux:關閉防火牆和SELinux1 # 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 [email protected]:~# mkdir -p /var/log/etcd/ #建議建立etcd日誌儲存目錄 2 [email protected]:~# mkdir -p /data/etcd #建議建立單獨的etcd資料目錄 3 [email protected]:~# ETCD_VER=v3.3.10 4 [email protected]:~# GITHUB_URL=https://github.com/etcd-io/etcd/releases/download 5 [email protected]:~# DOWNLOAD_URL=${GITHUB_URL} 6 [email protected]:~# curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz 7 [email protected]:~# tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1 8 [email protected]:~# rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz 9 10 [email protected]:~# cp /tmp/etcd-download-test/etcd* /usr/local/bin/ 11 [email protected]:~# etcd --version
2.2 採用systemd管理
1 [email protected]:~# 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 ro[email protected]:~# 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 [email protected]:~# 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 [email protected]:~# mkdir /tmp/flannel-download-test 2 [email protected]:~# FLANNEL_VER=v0.10.0 3 [email protected]:~# GITHUB_URL=https://github.com/coreos/flannel/releases/download 4 [email protected]:~# DOWNLOAD_URL=${GITHUB_URL} 5 [email protected]:~# curl -L ${DOWNLOAD_URL}/${FLANNEL_VER}/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -o /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz 6 [email protected]:~# tar xzvf /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz -C /tmp/flannel-download-test 7 [email protected]:~# rm -f /tmp/flannel-${FLANNEL_VER}-linux-amd64.tar.gz 8 9 [email protected]:~# cp /tmp/flannel-download-test/flanneld /usr/local/bin/ 10 [email protected]:~# cp /tmp/flannel-download-test/mk-docker-opts.sh /usr/local/bin/
3.2 採用systemd管理
1 [email protected]:~# 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 [email protected]:~# mkdir /etc/flannel 2 [email protected]:~# 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 [email protected]:~# 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 [email protected]:~# systemctl daemon-reload #只需要在etcd節點 2 [email protected]:~# systemctl restart etcd.service 3 [email protected]:~# systemctl enable etcd.service 4 [email protected]:~# ps -ef | grep etcd #驗證是否啟動正常
5.2 啟動flannel服務
1 [email protected]:~# systemctl daemon-reload #docker01和docker02節點 2 [email protected]:~# systemctl restart flanneld.service 3 [email protected]:~# systemctl enable flanneld.service 4 [email protected]:~# ps -ef | grep flanneld #驗證是否啟動正常
5.3 啟動docker服務
1 [email protected]:~# systemctl daemon-reload 2 [email protected]:~# systemctl restart docker.service 3 [email protected]:~# systemctl enable docker.service提示:docker02節點參考以上配置即可。
六 驗證確認
6.1 驗證flannel獲取網路引數
1 [email protected]:~# 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 [email protected]:~# ifconfig | grep -A6 docker 7 [email protected]:~# ifconfig | grep -A6 flannel
七 測試確認
7.1 建立測試容器
1 [email protected]:~# docker run -id --name Container01 busybox 2 [email protected]:~# docker run -id --name Container01 busybox提示:flannel為動態分配IP,因此實際IP可能和例項架構圖不一致,請根據實際情況規劃相關業務IP。