"三剑客”之Swarm探索应用集群服务发布

1.前言

在前两篇文章中,大家了解了swarm集群的管理、数据的持久化等技术点。大家可能会问,我会了这些有啥用?公司的业务大多数是跑在nginx、tomcat、php等这些集群应用中,技术是死的,思路是活的。在本文中我们来通过相关案例一起去探索这些应用集群的服务是如何发布的。

2.环境

本文的环境还是沿用上次的swarm集群环境,不过这一次多增加一台nginx服务器,用4台服务器来演示。如果你没有这么多服务器,可以把其中一台agent节点替换成nginx服务器也一样。并且在swarm集群中创建3个nginx副本来演示,你也可以创建tomcat或php副本都一样。

服务器 角色 运行服务 系统版本
172.18.18.32 Manager docker 17.12.0-ce、swarm创建nginx副本 centos7.4 x64
172.18.18.33 agent01 docker 17.12.0-ce 、swarm创建nginx副本 centos7.4 x64
172.18.18.34 agent02 docker 17.12.0-ce 、swarm创建nginx副本 centos7.4 x64
172.18.18.90 nginx 源码安装nginx centos7.4 x64

3.案例演示nginx集群副本

在上文中描述了,我们会在swarm集群中创建3个nginx副本来进行演示。(副本你也可以理解成容器的意思,在docker中称作容器、swarm和k8s中称为副本),笔者画了一张简易的架构图,我们先通过下图的信息来了解一下本文的案例演示:

?本次案例是通过访问nginx服务器 172.18.18.90负载到swarm集群中的3个nginx副本中(172.18.18.32/33/34)。当我们创建swarm集群时,在swarm所有的集群节点中会自动创建ingress网络,swarm模式内置DNS组件,自动为每个服务分配DNS记录,然后服务的DNS名称在集群内的服务直接分发请求。Ingress网络会自动分配一个虚拟IP(VIP),在DNS解析时返回VIP,到达VIP的流量将自动发送(IPVS)该服务的任务,也就是下发到副本中(容器中)。

?上图中,Ingress网络分配的虚拟IP网段为(10.255.0.0/16),VIP为(10.255.0.1/2/3),其余3个副本分配的IP为(10.255.0.16/17/18)。由此可以得出访问顺序是这样的:

客户端请求 >>> nginx服务器 >>> swarm集群宿节点 >>> VIP >>> IPVS >>> nginx副本

3.1 部署nginx服务器

nginx部署安装不是本文的重点,笔者就用源码包简易安装来达到本文的实验目的。
1、下载并解压nginx:
你可以用docker的镜像运行nginx、也可以用源码包编译安装nginx。在本文中nginx用源码包的方式安装

[[email protected] /]# cd /usr/src/
[[email protected] src /]# tar -zxvf nginx-1.12.1.tar.gz

2、编译安装nginx:

[[email protected] src]# yum -y install gcc gcc-c++ make openssl-devel pcre-devel
[[email protected] src]# cd nginx-1.12.1/
[[email protected] nginx-1.12.1]# ./configure --prefix=/usr/local/nginx   --with-http_stub_status_module --with-http_realip_module --with-pcre  --with-http_ssl_module
[[email protected] nginx-1.12.1]# make -j 2
[[email protected] nginx-1.12.1]# make install

3、配置nginx.conf,省略部分内容:

[[email protected] conf]# vim nginx.conf
  http {
    ...
    ...
    upstream swarm_nginx {
        server 172.18.18.32;
        server 172.18.18.33;
        server 172.18.18.34;
    }

    server {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://swarm_nginx;
        }
    }
...
...

4、启动nginx服务:

[[email protected] conf]# /usr/local/nginx/sbin/nginx 

3.2 swarm集群中创建nginx副本

1、在Manager节点上创建nginx副本

[[email protected] ~]#docker service create --replicas 3 --name web_nginx -p 80:80 nginx 

2、查看副本状态

[[email protected] ~]# docker service ps web_nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE         ERROR               PORTS
g0zkll6wasu7        web_nginx.1         nginx:latest        agent01             Running             Running 5 hours ago
o7dkinqaofla        web_nginx.2         nginx:latest        agnet02             Running             Running 5 hours ago
ko8t7stwm7qs        web_nginx.3         nginx:latest        Manager             Running  

3个nginx副本分别分配到了3台swarm集群中。

3、查看ingress网络

通过docker network ls可以看出,ingress属于overlay网络驱动,此驱动采用IETE标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式。

在Manager节点上查看ingress详细信息:

[[email protected] ~]# docker network inspect ingress
...
#下面可以看到ingress的网络,网关信息:
"Config": [
                {
                    "Subnet": "10.255.0.0/16",
                    "Gateway": "10.255.0.1"
                }
            ]

...
#下面这段可以看到Manager节点上nginx副本的IP和MAC等信息:
 "Containers": {
            "fac0f4270885e34f19c42932041c0259858ac181439ac576ad9022bec1ef3047": {
                "Name": "web_nginx.3.ko8t7stwm7qsi7l9346g6hvyn",
                "EndpointID": "5b22bd2419bfc245ce2a354e64aeb5166ceb31981edb463fb0d8a7c843835c7a",
                "MacAddress": "02:42:0a:ff:00:12",
                "IPv4Address": "10.255.0.16/16",

#下面这段内容可以看到哪些swarm节点在ingress网络中:
 "Peers": [
            {
                "Name": "24f08eb37fc4",
                "IP": "172.18.18.32"
            },
            {
                "Name": "cd12c6d569bf",
                "IP": "172.18.18.33"
            },
            {
                "Name": "41609535c963",
                "IP": "172.18.18.34"
            }
        ]
...

当然,你还可以通过“docker inspect 容器ID”命令查看副本分配的IP相关信息:

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
fac0f4270885        nginx:latest        "nginx -g ‘daemon of…"   5 hours ago         Up 5 hours          80/tcp              web_nginx.3.ko8t7stwm7qsi7l9346g6hvyn
[[email protected] ~]# docker inspect fac0f4270885

其它两个swarm集群节点不做演示查看了,大家可以看行在另外两台agent节点上查看IP相关信息。

3.3 访问测试

接下来,我们通过浏览器访问nginx服务器 http://172.18.18.90 进行验证测试,多刷新几次试试:

然后,在Manager节点上跟踪一下副本的日志:

[[email protected] ~]# docker service logs web_nginx  -f

通过日志跟踪,可以发现访问nginx服务器被分别负载到了swarm集群中的3个副本上了,这就说明了swarm副本的集群状态都是可用的。

4.案例演示tomcat集群副本

可能有些朋友看了有点晕,nginx负载到nginx副本,啥玩意啊。为了让大家能够更好的理解,我把swarm集群中的nginx副本换成tomcat副本进行演示:

1、在swarm中创建3个tomcat副本

[[email protected] ~]# docker service create --replicas 3 --name web_tomcat -p 8080:8080 tomcat
v12jxeo8cq0tialjezd0lvn7q
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged 

注意:我这里用的tomcat镜像为docker hub官方的,这个镜像比较大,所以这个步骤很长,建议大家先在每台swarm节点上提前docker pull tomcat。如果有私有镜像仓库就用私有仓库的镜像来测试。

2、查看tomcat副本状态:

[[email protected] ~]# docker service  ps web_tomcat
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
3i30jp0uee5d        web_tomcat.1        tomcat:latest       agent01             Running             Running about a minute ago
k6kz95io17al        web_tomcat.2        tomcat:latest       agnet02             Running             Running about a minute ago
rohntxnifnh3        web_tomcat.3        tomcat:latest       Manager             Running             Running 2 minutes ago   

也都很均匀的分配到了每个swarm集群节点上了。

3、配置nginx服务器:

[[email protected] conf]# vim nginx.conf
    upstream swarm_tomcat {
        server 172.18.18.32:8080;
        server 172.18.18.33:8080;
        server 172.18.18.34:8080;
    }

    server {
        listen 8080;
        server_name localhost;
        location / {
            proxy_pass http://swarm_tomcat;
        }
    }

重启下nginx:

[[email protected] conf]# ../sbin/nginx -s reload

4、验证访问
我们用浏览器访问nginx的8080端口测试一下:http://172.18.18.90:8080 ,也同样多刷新几次。

然后,在Manager节点跟踪tomcat副本的日志:

[[email protected] ~]# docker service  logs  web_tomcat  -f

你会发现跟踪tomcat的副本日志只是tomcat启动的日志,并没有访问的日志,需要进入副本里面查看tomcat的localhost_access_log日志。

5.案例演示自定义overlay网络

下面通过自己创建自定网络test_net、创建nginx副本test_nginx并加入test_net、创建busybox副本test_busy并加入test_net,然后通过ping测试两个副本是否相通。

1、创建自定义overlay网络test_net

[[email protected] ~]# docker network  create --driver overlay test_net
7zapi1r90xghatyetzg048eo6
[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
...
7zapi1r90xgh        test_net            overlay             swarm
...

2、创建nginx副本test_nginx

[[email protected] ~]# docker service create --name  test_nginx --replicas 1 --network test_net  nginx
0kn7kx6er0r2ijuffe6w4bwux
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged 

3、创建busybox副本test_busy

[[email protected] ~]# docker service  create --name test_busy --replicas 1 --network test_net busybox top
fiyi3jhnc9qhnthwo12doj5is
overall progress: 1 out of 1 tasks
1/1: running
verify: Service converged 

4、进入test_busy副本ping busy_nginx测试:

[[email protected] ~]# docker exec -it
test_busy.1.coypjdeytu4latnmrww8yswyr  web_nginx.3.lzbgset0cwlmwxzb71prr9q7q
[[email protected] ~]# docker exec -it test_busy.1.coypjdeytu4latnmrww8yswyr sh
/ # ping test_nginx
PING test_nginx (10.0.0.5): 56 data bytes
64 bytes from 10.0.0.5: seq=0 ttl=64 time=0.030 ms
64 bytes from 10.0.0.5: seq=1 ttl=64 time=0.033 ms
64 bytes from 10.0.0.5: seq=2 ttl=64 time=0.047 ms
64 bytes from 10.0.0.5: seq=3 ttl=64 time=0.046 ms
^C
--- test_nginx ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.030/0.039/0.047 ms

进入test_busy副本可以发现可以ping通test_nginx副本。

6、其它相关命令
#查看副本虚IP

[[email protected] ~]# docker service inspect  -f ‘{{json .Endpoint.VirtualIPs}}‘ test_nginx
[{"NetworkID":"7zapi1r90xghatyetzg048eo6","Addr":"10.0.0.5/24"}]

[[email protected] ~]# docker service inspect  -f ‘{{json .Endpoint.VirtualIPs}}‘ test_busy
[{"NetworkID":"7zapi1r90xghatyetzg048eo6","Addr":"10.0.0.7/24"}]

#还可以进入副本nslookup解析测试

[[email protected] ~]# docker exec -it test_busy.1.coypjdeytu4latnmrww8yswyr sh
/ # nslookup  test_nginx
Server:    127.0.0.11
Address 1: 127.0.0.11
Name:      test_nginx
Address 1: 10.0.0.5

/ # nslookup  test_busy
Server:    127.0.0.11
Address 1: 127.0.0.11
Name:      test_busy
Address 1: 10.0.0.7

6.案例演示端点模式dnsrr负载均衡

其实,当我们创建副本的时候,有1个参数是省略的 --endpoint-mode vip,也就是负载均衡的模式(dnsrr 和 vip),默认是vip模式的方式,下面我们用dnsrr模式来演示一下。

1、用busy镜像创建3个副本test_dnsrr,也把它加入test_net网络

[[email protected] ~]# docker service create --name test_dnsrr --replicas 3 --network test_net --endpoint-mode dnsrr busybox top
v574isy80agvurussrbl8htyx
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged 

2、查看一下test_dnsrr副本

[[email protected] ~]# docker service ps  test_dnsrr
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
uem1xiwnla5t        test_dnsrr.1        busybox:latest      Manager             Running             Running 29 seconds ago
wtje7pgstmeg        test_dnsrr.2        busybox:latest      agnet02             Running             Running 3 minutes ago
3xzanggatp4d        test_dnsrr.3        busybox:latest      agent01             Running             Running 2 minutes ago   

每个swarm节点都分配到了副本在运行。

3、进入test_dnsrr副本测试

[[email protected] ~]# docker exec -it test_dnsrr.1.uem1xiwnla5tbnh0kfcxr89xh sh
/ # nslookup  test_dnsrr
Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      test_dnsrr
Address 1: 10.0.0.14 test_dnsrr.3.3xzanggatp4d8e8hayz99ngyc.test_net
Address 2: 10.0.0.16 46c86efbd56b.test_net
Address 3: 10.0.0.15 0cd47777c912

进入副本,通过nslookup发现dnsrr模式生效 ,同时能解析到3个副本的IP地址。如果你用默认的VIP模式,只能解析当前的副本IP,大家可以在创建3个副本不配置dnsrr模式,然后进入其中一个副本用nslookup测试一下看看。

本章内容到此结束,喜欢我的文章,请点击最上方右角处的《关注》!!!

原文地址:http://blog.51cto.com/ganbing/2094866

时间: 2024-08-01 10:42:14

"三剑客”之Swarm探索应用集群服务发布的相关文章

Swarm搭建 Docker集群

一.环境准备 1.准备服务器如下: 172.19.230.69 node1 172.19.230.70 node2 172.19.230.64 node3 2.修改主机名: hostnamectl set-hostname node1 3.关闭防火墙 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动 4.修改docker监听端口 vi /lib/syste

集群服务LVS

LVS: LVS: linux Virtual Server 14:四层交换,四层路由: 根据请求报文的目标IP与port将其转发至后端主机集群的某一台主机(根据挑选算法): netfilter: PREROUTING-->INPUT PREROUTING-->FORWARW-->POSTROUTING OUTPUT-->POSTROUTING lvsL: ipvsadm/ipvs ipvsadm:用户空间的命令行工具,用于管理集群服务: ipvs:工作内核中netfilter I

Hazelcast集群服务(1)——Hazelcast介绍

Hazelcast是什么 "分布式"."集群服务"."网格式内存数据"."分布式缓存"."弹性可伸缩服务"--这些牛逼闪闪的名词拿到哪都是ITer装逼的不二之选.在Javaer的世界,有这样一个开源项目,只需要引入一个jar包.只需简单的配置和编码即可实现以上高端技能,他就是 Hazelcast. Hazelcast 是由Hazelcast公司(没错,这公司也叫Hazelcast!)开发和维护的开源产品,可

LVS负载均衡集群服务搭建详解(二)

lvs-nat模型构建 1.lvs-nat模型示意图 本次构建的lvs-nat模型的示意图如下,其中所有的服务器和测试客户端均使用VMware虚拟机模拟,所使用的CentOS 7 VS内核都支持ipvs功能,且安装ipvsadm控制书写lvs规则工具. RS端两台服务器为httpd服务器做请求的负载均衡. 注意: 1) 客户端可以使用Windows上的浏览器,会后缓存影响结果,所以采用CentOS上的curl命令请求http协议显示更加直观 2) DIP上不能配置iptables规则 2.VS网

LVS负载均衡集群服务搭建详解(一)

LVS概述 1.LVS:Linux Virtual Server 四层交换(路由):根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法): 不能够实现应用层的负载均衡 lvs(又称ipvs)是基于内核中的防火墙netfilter实现 2.lvs集群术语: vs:Virtual Server 虚拟服务,可称为Director.Dispatcher分发器.Balancer负载均衡器 rs:Real Server 真实服务器 CIP:Client IP 客户端IP

Linux下使用Apache的Httpd+Mod_jk+Tomcat搭建Web集群服务

Linux下使用Apache的Httpd+Mod_jk+Tomcat搭建Web集群服务 目的 ?? 使用多个tomcat服务器来对请求进行分流,防止单个服务器压力过重.这里为了简单,只使用两个tomcat. 软件 apache httpd-2.2.31(下载地址:https://httpd.apache.org/download.cgi) apache tomcat-7.0.69(下载地址:https://tomcat.apache.org/download-70.cgi) tomcat-con

使用Codis搭建redis集群服务

转(http://www.jianshu.com/p/f8e968e57863) 一. 应用场景 redis 作为数据结构存储引擎,有着很多优点 高性能单机引擎可以达到5-10W qps 数据结构全面,支持快速开发业务string,list,set,sorted set, hashes 问题: 存储容量受限单机最大容量即为单机内存最大容量 单机数据的持久化依赖aof和rdb机制,如果机器整个down掉,服务不可用 二. redis集群选型 正是由于单机redis引擎有着这样的问题,所以,基本每个

LVS负载均衡集群服务搭建详解

一.LVS概述 1.LVS:Linux Virtual Server 四层交换(路由):根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法): 不能够实现应用层的负载均衡 lvs(又称ipvs),基于内核中的netfilter实现: PREROUTING--> INPUT OUTPUT--> POSTROUTING PREROUTING--> FORWARD --> POSTROUTING 2.lvs集群术语: vs:Virtual  Serve

《搭建更新DNS集群服务》RHEL6

DNS服务器的更新: 一听就知道不止一台的DNS服务器,要是一台也用不着更新对吧?一般都是DNS集群. 一台DNS更新了,添加一条数据,下面的都要跟着它变. 主DNS服务器的配置 首先先配置DNS服务器信息同步,后面再配置更新DNS服务器: 1.  前面很简单: 安装bind软件包.修改named服务配置文件; Vim /etc/named.conf 2修改zone语句: also-notify     定义一个用于全局的域名服务器IP地址列表.无论何时,当一个新的域文件被调入系统,域名服务器都