Docker 的簡單使用&LVSNAT&LVSDR 的實現

[toc]html

1、Docker 的簡單使用

集羣環境搭建

在本實驗環境中咱們沒有辦法爲你們提供多臺服務器來模擬集羣環境,由此咱們 docker 工具來建立多個 container 來模擬集羣所須要的多臺服務器。前端

docker 能夠簡單的理解爲很是輕量級的虛擬機工具,而 container 則理解爲建立的虛擬機。nginx

集羣系統中,服務器資源能夠簡單分爲兩種角色:web

  • 一種是 Load Balancer,即負載均衡調度器,位於集羣系統的前端,對後端服務器實現負載均衡做用,對外 IP 地址也稱爲 VIP(虛擬 IP 地址)。
  • 另外一種就是後端服務器羣,處理由 Load Balancer 發來的請求。

整個集羣系統結構:算法

  • 宿主機環境(默認桌面環境):裝有 ipvsadm(LVS 的 IP 負載由 IPVS 內核模塊完成,ipvsadm 是爲 IPVS 編制規則的工具),充當負載均衡調度器
  • 宿主機瀏覽器:經過宿主機中的瀏覽器來充當客戶端
  • RealServer1 的 container:部署 Nginx web 服務器,提供 Web 訪問服務,充當服務器池中的一員
  • RealServer2 的 container:部署 Nginx web 服務器,提供 Web 訪問服務,充當服務器池中的一員

咱們將經過這樣的一些步驟來完成這次的實驗:docker

  • 本地安裝 ipvsadm 工具,加載 IPVS 模塊
  • 經過 docker 建立兩個 container 來模擬服務器池中的成員
  • 配置兩臺 RealServer 的環境:
  • [ ] 安裝 vim 與 nginx 工具
  • [ ] 修改默認的 nginx 展現頁面
  • 配置負載均衡調度機器:
  • [ ] 修改內核轉發參數 配置 ipvsadm 規則
  • 測試實驗效果

LVS 成功測試:咱們可以經過 VIP 訪問咱們的 Nginx 站點,通過屢次的刷新咱們可以訪問另外一個站點的內容(以顯示的內容以做區分,由於負載並不高,因此須要不少次刷新,點擊地址欄,按住 F5 不放)ubuntu

2、LVS/NAT 的實現

1 安裝 ipvsadm 工具

首先爲了可以使用 IPVS 內核模塊,咱們將在宿主機中安裝 ipvsadm,並嘗試可否使用:vim

# 更新源 
sudo apt-get update

# 安裝 ipvsadm 工具
sudo apt-get install ipvsadm

# 嘗試使用 ipvsadm
sudo ipvsadm -L

mark

2 建立服務器池成員

使用 docker 建立所需 container,使用如下命令建立:後端

docker run --privileged --name=RealServer1 -tdi ubuntu
docker run --privileged --name=RealServer2 -tdi ubuntu

命令講解:瀏覽器

docker run:建立 docker 容器

name 參數:給容器命名,方便區分

tid 參數:分配 tty,可以與之交互

ubuntu:指定容器鏡像,這裏使用 ubuntu 鏡像

mark

建立命令執行完成後,目前有兩個 container:

RealServer1:IP 地址爲 192.168.0.2。下文簡稱 RIP1
RealServer2:IP 地址爲 192.168.0.3。下文簡稱 RIP2

mark

能夠經過 ifconfig 命令查看各自的 IP 地址,此處的地址是由於按順序,且按默認配置建立所致使

3 配置兩臺RealServer的環境

RealServer 部署 Nginx 來提供 Web 服務,RealServer1 和 RealServer2 操做步驟相同,此處以 RealServer1 爲示例:

首先登陸 RealServer1:

# 經過 attach 命令登陸 RealServer1
docker attach RealServer1

安裝相關工具

apt-get update
apt-get install vim -y 
apt-get install nginx -y
service nginx start

mark

mark

按 i 鍵插入,按 esc 再輸入 :wq 保存退出。

注意若完成了 RealServer1 的配置以後,若是咱們不想打開新的終端,能夠經過 ctrl+p+q 的組合快捷鍵脫離當前機器的登陸,切勿使用 exit 的方式退出 container,這樣的方式關閉服務器的。 脫離以後便會返回到 shiyanlou 的 zsh 交互,能夠經過 docker attach RealServer2 的命令來登陸另外一臺機器,而後作相似的操做(同上的軟件安裝操做以及 nginx 啓動操做) 接下來就修改 nginx 頁面,以下所示:

#在 RealServer2 container 環境
vi /usr/share/nginx/html/index.html

mark

完成兩臺服務器的配置以後,咱們經過 service nginx start 啓動服務器中 nginx 服務。

至此咱們完成兩臺 Web 服務器的配置,咱們能夠打開宿主機 firefox 瀏覽器,地址欄分別輸入兩個 IP 地址,來檢驗咱們的配置成功:

mark mark

4 配置負載均衡調度器

1.爲避免影響實驗結果,關閉宿主機環境的 nginx 服務:

sudo service nginx stop

LoadBalancer 的對外 IP 地址爲 VIP,即 VIP 地址爲 120.26.15.9 (注意,你的 VIP 地址可能和個人不同,根據本身實際狀況來)。對內 IP 稱爲 RIP,此時 RIP 爲 192.168.0.1。

mark

2.開啓 LoadBalancer 的內核路由轉發:

echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward

查看當前機器內核路由轉發開啓狀況:

cat /proc/sys/net/ipv4/ip_forward

獲得的值爲 1,說明此機器已開啓內核路由轉發。進行下一步。 mark

3.使用 ipvsadm 添加 ipvs 規則。定義集羣服務:

sudo ipvsadm -A -t 120.26.15.9:80 -s rr         #定義集羣服務
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.2 -m #添加 RealServer1
sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.3 -m #添加 RealServer2
sudo ipvsadm -l                 #查看 ipvs 定義的規則

上面命中 ipvsadm 參數講解:

# 添加集羣服務
-A:添加一個新的集羣服務
-t: 使用 TCP 協議
-s: 指定負載均衡調度算法
rr:輪詢算法(LVS 實現了 8 種調度算法)
120.26.15.9:80 定義集羣服務的 IP 地址(VIP) 和端口

# 添加 Real Server 規則
-a:添加一個新的 RealServer 規則
-t:tcp 協議
-r:指定 RealServer IP 地址
-m:定義爲 NAT 
上面命令添加了兩個服務器 RealServer1 和 RealServer2

mark

4 測試配置

分別登入兩臺宿主機,講nginx服務分別打開 mark

打開瀏覽器,輸入 VIP 地址:120.26.15.9: mark

由於訪問壓力比較小,調度算法不會請求切換服務器,能夠按住 F5 快速屢次刷新查看頁面變化效果 以上便實現了 LVS 的 NAT 負載均衡系統。 mark

3、LVS/DR 的搭建

與 NAT 方式相同,咱們將經過 docker 來模擬咱們的集羣環境。

集羣系統中,服務器資源能夠簡單分爲兩種角色:

  • 一種是 Load Balancer,即負載均衡調度器,位於集羣系統的前端,對後端服務器實現負載均衡做用,對外 IP 地址也稱爲 VIP(虛擬 IP 地址)。
  • 另外一種就是後端服務器羣,處理由 Load Balancer 發來的請求。

整個集羣系統結構:

  • 宿主機環境(默認桌面環境):充當客戶端訪問 web 服務
  • LoadBalancer1 的 container:裝有 ipvsadm,充當負載均衡調度器
  • RealServer1 的 container:部署 Nginx web 服務器,提供 Web 訪問服務,充當服務器池中的一員
  • RealServer2 的 container:部署 Nginx web 服務器,提供 Web 訪問服務,充當服務器池中的一員

咱們將經過這樣的一些步驟來完成這次的實驗:

本地安裝 ipvsadm 工具,加載 IPVS 模塊

如果咱們沿用 NAT 的實驗環境,咱們須要作環境的清理:

1.首先清除 ipvsadm 的規則:

sudo ipvsadm -C

2.刪除以前所建立的 container,雖然都是提供 Web 服務,可是在 DR 模式中須要修改內核參數與建立網卡別名,須要超級權限,因此不能沿用以前的 container:

# 關閉全部的 container
docker stop `docker ps -aq`
# 刪除全部的 container
docker rm `docker ps -aq`

mark

3.安裝 ipvsadm 工具

由於在 NAT 實驗中咱們已安裝因此可跳過該步驟,如果新啓動的環境請參考 NAT 中的步驟,此處提示務必在宿主機環境中執行 ipvsadm -L 的驗證步驟,如果不執行該步驟,在 LoadBalancer 的 container 中咱們將沒法加載 IPVS 的內核模塊。

經過 docker 建立三個 container 來模擬服務器池中的成員

docker run --privileged --name=LoadBalancer -tid ubuntu
docker run --privileged --name=RealServer1 -tid ubuntu
docker run --privileged --name=RealServer2 -tid ubuntu

mark

配置兩臺 RealServer 的環境:

  • 安裝 vim 與 nginx 工具
  • 修改默認的 nginx 展現頁面
  • nginx服務啓動

首先登陸 RealServer1:

# 經過 attach 命令登陸 RealServer1
docker attach RealServer1

安裝相關工具

apt-get update
apt-get install vim -y 
apt-get install nginx -y
vi /usr/share/nginx/html/index.html
service nginx start
  • ctrl+p+q 切換到RealServer2

mark

mark

修改內核參數,抑制 arp

1.修改內核參數

以 RealServer1 爲例,登陸 container:

執行下列命令:

# 設置只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求 
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

# 爲了保險本身能夠查看一下是否成功修改
cat /proc/sys/net/ipv4/conf/lo/arp_ignore

# 設置對查詢目標使用最適當的本地地址.在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通訊的本地地址.首要是選擇全部的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址. 若是沒有合適的地址被發現,將選擇當前的發送網絡接口或其餘的有可能接受到該ARP迴應的網絡接口來進行發送.
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

# 使得上面的配置當即生效
sysctl -p

mark

mark

ARP 的內核參數: arp_ignore 部分參數:定義了本機響應 ARP 請求的級別

0表示目標 IP 是本機的,則響應 ARP 請求。默認爲 0

1若是接收 ARP 請求的網卡 IP 和目標 IP 相同,則響應 ARP 請求

arp_announce 參數:定義了發送 ARP 請求時,源 IP 應該填什麼。

0 表示使用任一網絡接口上配置的本地 IP 地址,一般就是待發送的 IP 數據包的源 IP 地址 。默認爲 0

1 儘可能避免使用不屬於該網絡接口(即發送數據包的網絡接口)子網的本地地址做爲 ARP 請求的源 IP 地址。大體的意思是若是主機包含多個子網,而 IP 數據包的源 IP 地址屬於其中一個子網,雖然該 IP 地址不屬於本網口的子網,可是也能夠做爲ARP 請求數據包的發送方 IP。

2 表示忽略 IP 數據包的源 IP 地址,老是選擇網絡接口所配置的最合適的 IP 地址做爲 ARP 請求數據包的源 IP 地址(通常適用於一個網口配置了多個 IP 地址)

建立網卡別名與添加路由

只有目的 IP 是本機器中的一員時纔會作相應的處理,因此須要添加網卡別名:

# 配置虛擬IP
ifconfig lo:0 192.168.0.10 broadcast 192.168.0.10 netmask 255.255.255.255 up

# 添加路由,由於本就是相同的網段因此能夠不添加該路由
route add -host 192.168.0.10 dev lo:0

service networking restart

配置一臺 LoadBalancer 環境:

  • 安裝 ipvsadm (注意主機,也就是原來的界面也必須按照了ipvsadm)
  • 配置網卡別名
  • 配置 ipvsadm 規則

mark mark mark

建立 eth0 的別名並綁定 VIP 地址,做爲集羣同時使用:

ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up

查看網卡信息:ifconfig

mark

在 LoadBalancer 中添加 IPVS 規則:

ipvsadm -A -t 192.168.0.10:80 -s rr         # 定義集羣服務
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.3 -g # 添加 RealServer1
ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.4 -g # 添加 RealServer2
ipvsadm -l                  # 查看 ipvs 定義的規則

ipvsadm 命令參數講解:

# 添加集羣服務
-A:添加一個新的集羣服務
-t: 使用 TCP 協議
-s: 指定負載均衡調度算法
rr:輪詢算法(LVS 實現了 8 種調度算法)
192.168.0.10:80 定義集羣服務的 IP 地址(VIP) 和端口

# 添加 Real Server 規則
-a:添加一個新的 RealServer 規則
-t:tcp 協議
-r:指定 RealServer IP 地址
-g:定義爲 DR 模式
上面命令添加了兩個集羣服務器 RealServer1 和 RealServer2

mark

測試實驗效果

LVS 成功測試:咱們可以經過 VIP 訪問咱們的 Nginx 站點,通過屢次的刷新咱們可以訪問另外一個站點的內容(以顯示的內容以做區分,由於負載並不高,因此須要不少次刷新,點擊地址欄,按住 F5 不放)

mark

查看 ipvsadm 中的統計數據。

相關文章
相關標籤/搜索