第三周,docker及l(fā)vs

1耕驰、分別使用lxc容器和docker容器搭建nginx服務(wù)爷辱,能夠正常訪問到容器內(nèi)的web服務(wù)?

下載docker-ceyum倉庫至 /etc/yum.repos.d/目錄中,使用yum安裝docker-ce

使用阿里鏡像倉庫地址:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

cd /etc/yum.repos.d/

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install docker-ce

使用阿里的容器鏡像加速服務(wù)(需要登錄阿里云)


創(chuàng)建/etc/docker/daemon.json配置文件填入以下代碼

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

? "registry-mirrors": ["https://xoqam0c8.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload #重新加載配置文件

sudo systemctl restart docker #重啟服務(wù)

docker version? # 查看版本

Client: Docker Engine - Community

Version:? ? ? ? ? 19.03.1

API version:? ? ? 1.40

Go version:? ? ? ? go1.12.5

Git commit:? ? ? ? 74b1e89

Built:? ? ? ? ? ? Thu Jul 25 21:21:07 2019

OS/Arch:? ? ? ? ? linux/amd64

Experimental:? ? ? false

Server: Docker Engine - Community

Engine:

? Version:? ? ? ? ? 19.03.1

? API version:? ? ? 1.40 (minimum version 1.12)

? Go version:? ? ? go1.12.5

? Git commit:? ? ? 74b1e89

? Built:? ? ? ? ? ? Thu Jul 25 21:19:36 2019

? OS/Arch:? ? ? ? ? linux/amd64

? Experimental:? ? false

containerd:

? Version:? ? ? ? ? 1.2.6

? GitCommit:? ? ? ? 894b81a4b802e4eb2a91d1ce216b8817763c29fb

runc:

? Version:? ? ? ? ? 1.0.0-rc8

? GitCommit:? ? ? ? 425e105d5a03fabd737a126ad93d62a9eeede87f

docker-init:

? Version:? ? ? ? ? 0.18.0

? GitCommit:? ? ? ? fec3683


查看容器基本信息

docker pull nginx:stable-alpine? #從dockerhub中拉取鏡像至本地

docker image ls #查看本地鏡像

[root@centos7 yum.repos.d]# docker image ls

????REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

????nginx? ? ? ? ? ? ? stable-alpine? ? ? 8587e8f26fc1? ? ? ? 6 days ago? ? ? ? ? 21.2MB

docker image inspect nginx:stable-alpine #查看鏡像的詳細(xì)信息朦肘,以xml格式


docker run --name nginx nginx:stable-alpine 創(chuàng)建并啟動(dòng)拖下來的鏡像

[root@centos7 ~]# docker container exec nginx1 ifconfig? ?#連接至容器并且查看ip地址

eth0? ? ? Link encap:Ethernet? HWaddr 02:42:AC:11:00:02?

? ? ? ? ? inet addr:172.17.0.2? Bcast:172.17.255.255? Mask:255.255.0.0

? ? ? ? ? UP BROADCAST RUNNING MULTICAST? MTU:1500? Metric:1

? ? ? ? ? RX packets:85 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:54 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:0

? ? ? ? ? RX bytes:6892 (6.7 KiB)? TX bytes:4326 (4.2 KiB)

lo? ? ? ? Link encap:Local Loopback?

? ? ? ? ? inet addr:127.0.0.1? Mask:255.0.0.0

? ? ? ? ? UP LOOPBACK RUNNING? MTU:65536? Metric:1

? ? ? ? ? RX packets:0 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:1

? ? ? ? ? RX bytes:0 (0.0 B)? TX bytes:0 (0.0 B)


查看容器IP地址


在外部訪問容器內(nèi)nginx服務(wù)

docker container exec -it nginx1 /bin/sh? 連接至容器可以查看容器內(nèi)部運(yùn)行方式


容器內(nèi)進(jìn)程第一個(gè)為nginx

docker stop nginx1? #停止容器

docker run --name web -it --rm nginx:stable-alpine # --rm可以指定退出容器時(shí)就刪除容器 饭弓,-it指定交互式接口運(yùn)行方式,這里指運(yùn)行在前臺(tái)厚骗,-d可以指定運(yùn)行在后臺(tái)示启,無法與rm同時(shí)使用,

docker container logs name 查看容器中進(jìn)程的日志

docker search #搜索鏡像

docker pull 拖去鏡像

docker images 顯示鏡像列表

docker create 創(chuàng)建容器

docker start 啟動(dòng)容器

docker run 創(chuàng)建并啟動(dòng)容器

docker container commit b1? registry/name:version 制作鏡像

docker push 推送鏡像


2领舰、簡述docker網(wǎng)絡(luò)模型夫嗓,并實(shí)現(xiàn)橋接模式下不同宿主機(jī)之間的docker網(wǎng)絡(luò)互通?

docker提供四種可用網(wǎng)絡(luò)

1,橋網(wǎng)絡(luò) 默認(rèn)docker0 的nat橋冲秽,可以自行定義

2舍咖,共享橋網(wǎng)絡(luò)(聯(lián)盟式),共享名稱空間的IPC,NET,UTS锉桑。隔離文件系統(tǒng)排霉,用戶,以及進(jìn)程民轴,容器可用通信接口通信攻柠,也可以使用同一個(gè)主機(jī)名對(duì)外提供服務(wù)

docker run --name box -it --rm --network bridge busybox 開啟一個(gè)容器指定橋網(wǎng)絡(luò)


docker run --name boxv1-it --rm --network container:box busybox #新起一臺(tái)容器 指定加入box網(wǎng)絡(luò),即是共享式網(wǎng)絡(luò)


ip地址與box容器ip地址一樣


3后裸,共享宿主機(jī)網(wǎng)絡(luò)瑰钮,容器直接使用宿主機(jī)網(wǎng)絡(luò),進(jìn)程監(jiān)聽在宿主機(jī)的網(wǎng)卡某端口

docker run --name box -it --rm --network host busybox 指定網(wǎng)絡(luò)連接使用宿主機(jī)的網(wǎng)絡(luò)微驶,

顯示網(wǎng)卡信息都為宿主機(jī)的網(wǎng)絡(luò)

4浪谴,none網(wǎng)絡(luò),空網(wǎng)絡(luò)無網(wǎng)卡

[root@centos7 ~]# docker run --name box -it --rm --network none busybox 指定--network none 為none 進(jìn)入交互式接口容器因苹,網(wǎng)絡(luò)為空網(wǎng)絡(luò)

/ # ifconfig

lo? ? ? ? Link encap:Local Loopback?

? ? ? ? ? inet addr:127.0.0.1? Mask:255.0.0.0

? ? ? ? ? UP LOOPBACK RUNNING? MTU:65536? Metric:1

? ? ? ? ? RX packets:0 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:1

? ? ? ? ? RX bytes:0 (0.0 B)? TX bytes:0 (0.0 B)

/ #

docker run --name nginx -p 80:80 nginx:stable-alpine #使用-p選項(xiàng)將容器內(nèi)80端口綁定至宿主機(jī)80端口中苟耻,實(shí)現(xiàn)dnat轉(zhuǎn)發(fā)功能轉(zhuǎn)發(fā)至容器內(nèi)nginx服務(wù)


在192.168.196啟動(dòng)的容器中訪問195主機(jī)80端口



docker run --name nginx -p 192.168.1.195::80 nginx:stable-alpine 也可將宿主機(jī)的ip隨機(jī)端口綁定至容器內(nèi)80端口


隨機(jī)端口為32768



[root@centos7 ~]# docker container port nginx? 查看容器內(nèi)映射端口

80/tcp -> 192.168.1.195:32768

docker run --name nginx -p 80 -p 443 nginx:stable-alpine #-p選項(xiàng)也可指定多端口監(jiān)聽

[root@centos7 ~]# docker container port nginx?

443/tcp -> 0.0.0.0:32778

80/tcp -> 0.0.0.0:32779

[root@centos7 ~]#


[root@centos7 yum.repos.d]# docker network create --subnet 10.10.0.0/24 mybr0 創(chuàng)建一個(gè)網(wǎng)絡(luò) 并指定子網(wǎng)地址(默認(rèn)為橋接網(wǎng)絡(luò))

aa20a2b9f3ba96a80812e0141de2db8fd22c44b8e767a13b75c4b40f9f10c1b6

[root@centos7 yum.repos.d]# docker network ls

NETWORK ID? ? ? ? ? NAME? ? ? ? ? ? ? ? DRIVER? ? ? ? ? ? ? SCOPE

3328bee523d5? ? ? ? bridge? ? ? ? ? ? ? bridge? ? ? ? ? ? ? local

377db5bdc7d8? ? ? ? host? ? ? ? ? ? ? ? host? ? ? ? ? ? ? ? local

aa20a2b9f3ba? ? ? ? mybr0? ? ? ? ? ? ? bridge? ? ? ? ? ? ? local

3d855d221162? ? ? ? none? ? ? ? ? ? ? ? null? ? ? ? ? ? ? ? local

[root@centos7 yum.repos.d]# docker run --name nginx --network mybr0? nginx:stable-alpine


加入網(wǎng)絡(luò)之后docker默認(rèn)會(huì)創(chuàng)建iptables規(guī)則

[root@centos7 ~]# docker network connect bridge nginx? ##將nginx容器加入bridge網(wǎng)絡(luò)

[root@centos7 ~]# docker container exec nginx ifconfig?

eth0? ? ? Link encap:Ethernet? HWaddr 02:42:0A:0A:00:02?

? ? ? ? ? inet addr:10.10.0.2? Bcast:10.10.0.255? Mask:255.255.255.0

? ? ? ? ? UP BROADCAST RUNNING MULTICAST? MTU:1500? Metric:1

? ? ? ? ? RX packets:22 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:0

? ? ? ? ? RX bytes:2430 (2.3 KiB)? TX bytes:0 (0.0 B)

eth1? ? ? Link encap:Ethernet? HWaddr 02:42:AC:11:00:02?

? ? ? ? ? inet addr:172.17.0.2? Bcast:172.17.255.255? Mask:255.255.0.0

? ? ? ? ? UP BROADCAST RUNNING MULTICAST? MTU:1500? Metric:1

? ? ? ? ? RX packets:8 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:0

? ? ? ? ? RX bytes:648 (648.0 B)? TX bytes:0 (0.0 B)

lo? ? ? ? Link encap:Local Loopback?

? ? ? ? ? inet addr:127.0.0.1? Mask:255.0.0.0

? ? ? ? ? UP LOOPBACK RUNNING? MTU:65536? Metric:1

? ? ? ? ? RX packets:0 errors:0 dropped:0 overruns:0 frame:0

? ? ? ? ? TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

? ? ? ? ? collisions:0 txqueuelen:1

? ? ? ? ? RX bytes:0 (0.0 B)? TX bytes:0 (0.0 B)


docker run --name box -it --rm -v mydata busybox /bin/sh # -v選項(xiàng)指定在容器創(chuàng)建一個(gè)目錄mydata此目錄會(huì)關(guān)聯(lián)至宿主機(jī)一個(gè)目錄

docker container inspect box? 查看關(guān)聯(lián)的目錄



進(jìn)入? /var/lib/docker/volumes/var/lib/docker/volumes/8b79efb35c2ab0231d12795200625843a8d3ae00f7d7a24da896f77667c60382/_data 創(chuàng)建文件則會(huì)被關(guān)聯(lián)至容器中mydata目錄中,即使容器被刪除宿主機(jī)的文件也不會(huì)刪除


docker run --name box1 -it --rm -v /data/volumes/v1:/mydata busybox #將容器與宿主機(jī)指定的目錄中建立關(guān)聯(lián)關(guān)系扶檐,

docker run --name box2 -it --rm --volumes-from box1 busybox /bin/sh? #可直接復(fù)制另一個(gè)容器的卷凶杖,可共享同一個(gè)存儲(chǔ)卷

/ # ls

bin? ? dev? ? etc? ? home? ? mydata? proc? ? root? ? sys? ? tmp? ? usr? ? var

/ # ls /mydata/

hello.txt

使用docker file制作鏡像

mkdir workship? #在宿主機(jī)創(chuàng)建一個(gè)目錄,在此目錄中創(chuàng)建dockerfile文件(文件名必須為Dockerfile)

[root@centos7 ~]# vim workship/Dockerfile

FROM busybox:latest # 指定初始鏡像在此鏡像中修改容器的配置或者安裝軟件

LABEL zuozhe="stephenzhong" mail="stephenzhong@mail.com" #指定此描述

COPY index.html /data/web/html/ # 從宿主機(jī)復(fù)制index.html文件到 /data/web/html容器的目錄中入目標(biāo)文件不存在則會(huì)自動(dòng)創(chuàng)建此目錄

docker image build /root/workship -t myimg:v0.1? #利用dockerfile構(gòu)建新鏡像 -t指定名稱標(biāo)簽需要使用dockerfile 構(gòu)建鏡像款筑,需要?jiǎng)?chuàng)建一個(gè)目錄官卡,存放Dockerfile這個(gè)文件蝗茁,且復(fù)制時(shí)以dockerfile文件的父目錄為起始點(diǎn)。

docker file 的常見命令?

ADD:可從互聯(lián)網(wǎng)上下載包寻咒,并且復(fù)制到指定目錄哮翘。如果是本地tar格式文件則會(huì)被復(fù)制到指定目錄并且被展開

WORKDIR :? 指定容器內(nèi)工作目錄,可出現(xiàn)多次毛秘,生效范圍為workdir 到下個(gè)workdir命令之間

VOLUME:在鏡像中創(chuàng)建一個(gè)掛載點(diǎn)目錄饭寺,但仍然需要啟動(dòng)容器時(shí)指定-v 來綁定需要的自己指定某個(gè)路徑來關(guān)聯(lián),否則則默認(rèn)為關(guān)聯(lián)至/var/lib/docker/image的目錄中關(guān)聯(lián)

EXPOSE 用于為容器打開指定要監(jiān)聽的端口以實(shí)現(xiàn)與外部通信 EXPOSE 1111 /tcp|udp 即可叫挟,需要在啟動(dòng)容器時(shí)加上-P選項(xiàng)艰匙,且只能以動(dòng)態(tài)方式暴露端口

ENV:用于為鏡像定義所需要的環(huán)境變量,并可被dockerfile 文件中位于其后的其他指令 ENV,ADD,COPY等 ENV key=value

ARG:可以替換dockerfile中定義的env變量參數(shù) 抹恳,在docker build 可直接在命令行中傳值使用 --build-arg "參數(shù)"?

RUN:在構(gòu)建鏡像的時(shí)候可以執(zhí)行shell命令

CMD:在構(gòu)建好的鏡像中员凝,在開啟容器之前使用的命令設(shè)定默認(rèn)需要運(yùn)行的cmd,只有最有一個(gè)cmd生效

ENTRYPOINT:與CMD相似奋献,如果與CMD混用健霹,則ENTRYPOINT指定的程序,CMD指定的則為ENTRYPOINT command 的參數(shù)





3瓶蚂、制作一個(gè)docker鏡像糖埋,實(shí)現(xiàn)sshd服務(wù)、nginx服務(wù)的正常使用


docker?run?-it?--name=c1 centos /bin/bash #以交互式方式進(jìn)入centos的鏡像源


yum install openssh-server #在容器中安裝ssh服務(wù)

ssh-keygen?-t?rsa?-b?2048?-f?/etc/ssh/ssh_host_rsa_key #生成秘鑰對(duì)容器中進(jìn)行


ssh-keygen?-#宿主機(jī)生成秘鑰窃这,并且將公鑰拷貝至容器中/root/.ssh/authorized_keys文件中


echo?"root:123456"|chpasswd #在容器中生成root口令

/usr/sbin/sshd -D #以后臺(tái)方式運(yùn)行sshd服務(wù)

docker?commit?c1 ssh:centos #將安裝好的軟件制作成鏡像ssh:centos



測試連接成功

ssh連接至容器瞳别,并且安裝nginx服務(wù)

docker run -p 22022:22 -d ssh:centos /usr/sbin/sshd -D #啟動(dòng)制作好的鏡像,并且默認(rèn)運(yùn)行的/bin/bash替換成/usr/sbin/sshd服務(wù)杭攻。并且將22端口暴露至宿主機(jī)22022端口


ssh 127.0.0.1 -p 22022 #遠(yuǎn)程連接至容器

yum install nginx #

echo "daemon off;" >> /etc/nginx/nginx.conf #以前臺(tái)方式運(yùn)行nginx

cat >> /root/bin/run.sh <<EOF

#!/bin/bash

/usr/sbin/sshd? && /usr/sbin/nginx?

EOF


docker commit 228e3e67e9d2 nginx:centos #將制作好的鏡像保存至nginx:centos鏡像



docker run --name nginx1 -p22022:22 -p 8080:80 -d nginx:centos /root/bin/run.sh #啟動(dòng)新建的容器祟敛。并且將端口暴露至宿主機(jī)端口


在宿主機(jī)之外連接容器成功


使用dockerfile文件建立


vim /root/Dockerfile

FROM ssh:centos????????????????????????????????????????????????????????????? ? ##FROM 從sshd:centos鏡像基礎(chǔ)上面創(chuàng)建

RUN yum install nginx? ?-y? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ##RUN 運(yùn)行shell命令? ? ? ? ? ? ? ? ?

ADD run.sh? /root/bin/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?##ADD 相當(dāng)于cp的動(dòng)能將run.sh放置在目標(biāo)目錄/root/bin下但run.sh腳本必須在dockerfile文件的父目錄中,

WORKDIR /root/bin/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?##WORKDIR? 這個(gè)相當(dāng)于cd命令????

RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf? ?&& chmod 755 /usr/local/sbin/run.sh????? ? ##修改配置文件以非守護(hù)進(jìn)程啟動(dòng)修改腳本權(quán)限

EXPOSE 80? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 開放80 22 端口

EXPOSE 22

CMD ["/usr/local/sbin/run.sh"]????????????????????????? ? ##CMD是要運(yùn)行的命令兆解,一個(gè)Dockerfile里面只能有一個(gè)CMD垒棋,如果有好幾個(gè),那么只會(huì)運(yùn)行最后一個(gè) 如果以中括號(hào)括起來則表示不以shell -c方式運(yùn)行而獨(dú)立運(yùn)行


docker . build -t webdockerfile:centos #基于dockerfile文件構(gòu)建鏡像

docker run -d -p 12345:22 -p 9527:80? webdockerfile:centos /usr/local/sbin/run.sh ##啟動(dòng)鏡像

docker image save imagename -o name.tar#將制作好的鏡像變成打包文件

docker image load imagename.tar

4痪宰、簡述lvs-nat、lvs-dr畔裕、lvs-tun衣撬、lvs-fullnat優(yōu)點(diǎn)及使用場景

lvs :linux virtual server 在內(nèi)核中實(shí)現(xiàn)調(diào)度。

ipvs扮饶。內(nèi)核中實(shí)現(xiàn)調(diào)度功能的框架模塊 ipvsadmin屬于ipvs的管理端具练,負(fù)責(zé)生產(chǎn)規(guī)則發(fā)送給內(nèi)核ipvs處理

ipvs調(diào)度算法:靜態(tài)算法以及動(dòng)態(tài)算法

靜態(tài)算法:僅根據(jù)算法本身和請求報(bào)文特征進(jìn)行調(diào)度

rr算法:round-robin 輪詢算法,調(diào)度器將請求按照順序發(fā)往real server?

wrr算法:weighted rr 加權(quán)輪詢算法甜无,將服務(wù)器加權(quán)扛点,實(shí)現(xiàn)能者多勞的目的哥遮,性能好的機(jī)器權(quán)重高,分配的請求就多陵究。

sh:源地址哈希算法 將源ip地址做哈希眠饮,在對(duì)服務(wù)器數(shù)量去模,如果余出來的數(shù)字對(duì)應(yīng)服務(wù)器的號(hào)碼铜邮。則發(fā)往那臺(tái)服務(wù)器仪召,如果請求來自同一臺(tái)ip地址,則發(fā)往同一臺(tái)服務(wù)器松蒜,如果服務(wù)器有權(quán)重扔茅,則對(duì)權(quán)重取模,余幾則調(diào)度到第幾號(hào)服務(wù)器秸苗。

dh:目標(biāo)地址哈希算法召娜,對(duì)同一個(gè)地址的訪問則由同一臺(tái)服務(wù)器代理緩存。


動(dòng)態(tài)算法:根據(jù)算法本身和請求報(bào)文特征惊楼,還要考慮后端real server的負(fù)載狀態(tài)進(jìn)行調(diào)度

lc:least connections 最少連接算法玖瘸,后端服務(wù)器誰的連接最少則調(diào)度給誰

weighted lc:wlc加權(quán)最少連接。 對(duì)服務(wù)器加權(quán)胁后。負(fù)債計(jì)算后對(duì)權(quán)重取模店读,權(quán)重大的負(fù)載少


LVS類型:NAT類型,DR類型,TUN類型悼嫉,F(xiàn)ULLNAT類型

NAT:基于NAT(多目標(biāo)DNAT)方式調(diào)度步咪,通過修改請求報(bào)文的目標(biāo)ip和端口為調(diào)度算法挑選出的某后端的RS的real server ip和port;

調(diào)度器一塊網(wǎng)卡面向公網(wǎng)接受請求殖演,一塊網(wǎng)卡轉(zhuǎn)發(fā)請求至私網(wǎng)的后端服務(wù)器,且在同一網(wǎng)段

real 服務(wù)器網(wǎng)關(guān)要指向調(diào)度器的私有網(wǎng)卡ip

多目標(biāo)IP的DNAT年鸳,通過將請求報(bào)文中的目標(biāo)地址和目標(biāo)端口修改為某挑出的RS的RIP和PORT實(shí)現(xiàn)轉(zhuǎn)發(fā)趴久;

(1)RIP和DIP必須在同一個(gè)IP網(wǎng)絡(luò),且應(yīng)該使用私網(wǎng)地址搔确;RS的網(wǎng)關(guān)要指向DIP彼棍;

(2)請求報(bào)文和響應(yīng)報(bào)文都必須經(jīng)由調(diào)度器轉(zhuǎn)發(fā);調(diào)度器易于成為系統(tǒng)瓶頸膳算;

(3)支持端口映射座硕,可修改請求報(bào)文的目標(biāo)PORT;

(4)vs必須是Linux系統(tǒng)涕蜂,rs可以是任意系統(tǒng)华匾;


vip=調(diào)度器公網(wǎng)ip,dip=調(diào)度器私網(wǎng)ip机隙,rip=后端服務(wù)器ip蜘拉,cip=客戶端ip

DR:報(bào)文首部不變萨西,在原ip報(bào)文外封裝一層以太網(wǎng)幀守護(hù)(源MAC,目標(biāo)MAC)完成調(diào)度,有調(diào)度算法挑選出的后端服務(wù)器ip的mac地址旭旭;所以必須在同一個(gè)以太網(wǎng)中谎脯。

Direct Routing,直接路由您机;

通過為請求報(bào)文重新封裝一個(gè)MAC首部進(jìn)行轉(zhuǎn)發(fā)穿肄,源MAC是DIP所在的接口的MAC,目標(biāo)MAC是某挑選出的RS的RIP所在接口的MAC地址际看;源IP/PORT咸产,以及目標(biāo)IP/PORT均保持不變;

Director和各RS都得配置使用VIP仲闽;

(1) 確保前端路由器將目標(biāo)IP為VIP的請求報(bào)文發(fā)往Director:

(a) 在前端網(wǎng)關(guān)做靜態(tài)綁定脑溢;

(b) 在RS上使用arptables;

(c) 在RS上修改內(nèi)核參數(shù)以限制arp通告及應(yīng)答級(jí)別赖欣;

arp_announce

arp_ignore

(2) RS的RIP可以使用私網(wǎng)地址屑彻,也可以是公網(wǎng)地址;RIP與DIP在同一IP網(wǎng)絡(luò)顶吮;RIP的網(wǎng)關(guān)不能指向DIP社牲,以確保響應(yīng)報(bào)文不會(huì)經(jīng)由Director;

(3) RS跟Director要在同一個(gè)物理網(wǎng)絡(luò)悴了;

(4) 請求報(bào)文要經(jīng)由Director搏恤,但響應(yīng)不能經(jīng)由Director,而是由RS直接發(fā)往Client湃交;

(5) 不支持端口映射熟空;


TUN:在源ip報(bào)文之外再封裝一個(gè)新IP首部,用ip報(bào)文發(fā)另外一個(gè)ip報(bào)文搞莺。新報(bào)文中源ip為調(diào)度器ip目標(biāo)ip則為real ip息罗。可以實(shí)現(xiàn)異地調(diào)度

lvs-tun:

轉(zhuǎn)發(fā)方式:不修改請求報(bào)文的IP首部(源IP為CIP才沧,目標(biāo)IP為VIP)迈喉,而是在原IP報(bào)文之外再封裝一個(gè)IP首部(源IP是DIP,目標(biāo)IP是RIP)温圆,將報(bào)文發(fā)往挑選出的目標(biāo)RS挨摸;RS直接響應(yīng)給客戶端(源IP是VIP,目標(biāo)IP是CIP)捌木;

(1) DIP, VIP, RIP都應(yīng)該是公網(wǎng)地址;

(2) RS的網(wǎng)關(guān)不能嫉戚,也不可能指向DIP刨裆;

(3) 請求報(bào)文要經(jīng)由Director澈圈,但響應(yīng)不能經(jīng)由Director;

(4) 不支持端口映射帆啃;

(5) RS的OS得支持隧道功能瞬女;



FULLNAT:通過修改請求報(bào)文的源ip(客戶ip到調(diào)度ip)和目標(biāo)ip(調(diào)度ip和real ip)完成調(diào)度

通過同時(shí)修改請求報(bào)文的源IP地址和目標(biāo)IP地址進(jìn)行轉(zhuǎn)發(fā);

CIP <--> DIP

VIP <--> RIP

(1) VIP是公網(wǎng)地址努潘,RIP和DIP是私網(wǎng)地址诽偷,且通常不在同一IP網(wǎng)絡(luò);因此疯坤,RIP的網(wǎng)關(guān)一般不會(huì)指向DIP报慕;

(2) RS收到的請求報(bào)文源地址是DIP,因此压怠,只能響應(yīng)給DIP眠冈;但Director還要將其發(fā)往Client;

(3) 請求和響應(yīng)報(bào)文都經(jīng)由Director菌瘫;

(4) 支持端口映射蜗顽;

注意:此類型默認(rèn)不支持;

5雨让、實(shí)現(xiàn)LVS-DT模型的集群雇盖,并采用加權(quán)輪詢的算法?

實(shí)現(xiàn)nat模型

安裝ip_vs的前端管理工具 ipvsadm

yum install ipvsadm

##################################################################

ipvsadm命令:

核心功能:

集群服務(wù)管理:增、刪栖忠、改崔挖;

集群服務(wù)的RS管理:增、刪娃闲、改虚汛;

查看:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

ipvsadm -D -t|u|f service-address

ipvsadm -C

ipvsadm -R

ipvsadm -S [-n]

ipvsadm -a|e -t|u|f service-address -r server-address [options]

ipvsadm -d -t|u|f service-address -r server-address

ipvsadm -L|l [options]

ipvsadm -Z [-t|u|f service-address]

管理集群服務(wù):增、改皇帮、刪卷哩;

增、改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

刪:

ipvsadm -D -t|u|f service-address

service-address:

-t|u|f:

-t: TCP協(xié)議的端口属拾,VIP:TCP_PORT

-u: UDP協(xié)議的端口将谊,VIP:UDP_PORT

-f:firewall MARK,是一個(gè)數(shù)字渐白;

[-s scheduler]:指定集群的調(diào)度算法尊浓,默認(rèn)為wlc;

管理集群上的RS:增纯衍、改栋齿、刪;

增、改:

ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

刪:

ipvsadm -d -t|u|f service-address -r server-address

server-address:

rip[:port]

選項(xiàng):

lvs類型:

-g: gateway, dr類型

-i: ipip, tun類型

-m: masquerade, nat類型

-w weight:權(quán)重瓦堵;

清空定義的所有內(nèi)容:

ipvsadm -C

查看:

ipvsadm -L|l [options]

--numeric, -n:numeric output of addresses and ports

--exact:expand numbers (display exact values)

--connection基协, -c:output of current IPVS connections

--stats:output of statistics information

--rate :output of rate information

保存和重載:

ipvsadm -S = ipvsadm-save

ipvsadm -R = ipvsadm-restore

#########################################################################

使用docker容器做后端real server 用宿主機(jī)當(dāng)調(diào)度器實(shí)現(xiàn)nat

docker image pull busybox #使用busybox鏡像,內(nèi)置有http進(jìn)程

docker run --name rs1 -it --network bridge -v /vols/rs1:/data/web/html busybox #啟動(dòng)容器綁定掛載卷菇用,如果路徑不存在則會(huì)自動(dòng)創(chuàng)建

echo hello world rs1 > /vols/rs1/index.html #創(chuàng)建測試頁面

httpd -h /data/web/html/ # 在容器內(nèi)啟動(dòng)httpd服務(wù)澜驮。


docker run --name rs2 -it --network bridge -v /vols/rs2/:/data/web/html busybox? #啟動(dòng)第二個(gè)容器,并且創(chuàng)建測試頁面

echo hello world rs2 > /vols/rs1/index.html #創(chuàng)建測試頁面

httpd -h /data/web/html/ #在容器中啟動(dòng)httpd服務(wù)


宿主機(jī)訪問成功



默認(rèn)開啟docker之后在iptables規(guī)則中禁止轉(zhuǎn)發(fā)惋鸥,為了避免轉(zhuǎn)發(fā)至后端服務(wù)器失敗杂穷,需要設(shè)置一下docker.server文件加入ExecStart=/usr/sbin/iptables -P FORWARD ACCEPT 一行表示啟動(dòng)docker時(shí)開啟FORWARD轉(zhuǎn)發(fā)功能

iptables -P FORWARD ACCEPT #手動(dòng)啟動(dòng)一下轉(zhuǎn)發(fā)


ipvsadm -A -t 192.168.1.196:80 -s wrr #定義集群服務(wù)。-t表示tcp卦绣。將自己的ip作為對(duì)外提供服務(wù)耐量。-s指定算法

[root@centos7 ~]# ipvsadm -L -n #查看集群服務(wù)

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

? -> RemoteAddress:Port? ? ? ? ? Forward Weight ActiveConn InActConn

TCP? 192.168.1.196:80 wrr


ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.2:80 -m -w 1 #向集群192.168.1.196服務(wù)中添加后端第一臺(tái)real server 172.17.0.2并且指定端口,-m表示nat類型-g表示dr-i表示tun隧道迎卤,-w指定權(quán)重為1

ipvsadm -a -t 192.168.1.196:80 -r 172.17.0.3:80 -m -w 1



如訪問不了需要打開核心轉(zhuǎn)發(fā)echo 1 > /proc/sys/net/ipv4/ip_forward



dr類型

使用兩臺(tái)虛擬機(jī)real server 地址為192.168.1.0與調(diào)度器在同以網(wǎng)段

yum install httpd -y?

echo hello world rs1/2 >> /var/www/html/index.html

systemctl restart htt

fconfig ens32:0 172.17.0.10 netmask 255.255.255.255 broadcast 172.17.0.10 up #在調(diào)度器上配置一個(gè)供客戶端訪問的vip地址拴鸵,設(shè)置廣播地址為本機(jī)


#!/bin/bash 寫腳本配置網(wǎng)卡信息及arp的報(bào)文的回應(yīng)參數(shù)

vip=172.17.0.70

mask=255.255.255.255

interface="lo:0"

case $1 in

start)

? ? ? ? echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

? ? ? ? echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

? ? ? ? echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

? ? ? ? echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

? ? ? ? systemctl stop firewalld

? ? ? ? ifconfig $interface $vip netmask $mask $vip up

? ? ? ? route add -host $vip dev lo:0

? ? ? ? ;;

stop)

? ? ? ? ifconfig $interface down

? ? ? ? echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

? ? ? ? echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

? ? ? ? echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

? ? ? ? echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

? ? ? ? ;;

*)

? ? ? ? echo "arg error"

? ? ? ? ;;

esac

[root@centos7 ~]# ipvsadm -A -t 172.17.0.10:80 -s wrr #在調(diào)度機(jī)器上設(shè)置集群

[root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.196 -g -w 2 #將后端機(jī)器加入集群

[root@centos7 ~]# ipvsadm -a -t 172.17.0.10:80 -r 192.168.1.197 -g -w 1

[root@centos7 ~]# ipvsadm -Ln

搭建完成





ipvsadm -E -t 172.17.0.10:80 -s sh 修改集群算法為長連接算法sh






6、利用LVS-FW方式實(shí)現(xiàn)LVS的affinity應(yīng)用


防火墻標(biāo)記:可將后端提供的服務(wù)打一個(gè)標(biāo)簽蜗搔,按標(biāo)簽來調(diào)度請求劲藐。

在兩臺(tái)real server中 定義一個(gè)虛擬主機(jī)

?vim /etc/httpd/conf.d/myhost.conf

? ? Listen 8080

? ? <VirtualHost *:80>

? ? ServerName 192.168.1.196

? ? DocumentRoot "/var/www/html"

? ? <Directory "/var/www1/html">

? ? ? ? Options none

? ? ? ? AllowOverride none

? ? ? ? Require all granted

? ? ? ? </Directory>

</VirtualHost>

? <VirtualHost *:8080>

ServerName 192.168.1.196

DocumentRoot "/var/www2/html"

Options none

AllowOverride none

Require all granted

? ? ? ? </Directory>

</VirtualHost>

mkdir -pv /www{1,2}/html? #創(chuàng)建網(wǎng)頁文件目錄

echo hello worl 80 >? /www1/html/index.html

echo hello worl 8080 >? /www2/html/index.html

scp ?/etc/httpd/conf.d/myhost.conf 192.168.1.197:/httpd/conf.d/myhost.conf #拷貝至另一臺(tái)real server 中修改配置文件虛擬主機(jī)地址為192.168.1.197

iptables -t -mangle -A? PREROUTING -d 172.17.0.10 -p tcp? -m multiport --dports 80,8080 -j MARK 7 #將請求至調(diào)度器的80樟凄,8080端口標(biāo)記為7號(hào)標(biāo)簽

ipvsadm -A -f 7 -s wrr #添加標(biāo)記7為集群地址

ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 #將后端地址添加至7號(hào)標(biāo)簽地址

ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1

搭建完成

redis統(tǒng)一訪問

yum install redis

vim /etc/redis.conf

bind 0.0.0.0? #修改redis的配置文件修改ip地址監(jiān)聽所有端口

ipvsadm -A -t 172.17.0.10:0 -s wrr -p? 定義0號(hào)端口聘芜。客戶端訪問80或者6379或者其他端口則會(huì)被調(diào)度到后端對(duì)應(yīng)提供端口的服務(wù)

ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.196 -g -w 1

ipvsadm -a -t 172.18.0.70:0 -r 192.168.1.197 -g -w 1



定義兩組集群缝龄,一組訪問80以及8080使用長連接連接web服務(wù)

一組集群定義固定訪問redis

ipvsadm -E -f 7 -s wrr -p 1200 定義防火墻標(biāo)記汰现,持久連接1200秒?

ipvsadm -a -f 7 -r 192.168.1.196 -g -w 1 將real server 加入標(biāo)簽7

ipvsadm -a -f 7 -r 192.168.1.197 -g -w 1


ipvsadm -A -t 172.17.0.10:6379 -s wrr 另一組集群訪問6379則會(huì)使用短連接訪問redis

ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.196 -g -w 1

ipvsadm -a -t 172.168.0.10:6379 -r 192.168.1.197 -g -w 1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叔壤,隨后出現(xiàn)的幾起案子瞎饲,更是在濱河造成了極大的恐慌,老刑警劉巖炼绘,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗅战,死亡現(xiàn)場離奇詭異,居然都是意外死亡俺亮,警方通過查閱死者的電腦和手機(jī)驮捍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脚曾,“玉大人东且,你說我怎么就攤上這事”炯ィ” “怎么了珊泳?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鲁冯,是天一觀的道長。 經(jīng)常有香客問我色查,道長晓褪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任综慎,我火速辦了婚禮,結(jié)果婚禮上勤庐,老公的妹妹穿的比我還像新娘示惊。我一直安慰自己,他們只是感情好愉镰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布米罚。 她就那樣靜靜地躺著,像睡著了一般丈探。 火紅的嫁衣襯著肌膚如雪录择。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天碗降,我揣著相機(jī)與錄音隘竭,去河邊找鬼。 笑死讼渊,一個(gè)胖子當(dāng)著我的面吹牛动看,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爪幻,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菱皆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挨稿?” 一聲冷哼從身側(cè)響起仇轻,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奶甘,沒想到半個(gè)月后篷店,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甩十,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年船庇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣监。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸭轮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄霉,到底是詐尸還是另有隱情窃爷,我是刑警寧澤邑蒋,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站按厘,受9級(jí)特大地震影響医吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逮京,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一卿堂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懒棉,春花似錦草描、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妻导,卻和暖如春逛绵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔韭。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工术浪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寿酌。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓添吗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親份名。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碟联,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容