008.Docker Flannel+Etcd分散式網路部署

来源:https://www.cnblogs.com/itzgr/archive/2018/12/25/10172004.html
-Advertisement-
Play Games

一 環境準備 1.1 Flannel概述 Flannel是一種基於overlay網路的跨主機容器網路解決方案,即將TCP數據包封裝在另一種網路包裡面進行路由轉發和通信,Flannel是CoreOS開發,專門用於docker多機互聯的一個工具,讓集群中的不同節點主機創建的容器都具有全集群唯一的虛擬ip ...


一 環境準備

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 架構示意圖

78_thumb1 數據轉發流程
  1. 容器直接使用目標容器的ip訪問,預設通過容器內部的eth0發送出去。
  2. 報文通過veth pair被髮送到vethXXX。
  3. vethXXX直接連接到虛擬交換機docker0的,報文通過虛擬bridge docker0發送出去。
  4. 查找路由表,外部容器ip的報文都會轉發到flannel0虛擬網卡,這是一個P2P的虛擬網卡,然後報文就被轉發到監聽在另一端的flanneld。
  5. flanneld通過etcd維護了各個節點之間的路由表,把原來的報文UDP封裝一層,通過配置的iface發送出去。
  6. 報文通過主機之間的網路找到目標主機。
  7. 報文繼續往上,到傳輸層,交給監聽在8285埠的flanneld程式處理。
  8. 數據被解包,然後發送給flannel0虛擬網卡。
  9. 查找路由表,發現對應容器的報文要交給docker0。
  10. 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
  79_thumb1 80_thumb1   示:flannel為動態分配IP,因此實際IP可能和實例架構圖不一致,請根據實際情況規劃相關業務IP。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天面試碰到了面試官問spring的時候,問完ioc,然後下個問題我以為是aop,後來才聽清是動態代理,感覺回答的不是太好,也是好久不接觸 1.靜態代理 代理模式也就委托模式。 三個角色: 1. Subject抽象主題角色:介面 2. RealSubject具體主題角色:介面的實現類,業務邏輯的具體 ...
  • python爬蟲scrapy項目(二) 爬取目標:房天下全國租房信息網站(起始url:http://zu.fang.com/cities.aspx) 爬取內容:城市;名字;出租方式;價格;戶型;面積;地址;交通 反反爬措施:設置隨機user-agent、設置請求延時操作、 1、開始創建項目 2、進入 ...
  • 本來昨天應該更新的,但是由於各種原因,抱歉,讓追這個系列的朋友久等了。上一篇文章 [在.Net Core 使用緩存和配置依賴策略](https://www.cnblogs.com/viter/p/10146312.html). 講的是如何使用本地緩存,那麼本篇文章就來瞭解一下如何使用分散式緩存,通過... ...
  • 小伙伴們都知道,常用的http請求有兩種方式,即GET方法和POST方法,很多剛入門的童鞋難免都會有一個誤區,是不是GET是從伺服器上獲取數據,POST是向伺服器傳送數據? 我的理解是:不論是GET還是POST,都是向伺服器提交數據,並且請求之後都會從伺服器獲取數據,兩者的區別僅是傳送方式不同而已, ...
  • 一位攝影程式員的獨白 每個人都有愛好,都有釋放壓力的活動,而我也不例外,我除了每天上班,周末就會約一群好友去拍妹子,成家後,就改為拍蟲子,一拍就到了30歲,到了30歲就感覺到了中年的壓力,這時候停下手中的攝影,開始研究技術,我開始翻閱各種技術博客,各種開源作品,靜下心去研究技術時,發現.NET的技術 ...
  • Win10的應用商店中,可以安裝喜馬拉雅,並下載感興趣的音頻文件。下載的音頻如下圖所示, 有兩個json文件(圖1),其中一個json文件(2677885list.json)包含了所下載音頻的詳細信息,包括id和title(文件真實名稱);音頻文件是一串純數字的id作為名稱,沒有顯示音頻的真實名稱( ...
  • C# -- 泛型的使用 1. 使用泛型 運行結果: 2. 泛型約束 運行結果: ...
  • Ssh登錄 Ssh是建立在應用層和傳輸層的安全協議,專門為遠程登錄回話和其他網路服務提供安全性。利用ssh可以有效的防止遠程管理中的信息泄露問題,同時ssh傳輸的數據是經過壓縮的,可以加快傳輸速度。 1、啟動sshd服務。Centos預設已經安裝了ssh,而且該服務預設是啟動的 [root@loca ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...