高可用部署

优质
小牛编辑
137浏览
2023-12-01
介绍如何搭建云联壹云高可用环境。

高可用部署方案介绍

云联壹云 平台高可用至少需要3个及3个以上的节点组成高可用环境;高可用环境将会自动部署MINIO作为共享存储,MINIO默认挂载在其中一个节点,当该节点宕机后,将会自动挂载到其他的节点上。

3节点版

使用3个节点部署高可用环境时,需要在2个节点上部署数据库高可用以及 云联壹云 平台高可用,

该方案只能保证部署高可用的2个节点中的其中一个宕机而不影响平台的使用。

组网图

部署步骤

  • 准备2个VIP,其中1个用于数据库,另1个用于平台。
  • 分别在节点1、节点2上部署数据库高可用,步骤可参考附录-高可用数据库部署。
  • 在节点1、节点2上安装k8s Controlplane+Controller,并设置HA高可用,其中HA VIP设置为平台VIP;数据库IP为数据库VIP。
  • 在节点3上安装k8s Controlplane+Controller,但不启用HA高可用。

注意

默认数据库高可用的Keepalived服务监听网卡为节点本身的网卡(如eth0),但是若部署数据库的节点上安装了Host服务,此时需监听网卡br0,请修改数据库高可用Keepalived的配置文件,将监听网络修改为br0。

4节点版

使用4个节点部署高可用时,可以使用3个节点部署 云联壹云 平台高可用,另1个节点部署数据库。

该方案可以保证部署高可用的3个节点任意节点宕机,而不影响平台的正常使用。但是如果数据库节点宕机,则平台也不可用。

组网图

部署步骤

  • 准备1个VIP,作为平台的VIP。
  • 首先在1个节点上单独安装数据库。步骤可参考安装部署Mariadb数据库。
  • 在另外3个节点上安装k8s Controlplane+Controller,并设置HA高可用,其中HA VIP设置为平台VIP;数据库IP为数据库节点的IP地址。

5节点版

使用5个节点部署高可用时,可以使用3个节点部署 云联壹云 平台高可用,另外2个节点部署数据库。

该方案可以保证部署 云联壹云 平台高可用的3个节点,任意一个节点可以宕机,以及部署数据库的两个节点中的任意一个节点宕机。该方案的可靠性最强。

组网图

部署步骤

  • 准备2个VIP,其中1个用于数据库,另1个用于平台。
  • 分别在数据库节点1、数据库节点2上部署数据库高可用,步骤可参考附录-高可用数据库部署。
  • 在另外三台节点上安装k8s Controlplane+Controller,并设置HA高可用,其中HA VIP设置为平台VIP;数据库IP为数据库VIP。

典型配置举例

下面以4节点的方案介绍下如何在平台部署高可用环境。

组网图

组网说明

  • 三台节点都部署K8S Controlplane以及Controller&host组成Kubernetes高可用集群和 云联壹云 高可用集群。
  • 数据库节点单独部署,步骤可参考安装部署Mariadb数据库。
  • 所有节点可以访问外网,如节点不能访问外网,请联系技术人员获取帮助。

测试节点举例

角色IP地址说明
VIP10.127.190.100与节点处于同一网段的闲置IP,供外部访问
节点1-控制节点10.127.190.251First Node节点,K8S Controlplane节点个数满足1、3、5即可
节点2-控制节点10.127.190.245非First Node节点(K8s Controlplane+Onecloud Controller&host)
节点3-控制节点10.127.190.229非First Node节点(K8s Controlplane+Onecloud Controller&host)
数据库10.127.190.254数据库节点
节点4-计算节点……计算节点 (K8s Node + OneCloud Host)

注意

如果使用 云联壹云 平台上的虚拟机搭建 云联壹云 高可用环境,需要注意以下内容:

  • 在 云联壹云 上的虚拟机默认启用源/目标检查,所以VIP无法与其它节点连通,可以在web控制台关闭虚拟机的源/目标检查,或在First Node节点上通过climc命令关闭源/目标检查:

    $ climc server-modify-src-check --src-mac-check off 。
    
  • 请将VIP添加到预留IP中。

安装部署Mariadb数据库

安装启用Mariadb

$ MYSQL_PASSWD='your-sql-passwd'
# 安装 mariadb
$ yum install -y epel-release mariadb-server
$ systemctl enable --now mariadb

配置Mariadb

# 设置数据库root用户密码
$ mysqladmin -u root password "$MYSQL_PASSWD"
$ cat <<EOF >/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# skip domain name resolve
skip_name_resolve    #取消域名解析
# auto delete binlog older than 30 days
expire_logs_days=30    #设置binlog的超时时间为30天,超过30天的binglog自动删除
innodb_file_per_table=ON
max_connections = 300

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
EOF
# 开启 Mariadb 的远程访问
$ mysql -uroot -p$MYSQL_PASSWD \
  -e "GRANT ALL ON *.* to 'root'@'%' IDENTIFIED BY '$MYSQL_PASSWD' with grant option; FLUSH PRIVILEGES;"

重启服务

$ systemctl restart mariadb

控制节点部署

3.4版本后,控制节点的高可用部署仅需要在First Node节点上配置即可。

当在已安装CentOS的服务器上安装产品,需要确保服务器已已关闭selinux,且重启过服务器。若selinux未关闭,请按下面的步骤关闭selinux,并重启服务器。

# 关闭 selinux
$ setenforce  0
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

配置ssh免密登录

该步骤用于配置First Node节点免密登录其他控制节点。

# 生成First Node节点的ssh 秘钥 (如果已有 ~/.ssh/id_rsa.pub 则跳过此步骤)
$ ssh-keygen

# 将生成的 ~/.ssh/id_rsa.pub公钥拷贝到其他控制节点
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.127.190.245
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.127.190.229

# 验证在First Node节点上可以免密获取到其他控制节点的主机名
$ ssh root@10.127.190.245 "hostname"
$ ssh root@10.127.190.229 "hostname"

安装部署

该章节重点介绍First Node节点执行install脚本后的配置内容,前面挂载安装包以及执行脚本的过程可参考安装-安装方式介绍

  1. 在配置页面,勾选“High Availability”。

  2. 在High Availability Config中配置以下参数。

    • High Availability VIP:本例为10.127.190.100;
    • Using local registry:当节点不能连接外网时,必须勾选该项;建议不勾选该项。
    • High Availability Port:默认6443;
    • Controlplane IPs, seperated with comma or space:另外两个控制节点的IP地址,本例为“10.127.190.245 10.127.190.229”
    • Enable Controlplane Host Agent:启用后,另外两个控制节点也可以作为计算节点。本例勾选该项。
  3. 取消勾选“Install MySQL on Current host”,在Connect MySql中配置以下参数。

    • MySQL Host IP:数据库的IP地址或高可用数据库的VIP地址,本例为10.127.190.254。
    • MySQL Port Number:默认3306;
    • MySQL Username:数据库用户,默认为root用户,本例为root;
    • MySQL Password:数据库用户对应的密码,本例为123456;

  1. 开始安装,安装过程较长,请耐心等待,直到安装完成。

说明

  • 当服务器当前内核(uname -r用于查看内核版本)与产品要求“3.10.0-1062.4.3.el7.yn20191203.x86_64”不一致时,产品安装完成后将会自动重启。
  • 当服务器当前内核(uname -r用于查看内核版本)与产品要求“3.10.0-1062.4.3.el7.yn20191203.x86_64”一致时,则产品安装完成后不会自动重启。

配置使用kubectl命令

First Node节点默认支持使用kubectl命令,但是高可用环境中非First Node的控制节点无法直接使用kubectl命令,请通过以下命令配置:

$ mkdir -p $HOME/.kube 
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

计算节点部署

所有计算节点的配置相同。

配置项

  • First Node:不勾选;
    • Role of K8S:K8s Node ;
    • Roles:Host;
  • First Node IP:VIP地址,不是First Node节点的地址;
  • First Node Port:默认6443;
  • Join Token:为在First Node节点上使用ocadm token create获取的信息;

安装过程较长,请耐心等待,直到安装完成。

说明

  • 当服务器当前内核(uname -r用于查看内核版本)与产品要求“3.10.0-1062.4.3.el7.yn20191203.x86_64”不一致时,产品安装完成后将会自动重启。
  • 当服务器当前内核(uname -r用于查看内核版本)与产品要求“3.10.0-1062.4.3.el7.yn20191203.x86_64”一致时,则产品安装完成后不会自动重启。

访问高可用环境

在浏览器中输入https://VIP访问 云联壹云 高可用环境,进行初始化引导操作。

高可用环境升级

支持通过命令行升级。

  1. 管理员通过ssh工具以root用户远程登录到First Node节点。

  2. 将用户切换成非root用户,执行升级操作不可以用root用户,挂载高版本安装包并进行升级操作。

    # 安装过程会增加yunion用户
    $ su yunion   
    # 将高版本的DVD安装包挂载到mnt目录
    $ sudo mount -o loop Yunion-x86_64-DVD-3.x-x.iso /mnt 
    # 切换到/mnt/yunion目录 
    $ cd /mnt/yunion
    $ ./upgrade.sh   
    

附录

高可用数据库配置

如需要数据库高可用,则需要在现有组网图中再添加一个节点与原数据库节点互为主备,并提供与数据库节点同一网段的VIP供系统访问。数据库的高可用部署与 云联壹云 的高可用无关,需要用户手动部署数据库高可用。

请按照以下步骤分别从主节点和备节点上进行配置。

主节点配置

安装启用mariadb
$ yum install -y mariadb-server
$ systemctl enable --now mariadb
安全配置向导
$ mysql_secure_installation

 ... ...
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!
 ... ...
Remove anonymous users? [Y/n] y
 ... Success!
 ... ...
Disallow root login remotely? [Y/n] y
 ... Success!
 ... ...
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success! ... ...
Reload privilege tables now? [Y/n] y
 ... Success!
 ... ...
修改mariadb配置文件
$ cat <<EOF > /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# skip domain name resolve
skip_name_resolve		#取消域名解析
# auto delete binlog older than 30 days
expire_logs_days=30	   #设置binlog的超时时间为30天,超过30天的binglog自动删除
innodb_file_per_table=ON
max_connections = 300
 
server-id = 1
auto_increment_offset = 1
auto_increment_increment = 2
log-bin = mysql-bin
binlog-format = row
log-slave-updates
max_binlog_size = 1G
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
max_connections = 1000
max_connect_errors = 0
max_allowed_packet = 1G
slave-net-timeout=10
master-retry-count=0
 
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mariadb/slow-query.log
 
[mysql]
no-auto-rehash
 
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
 
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
EOF
重启服务
$ systemctl restart mariadb

备节点部署

安装启用mariadb
$ yum install -y mariadb-server
$ systemctl enable --now mariadb
安全配置向导
$ mysql_secure_installation

 ... ...
Change the root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!
 ... ...
Remove anonymous users? [Y/n] y
 ... Success!
 ... ...
Disallow root login remotely? [Y/n] y
 ... Success!
 ... ...
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success! ... ...
Reload privilege tables now? [Y/n] y
 ... Success!
 ... ...
修改mariadb配置文件
$ cat <<EOF > /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# skip domain name resolve
skip_name_resolve
# auto delete binlog older than 30 days
expire_logs_days=30
innodb_file_per_table=ON
max_connections = 300
 
server-id = 2
auto_increment_offset = 2
auto_increment_increment = 2
log-bin = mysql-bin
binlog-format = row
log-slave-updates
max_binlog_size = 1G
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
max_connections = 1000
max_connect_errors = 0
max_allowed_packet = 1G
slave-net-timeout=10
master-retry-count=0
 
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mariadb/slow-query.log
 
[mysql]
no-auto-rehash
 
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
 
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
EOF
重启服务
$ systemctl restart mariadb

将主节点数据库导入备节点

主节点配置

在主节点导出数据库并将其导入备节点。

# 此密码为上面设置的 Mariadb root 密码,为了方便,只读账号也使用此密码,该密码为后面使用安装包部署时的数据库密码
$ MYSQL_PASSWD='123456'
# 开启 Mariadb 的远程访问
$ mysql -uroot -p$MYSQL_PASSWD -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '$MYSQL_PASSWD' WITH GRANT OPTION;FLUSH PRIVILEGES"
# 创建只读账号
$ mysql -u root -p$MYSQL_PASSWD -e "GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY '$MYSQL_PASSWD';FLUSH PRIVILEGES"
# 示例是全新安装的 Mariadb ,还没有使用。如果是正在使用的数据库做主主复制,需要锁表后再导出数据
$ mysql -uroot -p$MYSQL_PASSWD -e "SHOW PROCESSLIST"
+----+------+-----------+------+---------+------+-------+------------------+----------+
| Id | User | Host      | db   | Command | Time | State | Info | Progress |
+----+------+-----------+------+---------+------+-------+------------------+----------+
|  4 | root | localhost | NULL | Query   |    0 | NULL  | SHOW PROCESSLIST |    0.000 |
+----+------+-----------+------+---------+------+-------+------------------+----------+
# 记录binlog日志文件名和position
$ mysql -u root -p$MYSQL_PASSWD -e "SHOW MASTER STATUS\G"
*************************** row ***************************File: mysql-bin.000001Position: 712
    Binlog_Do_DB:
Binlog_Ignore_DB:
# 导出全部数据
$ mysqldump --all-databases -p$MYSQL_PASSWD > alldb.db
# 拷贝 alldb.db 到备节点,db2为备节点名称也可以改为备节点的IP地址,如10.127.10.218
$ scp alldb.db db2:/root/

备节点配置

导入主节点导出的数据库

# 此密码为上面设置的 Mariadb root 密码
$ MYSQL_PASSWD='123456'
# 导入主节点导出的数据
$ mysql -u root -p$MYSQL_PASSWD < alldb.db
# 重载权限
$ mysql -u root -p$MYSQL_PASSWD -e "FLUSH PRIVILEGES"
# 记录binlog日志文件名和position
$ mysql -u root -p$MYSQL_PASSWD -e "SHOW MASTER STATUS\G"
*************************** row ***************************File: mysql-bin.000001Position: 506913
    Binlog_Do_DB:
Binlog_Ignore_DB:

主主复制

主节点配置

# 修改MASTER_HOST为备节点IP(例如:10.127.10.218),修改MASTER_LOG_FILE和MASTER_LOG_POS为上面备节点记录的信息,
$ mysql -u root -p$MYSQL_PASSWD -e "CHANGE MASTER TO MASTER_HOST='10.127.10.218',MASTER_USER='repl',MASTER_PASSWORD='$MYSQL_PASSWD',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=506913,MASTER_CONNECT_RETRY=2;START SLAVE"

备节点配置

# 修改MASTER_HOST为主节点IP(10.127.10.211),修改MASTER_LOG_FILE和MASTER_LOG_POS为上面主节点记录的信息
$ mysql -u root -p$MYSQL_PASSWD -e "CHANGE MASTER TO MASTER_HOST='10.127.10.211',MASTER_USER='repl',MASTER_PASSWORD='$MYSQL_PASSWD',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=712,MASTER_CONNECT_RETRY=2;START SLAVE"

验证同步状态

在两个节点上都执行以下命令。

$ mysql -u root -p$MYSQL_PASSWD -e "SHOW SLAVE STATUS\G" | grep RunningSlave_IO_Running: Yes   Slave_SQL_Running: Yes

部署配置Keepalived

Keepalived用于提供数据库VIP访问以及通过其自带的监控服务来实现节点故障后自动切换等。当数据库在控制节点上安装时,则省略该步骤。

设置环境变量

两个节点都需要配置。

# keepalived vip 地址
$ export DB_VIP=10.127.10.50
# keepalived auth toke
$ export DBHA_KA_AUTH=test
# keepalived network interface,请根据实际情况设置网卡名称,以eth0为例
$ export DB_NETIF=eth0

设置sysctl选项

两个节点都需要配置。

$ cat <<EOF >>/etc/sysctl.conf
net.ipv4.ip_forward = 1 #启用IP转发功能
net.ipv4.ip_nonlocal_bind = 1       #允许进程绑定到非本地地址
EOF
$ sysctl -p

安装Keepalived&nc

两个节点都需要配置。

$ yum install -y keepalived nc

设置Keepalived配置文件

主节点配置
$ cat <<EOF >/etc/keepalived/keepalived.conf
global_defs {
    router_id onecloud
}
  
vrrp_script chk_mysql {
    script "/etc/keepalived/chk_mysql"
    interval 1# 脚本执行间隔
}
  
vrrp_instance VI_1 {
    state MASTER #定义为master
    interface $DB_NETIF#承载漂移ip的网卡
    virtual_router_id 99#定义一个热备组,可以认为这是99号热备,主备的属于同一个热备组
    priority 100# 主服务器优先级要比备服务器高
    advert_int 1#1秒互相通告一次,检查对方死了没。
    authentication {auth_type PASS#认证类型auth_pass $DBHA_KA_AUTH#认证密码
    }  
    track_script {chk_mysql
    }
  
    virtual_ipaddress {$DB_VIP
    }
}
EOF
# 创建监控脚本文件
$ cat <<EOF > /etc/keepalived/chk_mysql
#!/bin/bash
echo | nc 127.0.0.1 3306 &>/dev/null
EOF
# 更改脚本文件权限 
$ chmod +x /etc/keepalived/chk_mysql
# 启动keepalived
$ systemctl enable --now keepalived
备节点配置
$ cat <<EOF >/etc/keepalived/keepalived.conf
global_defs {
    router_id onecloud
}
  
vrrp_script chk_mysql {
    script "/etc/keepalived/chk_mysql"
    interval 1# 脚本执行间隔
}
  
vrrp_instance VI_1 {
    state BACKUP#定义为backup节点
    interface $DB_NETIF#承载漂移ip的网卡
    virtual_router_id 99#定义一个热备组,可以认为这是99号热备,主备的属于同一个热备组
    priority 90	 # 主服务器优先级要比备服务器高
    advert_int 1#1秒互相通告一次,检查对方死了没。
    authentication {auth_type PASS	 #认证类型auth_pass $DBHA_KA_AUTH#认证密码
    }  
    track_script {chk_mysql
    }
  
    virtual_ipaddress {$DB_VIP
    }
}
EOF
# 创建监控脚本文件
$ cat <<EOF > /etc/keepalived/chk_mysql
#!/bin/bash
echo | nc 127.0.0.1 3306 &>/dev/null
EOF
# 更改脚本文件权限  
$ chmod +x /etc/keepalived/chk_mysql
# 启动keepalived
$ systemctl enable --now keepalived

验证Keepalived服务

分别在主备节点上查看监控网卡信息,可尝试将主节点上mariadb或Keepalived服务禁用或关机,查看主节点的VIP是否漂移到备节点。

# 查看节点的ip信息
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:22:50:dd:51:59 brd ff:ff:ff:ff:ff:ff
    inet 10.127.10.211/24 brd 10.127.10.255 scope global dynamic eth0
       valid_lft 100661107sec preferred_lft 100661107sec
    inet 10.127.10.50/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::222:50ff:fedd:5159/64 scope link 
       valid_lft forever preferred_lft forever