Rancher 2.2.2 - HA 部署高可用k8s集群

2023-11-07

对于生产环境,需以高可用的配置安装 Rancher,确保用户始终可以访问 Rancher Server。当安装在Kubernetes集群中时,Rancher将与集群的 etcd 集成,并利用Kubernetes 调度实现高可用。

为确保高可用,本文所部署的 Kubernetes 集群将专用于运行 Rancher ,Rancher 运行起来后,可再创建或导入集群以运行具体的工作负载。

一、推荐架构

  • Rancher的DNS 应解析到 4层(TCP) 负载均衡上。
  • 负载均衡应将端口 TCP/80 和 TCP/443 转发到 Kubernetes 集群中的所有3个节点。
  • Ingress-controller 将 HTTP 重定向到HTTPS并终止端口 TCP/443 上的 SSL/TLS(SSL数字证书在这里部署)。
  • Ingress-controller 将流量转发到 pod 的 TCP/80 端口。

下面是一张从官网拉过来的图片,更直观一些。

image

二、准备工作

1. 服务器准备

  1. 1台 Linux服务器,配置不用很高,用于四层负载均衡
  2. 3台 Linux服务器,Rancker-server-node 节点
  3. n台 Linux服务器,Rancker-agent-node 节点(n<=50)

节点服务器的硬件配置,可根据实际情况依据该表自行选择。

规模 集群 节点 CPU 内存
最多5个 高达50 2 8 GB
最多15个 最多200 4 16 GB
高达50 最多500个 8 32 GB
超大 最多100个 高达1000 32 128 GB
更大规模 100+ 1000+ 联系 Rancher 联系 Rancher

2.工具安装

这些工具软件将在部署过程中用到,需提前安装好,并确保通过 $PATH 变量可以找到。

安装 kubectl

这是一个 kubernetes 命令行工具,安装参考 K8S 官网

这里要注意的是,官网的安装过程是到谷歌云平台下载,这里我门修改下载链接为 RANCHER 提供的镜像地址。

# 下载目前最新版
wget https://www.cnrancher.com/download/kubernetes/linux-amd64-v1.14.1-kubectl
# 设置执行权限
chmod +x ./linux-amd64-v1.14.1-kubectl 
# 将其移动到 /usr/locak/bin/kubectl 
sudo mv ./linux-amd64-v1.14.1-kubectl /usr/local/bin/kubectl

安装 RKE

RKE 全称 Rancher Kubernetes Engine,是一个用于构建 kubernets 集群的命令行工具。网络原因,我们切换到 Rancher 提供的镜像地址下载安装

# 下载目前最新版
wget https://www.cnrancher.com/download/rke/v0.1.18-rke_linux-amd64
# 设置执行权限
chmod +x v0.1.18-rke_linux-amd64
# 将其移动到 /usr/locak/bin/kubectl 
sudo cp v0.1.18-rke_linux-amd64 /usr/local/bin/rke
# 验证安装
rke --version # rke version v0.1.18

安装 helm

helm 是Kubernetes的包管理器。Helm版本需高于 v2.12.1

# 网络原因,切换到 Rancher 提供的镜像连接
wget https://www.cnrancher.com/download/helm/helm-v2.13.1-linux-amd64.tar.gz
# 解压
tar -zxvf helm-v2.0.0-linux-amd64.tgz
# 移动到 /usr/local/bin/helm
mv linux-amd64/helm /usr/local/bin/helm

三、创建节点和负载均衡

这些节点须在同一个网络区域或数据中心。

1. 节点准备

操作系统

所有节点安装 ubuntu 18.04(64-bit x86)

网络要求
注意参考 官网放行相关端口。本文 ip 清单(仅用于演示):

NODE IP 备注
NODE-LB 公网 168.168.168.1 / 内网 10.0.0.1 四层负载均衡
NODE-SERVER 公网 168.168.168.6 / 内网 10.0.0.6 local 集群
NODE-SERVER 公网 168.168.168.7 / 内网 10.0.0.7 local 集群
NODE-SERVER 公网 168.168.168.8 / 内网 10.0.0.8 local 集群
NODE-WORKER 公网 168.168.168.16 / 内网 10.0.0.16 工作负载
NODE-WORKER 公网 168.168.168.17 / 内网 10.0.0.17 工作负载
NODE-WORKER 公网 168.168.168.18 / 内网 10.0.0.18 工作负载

docker-ce

并安装最新stable版 docker-ce:18.09.6

# 删除旧版本docker
sudo apt-get remove docker docker-engine docker.io containerd runc

# 更新 apt 
$ sudo apt-get update

# 安装工具包
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 添加Docker官方 GPG key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 添加 stable apt 源
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# 安装 Docker CE
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

# 将当前用户加入"docker"用户组,加入到该用户组的账号在随后安装过程会用到。用于节点访问的SSH用户必须是节点上docker组的成员:
$ sudo usermod -aG docker $USER

2. 配置四层负载均衡

RKE 将会在每个节点上配置一个 Ingress-controller pod,这个 pod 将绑定到该节点的 TCP/80 和 TCP/443 端口,作为 Rancher-server 的HTTPS流量入口点。

将负载均衡器配置为基本的第4层TCP转发器,这里采用 NGINX 作四层负载均衡。

*安装 Nginx

sudo apt-get install nginx
# /usr/sbin/nginx:主程序
# /etc/nginx:存放配置文件
# /usr/share/nginx:存放静态文件
# /var/log/nginx:存放日志

更新配置文件 /etc/nginx/nginx.conf

worker_processes 4;
worker_rlimit_nofile 40000;

events {
    worker_connections 8192;
}

stream {
    upstream rancher_servers_http {
        least_conn;
        server 10.0.0.6:80 max_fails=3 fail_timeout=5s;
        server 10.0.0.7:80 max_fails=3 fail_timeout=5s;
        server 10.0.0.8:80 max_fails=3 fail_timeout=5s;
    }
    server {
        listen     80;
        proxy_pass rancher_servers_http;
    }

    upstream rancher_servers_https {
        least_conn;
        server 10.0.0.6:443 max_fails=3 fail_timeout=5s;
        server 10.0.0.7:443 max_fails=3 fail_timeout=5s;
        server 10.0.0.8:443 max_fails=3 fail_timeout=5s;
    }
    
    server {
        listen     443;
        proxy_pass rancher_servers_https;
    }
}
注意:将local群集专用于Rancher。
勿将此负载均衡(即local群集Ingress)对 Rancher 以外的应用程序进行负载转发。

四、使用 RKE 安装 kubernetes

下面使用 RKE(Kubernetes Engine) 安装高可用的 Kubernetes。

1. NODE-SERVER 之间建立 ssh 信任

我们目前有三台服务器用作 local 集群,首先要确保我们主机能够通过 ssh 访问到另外两台主机并执行相关操作。比如执行 docker 命令,还记得前面我们加入 docker 用户组的用户吧。

# 根据需求配置相关信息生成 rsa 公钥密钥
ssh-keygen

# 复制当前主机上的公钥到另外两台上面,实现免密码登录
ssh-copy-id -i ~/.ssh/id_rsa.pub user@x.x.x.x

# 要注意这里也要跟自己注册注册一下 :ssh-copy-id -i ~/.ssh/id_rsa.pub user@本机ip

2. 编写 rancher-cluster.yml 文件

这里需要注意,这个文件没有明确配置rsa文件名,默认会使用 $HOME/.ssh/id_rsa 建立连接。内容如下

nodes:
  - address: 168.168.168.6
    internal_address: 10.0.0.6
    user: ubuntu
    role: [controlplane,worker,etcd]
  - address: 168.168.168.7
    internal_address: 10.0.0.7
    user: ubuntu
    role: [controlplane,worker,etcd]
  - address: 168.168.168.8
    internal_address: 10.0.0.8
    user: ubuntu
    role: [controlplane,worker,etcd]

services:
  etcd:
    snapshot: true
    creation: 6h
    retention: 24h

3. 运行 RKE 构建 kubernetes 集群

rke up --config ./rancher-cluster.yml
# 验证:返回类似下面的消息则说明执行成功,有问题欢迎留言交流。
# Finished building Kubernetes cluster successfully.

执行成功会在当前目录生成一个文件 kube_config_rancher-cluster.yml,将该文件复制到 .kube/kube_config_rancher-cluster.yml

或者

export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml

4. 测试集群

kubectl get nodes
# 返回下面信息说明集群创建成功
NAME           STATUS   ROLES                      AGE   VERSION
168.168.168.6   Ready    controlplane,etcd,worker   13m   v1.13.5
168.168.168.7   Ready    controlplane,etcd,worker   13m   v1.13.5
168.168.168.8   Ready    controlplane,etcd,worker   13m   v1.13.5

5. 保存好相关配置文件

当排除故障、升级群集时需要用到以下文件,请将其副本保存在一个安全的位置。

rancher-cluster.yml:RKE集群配置文件。
kube_config_rancher-cluster.yml:群集的Kubeconfig文件,此文件包含完全访问群集的凭据。
rancher-cluster.rkestate:Kubernetes群集状态文件,此文件包含完全访问群集的凭据。

6. 初始化 Helm

一开始,我们安装了 Helm ,Helm 是 Kubernetes 首选的包管理工具。为了能够使用 Helm,需要在群集上安装服务器端组件 tiller。

Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的service account: tiller 并分配合适的角色给它。

# 在 kube-system 命名空间下创建一个 serviceaccount ,并将角色绑定给 tiller
kubectl -n kube-system create serviceaccount tiller

# 然后, heml 就可以在集群上安装 tiller 了
# 同样,网络原因,我们需要配置一个镜像仓库地址
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.13.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 输出:$HELM_HOME has been configured at /home/ubuntu/.helm.

7. 测试 tiller 安装是否成功

kubectl -n kube-system  rollout status deploy/tiller-deploy
# 输出 deployment "tiller-deploy" successfully rolled out

helm version
# Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
# Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

五、安装 Rancher

这里注意选择 stable 版本,首先添加 heml 源仓库。

helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

1. 部署 Rancher 并配置 SSL 数字证书

helm install rancher-stable/rancher \
  --name rancher \
  --namespace cattle-system \
  --set hostname=cloud.jfjbapp.cn \
  --set ingress.tls.source=secret

2. 将通过 CA 机构签发的数字证书准备好,

3. 检查 rancher 是否成功可用

kubectl -n cattle-system rollout status deploy/rancher
Waiting for deployment "rancher" rollout to finish: 0 of 3 updated replicas are available...
deployment "rancher" successfully rolled out

4. 访问 Rancher UI

浏览器打开 https://your.doamin,为 admin账户设置初始密码,并登入系统。提示设置server-url,确保你的地址无误,确认即可。随后稍等皮片刻,待系统完成初始化。

如果出现local集群一直停留在等待状态,并提示 Waiting for server-url setting to be set,可以尝试点击 全局->local->升级->添加一个成员角色(admin/ClusterOwner)->保存即可。

六、结语

至此,已完成 Rancher 2.2.2 的 HA 安装,后续再做一些安全加固,检查各项配置确保无安全风险,即可开始提供服务。随后会抽空再写一篇文章简单介绍微服务架构应用的部署。

转载于:https://www.cnblogs.com/kelsen/p/10836332.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rancher 2.2.2 - HA 部署高可用k8s集群 的相关文章

  • Vue + Element-ui组件上传图片报错问题解决方案

    在使用Vue和Element ui组件上传图片时 可能会遇到一些报错问题 以下是一些常见的问题及解决方案 报错 TypeError Cannot read property name of undefined 解决方案 这个错误通常是因为在
  • 内网穿透的应用-使用Net2FTP轻松部署本地Web网站并公网访问管理内网资源

    文章目录 1 前言 2 Net2FTP网站搭建 2 1 Net2FTP下载和安装 2 2 Net2FTP网页测试 3 cpolar内网穿透 3 1 Cpolar云端设置 3 2 Cpolar本地设置
  • 自定义编写zabbix_agent脚本

    vi usr lib systemd system zabbix agent servicce Unit Description Zabbix Agent After syslog target After network target S
  • 如何利用CHAT做简单的总结体会?

    问CHAT 在测试过程中使用appium python自动化的优点和体会 CHAT回复 使用 Appium 配合 Python 进行自动化测试主要有以下几点优点 1 跨平台性 Appium 支持 iOS 和 Android 平台的应用自动化
  • SRC漏洞挖掘经验+技巧篇

    一 漏洞挖掘的前期 信息收集 虽然是前期 但是却是我认为最重要的一部分 很多人挖洞的时候说不知道如何入手 其实挖洞就是信息收集 常规owasp top 10 逻辑漏洞 重要的可能就是思路猥琐一点 这些漏洞的测试方法本身不是特别复杂 一般混迹
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 前端必备的 web 安全知识手记

    前言 安全这种东西就是不发生则已 一发生则惊人 作为前端 平时对这方面的知识没啥研究 最近了解了下 特此沉淀 文章内容包括以下几个典型的 web 安全知识点 XSS CSRF 点击劫持 SQL 注入和上传问题等 下文以小王代指攻击者 话不多
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • Python自动化操作:简单、有趣、高效!解放你的工作流程!

    今天跟大家分享一套自动化操作流程解决方案 基于 Python语言 涉及 pyautogui pyperclip pythoncom win32com 依赖包 安装命令为 pip install pyautogui pip install p
  • 【信道估计】【MIMO】【FBMC】未来移动通信的滤波器组多载波调制方案(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【网安神器篇】——WPScan漏洞扫描工具

    目录 一 Wordpress简介 二 WPScan介绍 三 安装 四 获取token 1 注册账号 2 拿到token 五 使用教程 1 常用选项 2 组合命令 1 模糊扫描 2 指定扫描用户 3 插件漏洞扫描 4 主题漏洞扫描 5 Tim
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 网络安全基础知识面试题库

    1 基于路由器的攻击手段 1 1 源IP地址欺骗式攻击 入侵者从外部传输一个伪装成来自内部主机的数据包 数据包的IP是 内网的合法IP 对策 丢弃所有来自路由器外端口 却使用内部源地址的数据包 1 2 源路由攻击 入侵者让数据包循着一个不可
  • Kubernetes (十一) 存储——Secret配置管理

    一 简介 从文件创建 echo n admin gt username txt echo n westos gt password txt kubectl create secret generic db user pass from fi
  • Kubernetes (十二) 存储——Volumes配置管理

    一 卷的概念 官方地址 卷 Kubernetes https v1 24 docs kubernetes io zh cn docs concepts storage volumes 二 卷的类型及使用 emptyDir卷 1 创建编辑文件
  • 短信系统搭建主要因素|网页短信平台开发源码

    短信系统搭建主要因素 网页短信平台开发源码 随着移动互联网的快速发展 短信系统已成为企业和个人进行信息传递的重要工具 建立一个高效可靠的短信系统对于企业来说非常重要 下面我们将介绍一些影响短信系统搭建的主要因素 1 平台选择 在搭建短信系统
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • 服务器中E5和I9的区别是什么,如何选择合适的配置

    随着科技的进步 服务器处理器的性能在不断攀升 其中 Intel的E5和I9系列处理器在业界具有广泛的影响力 而当我们在选择服务器的时候会有各种各样的配置让我们眼花缭乱不知道该怎么去选择 下面我跟大家分享一下E5跟I9有什么区别 方便我们在选

随机推荐

  • STM32(HAL库)驱动OLED

    简介 通过STM32F103C8T6单片机采用HAL库方式对0 96寸OLED IIC通讯 屏幕进行驱动 之前GY906驱动通过软件IIC进行驱动 因此本次通过硬件IIC进行驱动 2 1 Cubemax初始化配置 首先进行初始化配置 点击进
  • 嵌入式MCU开发开源项目

    1 FreeModbus Slave Master RTT STM32 简介 FreeModbus是一款开源的Modbus协议栈 但是只有从机开源 主机源码是需要收费的 同时网上也没有发现比较好的开源的Modbus主机协议栈 所以才开发这款
  • 【备忘】es统计各个平台的每日活跃数量

    query bool must range unixtime gt 1631548800000 lt 1631635200000
  • 第十七课,帧缓存(后期处理)

    反向 void main FragColor vec4 vec3 1 0 texture screenTexture TexCoords 1 0 灰度 均分灰度 void main FragColor texture screenTextu
  • git diff,git format-patch,git apply和patch小问题三则

    这个文档主要是用来记录工作中遇到的git patch 相关的命令的介绍和相关常见问题的解决方案 Patch文件有3中 git 给我们提供了2种patch 方案 一是用git diff生成的标准patch 二是git format patch
  • Spring Boot使用slf4j+Logback进行日志记录

    Spring Boot使用slf4j Logback进行日志记录 个人总结使用logback步骤 1 yml或 properties配置日志文件的所在路径和输出日志的范围 级别 2 配置好logback xml文件的各项参数 包括日志输出格
  • 利用vscode--sftp,将本地项目/文件上传到远程服务器中详细教程

    1 首先在 vscode 中下载 sftp 2 然后在 vscode 中打开本地将要上传的项目或文件 3 安装完后 使用快捷键 ctrl shift P 打开指令窗口 输入 sftp config 回车 在当前目录中会自动生成 vscode
  • 最小生成树笔记(Prim算法&&Kruskal算法)

    1 最小生成树 最小生成树 Minimum Spanning Tree 简称MST 是指 在一个连通无向图中 找到一个包含所有顶点的树 且该树的所有边的权重之和最小 换句话说 最小生成树是原图中的一个子图 它包含所有顶点 并且连接所有顶点的
  • OpenCV 4.0.0学习笔记 (一) 图像与视频的读写

    目录 读取图片 imread方法 图片读取出错处理 读取的图片属性 写入图片 imwrite方法 带透明度的png图像 读取视频 capture结构体 下一帧与释放 读取视频属性 get 方法 写入视频 VideoWriter类 显示窗口W
  • 使用THREE.js制作一款3D游戏

    使用THREE js制作一款3D游戏 本文是基于某位大神使用three js设计游戏的学习心得与知识分享 The Making of The Aviator Animating a Basic 3D Scene with Three js
  • ubuntu 安装微软雅黑和 Consolas 字体

    https www mycode net cn platform 741 html ubuntu 安装微软雅黑和 Consolas 字体 2条回复 Consolas 字体用来写代码真的是非常舒服 可惜 ubuntu 系统中默认并没有这个字体
  • Error:(15, 13) java: No property named “cType” exists in source parameter(s). Did you mean “CType”?

    实体 Data public class private String cType Mapping target type source cType 这问题是由于实体类的属性首字母小写第二个字母大写导致 source的值首字母改为大写就可以
  • 深圳杯数学建模2020c题_2020数学建模B题

    2020数学建模B题 本人咸鱼一条 参加过19年数学建模 当时在B题和C题之间选择 最后还是选择了C题 其实是B题不会写 看着去年九月参加比赛的教室 今年也坐着三人一组的建模小队 查资料 分析数据 编程 触景生情 我又老了一岁 心血来潮也看
  • NETCore入门系列(AOP之ActionFilter)

    文章目录 一 ActionFilter入门 使用场景 官方介绍 实操 二 Filter传参 TypeFilter ServiceFilter 三 Filter作用域 四 源码 一 ActionFilter入门 使用场景 一般用于Action
  • 文本转语音的接口(开放免费)

    百度的开放转换接口 http tts baidu com text2audio lan zh ie UTF 8 spd 4 text 你好啊 听起来好憨啊 lan 语言类型 lan en 英文 lan zh 中文 ie 文字编码方式 spd
  • 使用C++刷算法题的简明教程

    本篇博客参考自柳婼大神的 从放弃C语言到使用C 刷算法的简明教程 1 使用C 刷算法的好处 在具备C语言的前提下 学习C 并使用它刷算法题的学习成本非常低 只需要几个小时 C 向下兼容C C语言里的语法大部分都可以在C 文件中运行 所以学习
  • 个人知识体系思维导图_职场必备思维导图:提升能力、知识体系、决策思维、领导力......

    图片来源 图虫创意 让你快速成长的职场思维 思维导图 MBA智库文档 你需要具备哪些技能 1 你需要建立系统的思维方式和做事方法 2 你需要了解不管是口碑还是硬广渠道的推广效果 3 你需要有管理能力 很好的沟通能力 4 你需要具备总结分析的
  • js刷新当前页面的5种方式

    1 reload reload 方法 该方法强迫浏览器刷新当前页面 语法 location reload bForceGet 参数 bForceGet 可选参数 默认为 false 从客户端缓存里取当前页 true 则以 GET 方式 从服
  • 设计模式之状态模式

    一 背景 状态这个词汇我们并不陌生 在日常生活中 不同时间就有不同的状态 早上起来精神饱满 中午想睡觉 下午又渐渐恢复 晚上可能只想睡觉 这就对应着一天中不同的状态 二 定义 状态 State 模式的定义 对有状态的对象 把复杂的 判断逻辑
  • Rancher 2.2.2 - HA 部署高可用k8s集群

    对于生产环境 需以高可用的配置安装 Rancher 确保用户始终可以访问 Rancher Server 当安装在Kubernetes集群中时 Rancher将与集群的 etcd 集成 并利用Kubernetes 调度实现高可用 为确保高可用