云原生|docker|基于docker部署高可用keepalived集群

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 云原生|docker|基于docker部署高可用keepalived集群

前言:

docker作为事实上的容器标准应该所有人都没有意见,即使kvm也应该不会有任何反对的意见吧。

keepalived+haproxy高负载均衡集群是常见的组合,也基本是一个负载均衡的标准了,但,keepalived并不是非常的友好,也就是说它的部署方式只有rpm/deb 或者源码编译部署这两种形式,也不知道是什么原因,keepalived官方并没有二进制部署方式。

由此,我们可以在多种复杂的环境下,例如,Ubuntu和linux混合的系统内部署一个我们自制的包含keepalived的镜像,比如,A服务器是Ubuntu的,B服务器是linux的,C服务器是麒麟的,D服务器是centos8的,E服务器是centos6的,这些统统不重要,重要的是我们只需要有一个能够运行docker的环境,在这个环境下运行我们自制的镜像就可以了。

简单来说,现在即使服务器是非常杂牌,比如,A是麒麟,B是centos6,C是debian 等等操作系统,我们基于docker环境,仍能搭建出一个稳定可用的集群。

那么,docker有一个理念是:一次构建,随处运行,通过这次的build示例,将这个理念是体现的非常好了。

本文将在cento7操作系统下利用dockerfile制作keepalived镜像,然后在服务器上组建一个简单的keepalived集群,也就是抛砖引玉吧。

附:

为什么不使用keepalived的官方docker镜像呢?

主要是keepalived的官方docker镜像存在诸多限制,镜像内有诸多的监测脚本限制了镜像的使用,比如,某些服务器不是平常的ens33网卡。其实主要这些官方镜像是用来做keepalived+lvs的负载均衡,没有自己build的镜像用途更广泛。

一,

dockerfile

说明:此此build是在有网的环境下进行,基于centos7的基本镜像,从keepalived的官网拉取源码包后,在容器内解压并编译keepalived。

这里要注意一点,keepalived的版本不能太高,否则centos7基本镜像会由于gcc的版本比较低而编译失败,从而无法build镜像。2.0.8这个版本是比较合适的。

这个dockerfile文件需要放置到一个空的目录下(我是放置到/media目录下的,这个目录没有其它文件,比较空),因为build的时候会读取同级目录和文件,一方面会造成build的镜像过大,一方面会降低build的效率。

build的时候做了适当的优化,run命令通过&&合并了,并在最后清除缓存层。

cat >Dockerfile <<EOF
FROM centos:7
RUN yum install -y wget && yum install -y gcc-c++ openssl-devel openssl && yum install -y net-tools&&wget http://www.keepalived.org/software/keepalived-2.0.8.tar.gz --no-check-certificate&& tar zxvf keepalived-2.0.8.tar.gz && cd keepalived-2.0.8 && ./configure && make && make install&&yum clean all
CMD ["keepalived", "-n","--all", "-d", "-D", "-f", "/etc/keepalived/keepalived.conf", "--log-console"]
EOF

build 命令:

新build的镜像名称为kp:v1.0

docker build -t kp:v1.0 .

build输出的部分日志:

从日志可以看到,优化是有效果的,Removing intermediate container 6f37152ebc2d

略略略
make[1]: Leaving directory `/keepalived-2.0.8'
Loaded plugins: fastestmirror, ovl
Cleaning repos: base extras updates
Cleaning up list of fastest mirrors
Removing intermediate container 957d916a624f
 ---> a531d31e8312
Step 3/3 : CMD ["keepalived", "-n","--all", "-d", "-D", "-f", "/etc/keepalived/keepalived.conf", "--log-console"]
 ---> Running in 6f37152ebc2d
Removing intermediate container 6f37152ebc2d
 ---> acfc159663e2
Successfully built acfc159663e2
Successfully tagged kp:v1.0

可以看到,centos基础镜像是200M,build后360M,是符合预期的。

[root@node3 media]# docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
kp                                                                v1.0                acfc159663e2        51 minutes ago      357MB

 

二,

运行镜像

运行镜像有多种方式,可以docker-compose编排运行,也可以直接docker run 的方式,本例使用docker run的方式直接运行镜像。

上述我们自己build的镜像由于主要的用途是跑keepalived服务,因此,需要hosts的形式,又由于服务正常运行时基于配置文件的,因此,我们首先需要编写一个keepalived服务的配置文件,最后,keepalived需要的网络权限是比较高的,因此,运行容器的时候需要加参数--cap-add NET_ADMIN。

首先,查看本机的网络情况:

可以看到,主网卡是ens33,IP地址是192.168.217.23

[root@node3 media]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:70:12:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.23/24 brd 192.168.217.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe70:1212/64 scope link 
       valid_lft forever preferred_lft forever

keepalived master的配置文件:

根据上面的网络情况编写的配置文件

cat  >/opt/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived
global_defs {
  router_id LVS_Master
}
vrrp_instance VI_1 {
    state MASTER              #指定instance初始状态,实际根据优先级决定.backup节点不一样
    interface ens33            #虚拟IP所在网
    virtual_router_id 51      #VRID,相同VRID为一个组,决定多播MAC地址
    priority 100              #优先级,另一台改为90.backup节点不一样
    advert_int 1              #检查间隔
    authentication {
        auth_type PASS        #认证方式,可以是pass或ha
        auth_pass 1111        #认证密码
    }
    virtual_ipaddress {
        192.168.217.100/16        #VIP地址
    }
}
EOF

验证:

查看vip

可以看到,有VIP了

[root@node3 media]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:70:12:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.23/24 brd 192.168.217.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.217.100/16 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe70:1212/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:55:fc:14:b8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:55ff:fefc:14b8/64 scope link 
       valid_lft forever preferred_lft forever



keepalived backup(备节点)

192.168.217.23上build的镜像传到192.168.217.24服务器上

在24服务器查看网络情况:

[root@node4 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:5b:a4:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.24/24 brd 192.168.217.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5b:a4eb/64 scope link 
       valid_lft forever preferred_lft forever

在24服务器编写keepalived的backup节点的配置文件:

cat >/opt/keepalived/keepalived.conf <<EOF
! Configuration File for keepalived
global_defs {
  router_id LVS_Backup
}
vrrp_instance VI_1 {
    state BACKUP         
    interface ens33       
    virtual_router_id 51
    priority 90         
    advert_int 1         
    authentication {
        auth_type PASS   
        auth_pass 1111   
    }
    virtual_ipaddress {
       192.168.217.100/16
    }
}
EOF

在24服务器启动镜像:

docker run -it --name kp_backup --net=host --cap-add NET_ADMIN -v /opt/keepalived/keepalived.conf:/etc/keepalived/keepalived.conf -d kp:v1.0

三,

测试

在23服务器上查看容器日志,截取部分如下:

可以看到23在master模式

docker logs kp_master
Keepalived_vrrp[7]: (VI_1) Entering MASTER STATE
Wed Dec  7 13:33:54 2022: (VI_1) setting VIPs.
Keepalived_vrrp[7]: (VI_1) setting VIPs.
Wed Dec  7 13:33:54 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:54 2022: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.217.100
Keepalived_vrrp[7]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.217.100
Wed Dec  7 13:33:54 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:54 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:54 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:54 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.217.100
Keepalived_vrrp[7]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100
Wed Dec  7 13:33:59 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[7]: Sending gratuitous ARP on ens33 for 192.168.217.100

在24服务器上查看容器日志,截取部分如下:

docker logs kp_backup
Wed Dec  7 13:47:13 2022:    HW Type = ETHERNET
Keepalived_vrrp[8]:    HW Type = ETHERNET
Wed Dec  7 13:47:13 2022:    NIC netlink status update
Keepalived_vrrp[8]:    NIC netlink status update
Wed Dec  7 13:47:13 2022:    Reset promote_secondaries counter 0
Keepalived_vrrp[8]:    Reset promote_secondaries counter 0
Wed Dec  7 13:47:13 2022:    Tracking VRRP instances = 0
Keepalived_vrrp[8]:    Tracking VRRP instances = 0
Wed Dec  7 13:47:13 2022: (VI_1) Entering BACKUP STATE (init)
Keepalived_vrrp[8]: (VI_1) Entering BACKUP STATE (init)
Wed Dec  7 13:47:13 2022: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(9,10)]
Keepalived_vrrp[8]: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(9,10)]

在24服务器上停止容器:

docker stop kp_master

在23服务器上查看vip是否漂移:

[root@node4 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:5b:a4:eb brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.24/24 brd 192.168.217.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.217.100/16 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe5b:a4eb/64 scope link 
       valid_lft forever preferred_lft forever

查看24服务器上的容器日志:

选举内容,可以看到backup变为了master

docker logs kp_backup
Wed Dec  7 14:02:11 2022: (VI_1) Backup received priority 0 advertisement
Keepalived_vrrp[8]: (VI_1) Backup received priority 0 advertisement
Wed Dec  7 14:02:11 2022: (VI_1) Receive advertisement timeout
Keepalived_vrrp[8]: (VI_1) Receive advertisement timeout
Wed Dec  7 14:02:11 2022: (VI_1) Entering MASTER STATE
Keepalived_vrrp[8]: (VI_1) Entering MASTER STATE
Wed Dec  7 14:02:11 2022: (VI_1) setting VIPs.
Keepalived_vrrp[8]: (VI_1) setting VIPs.
Wed Dec  7 14:02:11 2022: Sending gratuitous ARP on ens33 for 192.168.217.100
Keepalived_vrrp[8]: Sending gratuitous ARP on ens33 for 192.168.217.100

在启动23的容器,并查看容器日志:

docker start kp_master

23服务器的选举过程:

docker logs kp_master

Keepalived_vrrp[7]: (VI_1) Entering BACKUP STATE (init)
Wed Dec  7 14:06:16 2022: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(9,10)]
Keepalived_vrrp[7]: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(9,10)]
Wed Dec  7 14:06:16 2022: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Keepalived_vrrp[7]: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Wed Dec  7 14:06:17 2022: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Keepalived_vrrp[7]: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Wed Dec  7 14:06:18 2022: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Keepalived_vrrp[7]: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Wed Dec  7 14:06:19 2022: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Keepalived_vrrp[7]: (VI_1) received lower priority (90) advert from 192.168.217.24 - discarding
Wed Dec  7 14:06:20 2022: (VI_1) Receive advertisement timeout
Keepalived_vrrp[7]: (VI_1) Receive advertisement timeout
Wed Dec  7 14:06:20 2022: (VI_1) Entering MASTER STATE
Keepalived_vrrp[7]: (VI_1) Entering MASTER STATE
Wed Dec  7 14:06:20 2022: (VI_1) setting VIPs.
Keepalived_vrrp[7]: (VI_1) setting VIPs.

vip 又回来了

[root@node3 media]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000
    link/ether 00:0c:29:70:12:12 brd ff:ff:ff:ff:ff:ff
    inet 192.168.217.23/24 brd 192.168.217.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.217.100/16 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe70:1212/64 scope link 
       valid_lft forever preferred_lft forever

当然,24服务器的VIP是自己下掉了,证明此种方式搭建的keepalived没有脑裂的问题,完全可用。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
10天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
16天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
86 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
27天前
|
人工智能 缓存 异构计算
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
|
1月前
|
Java 应用服务中间件 Docker
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
将基于 Spring 的 WAR 应用程序部署到 Docker:详尽指南
38 2
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
敏捷开发 Kubernetes Cloud Native
阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理
在多云环境中,阿里云云原生技术为企业提供了一套高效、灵活的解决方案,支持跨云部署与管理。通过容器化、服务网格等技术,实现了应用的一致性与可移植性,简化了多云环境下的资源管理和服务治理,帮助企业应对复杂的云环境挑战,加速数字化转型。
54 5
|
2月前
|
Java Linux Docker
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
什么是 Docker?如何将 Spring Boot 应用程序部署到 Docker?
57 3
|
1月前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
1月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
2月前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
50 3

热门文章

最新文章