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)
docker container exec -it nginx1 /bin/sh? 連接至容器可以查看容器內(nèi)部運(yùn)行方式
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ò)
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端口
[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ī)端口
使用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ù)
默認(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