准备:Ubuntu20.04系统,已安装docker 目的:在docker容器中安装ubuntu,基于keepalived模拟主从热备 其他:需要centos安装请参考 🔗在docker的centos中安装keepalived |
一、安装过程
1、环境(确认下,不需要一致)
1.1 主机系统
命令
lsb_release -a
打印返回
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.1 LTS
Release: 20.04
Codename: focal
1.2 docker环境
命令
docker version
打印返回
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:08:01 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:08:01 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.25
GitCommit: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
2、安装ubuntu(有坑!当前测通了16.04版本)
2.1 拉取镜像
docker pull ubuntu:16.04
2.2 查看镜像
命令
docker images
打印返回
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 b6f507652425 2 years ago 135MB
3、启动ubuntu镜像
docker run -it -p 17080:80 --privileged -v /home/ca/linux:/mnt/software --name ubuntu-1 ubuntu:16.04 bash
Tip:建议添加 -v /home/ca/linux:/mnt/software,可与宿主机共享文件! |
4、安装依赖工具
# 先更新下包,不然有些东西下载不下来(apt和apt-get这里用到的都是一样的作用)
apt update
# ping命令工具包
apt -y install iputils-ping
# ip 命令工具包
apt -y install iproute2
# ifconfig命令工具包(可选,iproute2就够用,看习惯用ip addr还是ifconfig命令)
apt -y install net-tools
# vim编辑器
apt -y install vim
# ssh服务器(可选)
apt -y install openssh-server
Tip:如需要ssh连接到该ubuntu,参考 使用远程工具连接Linux系统 |
5、安装keepalived
5.1 方法一 使用apt直接安装(推荐!!!简单基本没坑)
5.1.1 下载安装
apt -y install keepalived
5.1.1 查看安装位置
whereis keepalived
打印返回
keepalived: /usr/sbin/keepalived /etc/keepalived /usr/share/man/man8/keepalived.8.gz
5.2 方法二 使用安装包安装
#下载安装包
wget http://www.keepalived.org/software/keepalived-2.2.7.tar.gz
# 也可以直接cp一个下载好的安装包,从目录挂载下
cp /home/ca/linux/keepalived-2.2.7.tar.gz /home
# 解压缩
tar xvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
# 设置编译位置
./configure --prefix=/usr/local/keepalived --sysconf=/etc
# 下载make
apt install make
# 编译安装
make && make install
5.3 配置keepalived.conf
5.3.1 先查看网卡信息
命令
ip addr
或
ifconfig
打印返回(看到网卡eth0,虚ip需要配置在这上)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
5.3.2 配置keepalived.conf
vim /etc/keepalived/keepalived.conf
内容如下
! Configuration File for keepalived
global_defs {
#路由id:当前安装keepalived节点主机的标识符,全局唯一
router_id keep_131
}
vrrp_instance VI_1 {
# 表示的状态,当前的131服务器为nginx的主节点,MASTER/BACKUP
state MASTER
# 当前实例绑定的网卡(根据自己实际网卡配置)
interface eth0
# 保证主备节点一致
virtual_router_id 51
# 优先级/权重,谁的优先级高,在MASTER挂掉以后,就能成为MASTER
priority 100
# 主备之间同步检查的时间间隔,默认1s
advert_int 1
# 认证授权的密码,防止非法节点的进入
authentication {
auth_type PASS
auth_pass 1111
}
# 虚ip地址(vip),实现ip漂移的地址(根据自己需求配置)
virtual_ipaddress {
192.168.10.100
}
}
6、启动keepalived服务
service keepalived start
或
# 一般容器中的系统没有权限使用systemctl(不推荐或不能用)
systemctl start keepalived.service
或
# 推荐使用该命令
keepalived -l -f /etc/keepalived/keepalived.conf
Tip:不管当前在什么路径下,写完整路径(绝对路径)即: /etc/keepalived/keepalived.conf,关联配置文件!否则找不到。 |
打印返回(成功了!)
Starting Keepalived v1.2.24 (02/14,2019)
Keepalived[3214]: Starting Keepalived v1.2.24 (02/14,2019)
Opening file '/etc/keepalived/keepalived.conf'.
Keepalived[3214]: Opening file '/etc/keepalived/keepalived.conf'.
Keepalived[3215]: Starting Healthcheck child process, pid=3216
Keepalived_healthcheckers[3216]: Initializing ipvs
Keepalived[3215]: Starting VRRP child process, pid=3217
Keepalived_vrrp[3217]: Registering Kernel netlink reflector
Keepalived_vrrp[3217]: Registering Kernel netlink command channel
Keepalived_vrrp[3217]: Registering gratuitous ARP shared channel
Keepalived_vrrp[3217]: Unable to load ipset library
Keepalived_vrrp[3217]: Unable to initialise ipsets
Keepalived_vrrp[3217]: Opening file '/etc/keepalived/keepalived.conf'.
Keepalived_vrrp[3217]: Using LinkWatch kernel netlink reflector...
Keepalived_vrrp[3217]: VRRP_Instance(VI_1) Entering MASTER STATE
7、查看keepalived服务
7.1 查看运行状态
systemctl管理查看
systemctl status keepalived.service
或直接查看进程
ps -ef|grep keepalived
打印返回如下:
root 1319 1 0 Nov28 ? 00:00:00 keepalived -l -f /etc/keepalived/keepalived.conf
root 1320 1319 0 Nov28 ? 00:00:18 keepalived -l -f /etc/keepalived/keepalived.conf
root 1806 1 0 05:50 pts/0 00:00:00 grep --color=auto keepalived
7.2 查看ip挂载情况
命令
ip addr
打印返回,可以看到192.168.10.100的IP已经成功挂载
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global eth0
valid_lft forever preferred_lft forever
8、关闭keepalived服务
service keepalived stop
或杀死keepalived相关进程
pkill keepalived
二、一些问题?
1、keepalived安装问题
输入命令apt -y install keepalived
后打印如下,下载不了
Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package keepalived |
原因: docker拉取的镜像启动后,先更新软件库缓存 |
解决办法
apt update
再执行安装命令 apt -y install keepalived
2、keepalived启动问题
问题重现
Can't open PID file /var/run/keepalived.pid (yet?) after start: No such file or directory Failed to start LVS and VRRP High Availability Monitor. |
解决方法
chmod 644 /etc/keepalived/keepalived.conf
3、关于systemctl命令执行问题
问题重现
Failed to connect to bus: No such file or directory |
原因: 提示是连不上bus,也就是说无法挂载 dbus,但即使挂载上dbus依旧会报错(已测试) 容器里面是没有 systemd 进程的,所以不能正常开启 systemctl ,docker只是提供了进程隔离。 解决方法: 可以安装一个systemctl来替换,参考知乎网友给出的具体的解释和方法 🔗如何在 Docker 容器中使用 systemctl |
4、关于ifconfig不显示keepalived虚拟ip挂载问题
4.1 执行ip addr
命令打印返回
root@32a9780c118c:/etc/keepalived# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.10.100/32 scope global eth0
valid_lft forever preferred_lft forever
4.2 执行ifconfig
命令打印返回
root@32a9780c118c:/etc/keepalived# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:03
inet addr:172.17.0.6 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30455 errors:0 dropped:0 overruns:0 frame:0
TX packets:42295 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:78111330 (78.1 MB) TX bytes:2339216 (2.3 MB)
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:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:336 (336.0 B) TX bytes:336 (336.0 B)
原因: 未知,但iproute2是更新的版本,且真实显示了挂载的vip,实验可用, 以ip addr 显示为准 待求知??? |