前 言

在面向生产环境的实践中,高可用是我们无法避免的问题,K3s本身也历经多个版本的迭代,HA方案也进行了不断优化,形成了目前的比较稳定的HA方案。

目前官方提供两种HA方案:

  • 嵌入式DB的高可用(实验)

  • 使用外部数据库实现高可用

嵌入式DB的高可用目前还是实验性的,本文不过多介绍,请参考:

https://rancher.com/docs/k3s/latest/en/installation/ha-embedded/

使用外部数据库实现高可用需要搭建一个高可用的外置数据库,目前,K3s支持SQLite/etcd/MySQL/PostgreSQL/DQLite等datastore,不同的datastore面向不同的使用场景。

目前国内使用最多的公有云环境应该就是阿里云了,我们可以在阿里云上利用虚拟机搭建K3s HA,然后对接到阿里云的RDS,这样可以免去单独维护一套数据库的麻烦。本文选择大家熟知的MySQL来做HA的实践,PostgreSQL与MySQL类似,本文不再赘述。

架构图

如上图,终端用户访问SLB,SLB将流量分别转发到后端的两台K3s master HA。两台 K3s master 节点连接同一个RDS 创建的外置数据库。

创建阿里云实例

K3s 需要至少两台实例去组成HA,所以在阿里云上创建至少两台实例用作演示:

配置阿里云RDS

1、创建RDS实例,实例类型要选择MySQL 5.7,该版本是K3s官方支持的版本,其他参数根据自身需求设置即可。

2、设置白名单,白名单的内容设置为你的K3s 实例的内网IP即可。设置成功后,我们将得到一个内网地址用作数据库连接:rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com

3、创建账号,使用普通账号(ksd)即可

4、创建数据库,设置数据库名称(k3s),授权账号(ksd)

之前在使用docker启动的mysql时,不需要提前创建数据库,因为启动k3s的时候会自动创建。但在阿里云RDS上,必须先在UI上创建K3s所需的数据库。

5、修改数据库参数

我们需要把数据参数innodb_large_prefix设置为ON,否则启动K3s的时候会报错:

Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Service hold-off time over, scheduling restart.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Scheduled restart job, restart counter is at 11.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Stopped Lightweight Kubernetes.
Jul 29 20:08:06 iZ2zed0v8rqape974mz8suZ systemd[1]: Starting Lightweight Kubernetes...
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.145963348+08:00" level=info msg="Starting k3s v1.18.6+k3s1 (6f56fa1d)"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ k3s[24934]: time="2020-07-29T20:08:07.159363656+08:00" level=fatal msg="starting kubernetes: preparing server: creating storage endpoint: building kine: Error 1071: Specified key was too long; max key length is 767 bytes"
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Main process exited, code=exited, status=1/FAILURE
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: k3s.service: Failed with result 'exit-code'.
Jul 29 20:08:07 iZ2zed0v8rqape974mz8suZ systemd[1]: Failed to start Lightweight Kubernetes.

innodb_large_prefix修改为ON之后,点击右上角【提交参数】即可完成修改。

以上步骤操作成功后,K3s要求的外置数据库就已经准备完成,下面我们来启动K3s HA。

实现 K3s HA

k3s-master-1k3s-master-2上执行相同的命令:

curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh |  \
INSTALL_K3S_MIRROR=cn \
K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
sh -s - server

稍等片刻,一个K3s HA的环境就已经启动完成了:

如果在阿里云上pull K3s的镜像比较慢的话,可以配置mirror或者 从 http://mirror.cnrancher.com 下载对应版本的离线包,然后参考下面链接导入镜像:https://rancher.com/docs/k3s/latest/en/installation/airgap/#prepare-the-images-directory-and-k3s-binary

root@k3s-master-2:~# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system local-path-provisioner-6d59f47c7-tshfx 1/1 Running 0 16m 10.42.0.5 k3s-master-1 <none> <none>
kube-system metrics-server-7566d596c8-mrc94 1/1 Running 0 16m 10.42.0.2 k3s-master-1 <none> <none>
kube-system coredns-8655855d6-sxn7v 1/1 Running 0 16m 10.42.0.4 k3s-master-1 <none> <none>
kube-system helm-install-traefik-cmmsr 0/1 Completed 2 16m 10.42.0.3 k3s-master-1 <none> <none>
kube-system svclb-traefik-z6vlb 2/2 Running 0 11m 10.42.0.6 k3s-master-1 <none> <none>
kube-system svclb-traefik-f89x6 2/2 Running 0 11m 10.42.1.2 k3s-master-2 <none> <none>
kube-system traefik-758cd5fc85-chnbc 1/1 Running 0 11m 10.42.1.3 k3s-master-2 <none> <none>
root@k3s-master-2:~#
root@k3s-master-2:~# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k3s-master-1 Ready master 16m v1.18.6+k3s1 172.17.207.15 <none> Ubuntu 18.04.4 LTS 4.15.0-106-generic containerd://1.3.3-k3s2
k3s-master-2 Ready master 16m v1.18.6+k3s1 172.17.207.16 <none> Ubuntu 18.04.4 LTS 4.15.0-106-generic containerd://1.3.3-k3s2

通过阿里云SLB提供统一访问入口

现在我们已经拥有了高可用的MySQL和K3s,但现在还缺一个为多个K3s server提供一个统一的访问入口,这可以使用以下方式实现:

  1. L4层负载均衡器

  2. Round-robin DNS

  3. VIP或者弹性IP

所以,我们可以直接使用阿里云的SLB做L4层负载均衡,将6443端口转发到后端的两台K3s master。

接下来,我们可以把k3s master节点的/etc/rancher/k3s/k3s.yaml 复制到本地的~/.kube/config 目录,然后将server地址修改为server: https://39.106.185.201:6443(SLB的公网IP)

然后可以通过kubectl get nodes测试下是否可以通过SLB将流量转发到K3s master:

ksd@Hailong-MacBook-Pro  ~  kubectl get nodes
Unable to connect to the server: x509: certificate is valid for 10.43.0.1, 127.0.0.1, 172.17.207.15, 172.17.207.16, not 39.106.185.201

这个错误是因为K3s mster启动时自动创建的证书不信任39.106.185.201这个SLB的公网IP,为了解决这个问题,可以更新K3s master,添加参数--tls-san 39.106.185.201

curl -sfL https://docs.rancher.cn/k3s/k3s-install.sh |  \
INSTALL_K3S_MIRROR=cn \
K3S_DATASTORE_ENDPOINT='mysql://ksd:your_password@tcp(rm-2ze64ke7q33bkq3yt.mysql.rds.aliyuncs.com:3306)/k3s' \
sh -s - server \
--tls-san 39.106.185.201

最后,再回到本地机器上,再次执行kubectl get nodes,不出意外的话,就应该可以获取到节点信息了。

ksd@Hailong-MacBook-Pro  ~  kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-master-2 Ready master 65m v1.18.6+k3s1
k3s-master-1 Ready master 65m v1.18.6+k3s1

后 记

本文只介绍了如何借助阿里云的SLB、RDS来实现K3s的HA,其他公有云的操作基本大同小异,虽然没做过详细的测试,但理论上应该都是支持的。如果是非公有云环境,可以根据自身的需求选择适合的datastore以及对应的HA方式。

这应该是最适合国内用户的K3s HA方案的更多相关文章

  1. Expo大作战(三十一)--expo sdk api之Payments(expo中的支付),翻译这篇文章傻逼了,完全不符合国内用户,我只负责翻译大家可以略过!

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  2. 为什么说国产BI更适合国内企业?

    ​就算国外BI发展迅速,产品更加完善成熟,但对国内的企业来说,使用起来难免"水土不服",何况还有服务对接过程中的繁琐程.今天就来讨论一下,国内BI和国外BI到底该怎么选择? 国外B ...

  3. 【转】国内用户如何加快App Store的访问速度

    原文网址:http://www.app111.com/doc/100024206_1.html 作为国内互联网用户是比较可怜的,除了国外四大顶尖互联网服务不能访问外,就是App Store用得也比较痛 ...

  4. Linux企业生产环境用户权限集中管理项目方案案例

    企业生产环境用户权限集中管理项目方案案例: 1 问题现状 当前我们公司里服务器上百台,各个服务器上的管理人员很多(开发+运维+架构+DBA+产品+市场),在大家登录使用Linux服务器时,不同职能的员 ...

  5. Linux 服务器用户权限管理改造方案与实施项目

    Linux 服务器用户权限管理改造方案与实施项目 在了解公司业务流程后,提出权限整改方案改进公司超级权限root泛滥的现状. 我首先撰写方案后,给boss看,取得boss的支持后,召集大家开会讨论. ...

  6. OKR究竟适不适合国内企业?

    某天见到知乎上有人提问,OKR在中国能行的通吗?细看下面的回复,多数人觉得大部分企业都是不适合的,他们认为让普通员工主动付出努力去达到更高的要求是不可能的,并且公司环境也不适合OKR的推行.但我却有不 ...

  7. CentOS7 安装 PostGIS方法(适合国内网络

    安装Postgresql 9.4 yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1. ...

  8. CentOS7 安装 PostGIS方法(适合国内网络)

    安装Postgresql 9.4 yum install http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-redhat94-9.4-1. ...

  9. 适合国内网速的CDH5安装

    0.集群规划 说明:因为CDH能够方便的动态加入删除主机,动态改变主机上的服务,所以后面再对各机器上跑得服务进行分配. 共三台机器 操作系统: centos6.5 机器名:work01.work02. ...

随机推荐

  1. Qt实现的多菜单选择界面

    文章目录 1.效果展示 2.实现代码 2.1 菜单实现代码 2.1.1 头文件 2.1.2 源文件 2.2 应用代码 1.效果展示 这种菜单样式比较常用,实现的方法也有很多种,比如可以直接使用QTab ...

  2. Python selenium爬虫实现定时任务过程解析

    现在需要启动一个selenium的爬虫,使用火狐驱动+多线程,大家都明白的,现在电脑管家显示CPU占用率20%,启动selenium后不停的开启浏览器+多线程, 好,没过5分钟,CPU占用率直接拉到9 ...

  3. Make Windows 10 Comfortable

    在 StartUp 目录中(在当前用户目录下), 创建.bat, 里面可以写希望登录指定的命令(如使用subst进行映射, 将常用的目录映射为磁盘驱动器) 在 %USERPROFILE%(也就是用户家 ...

  4. 【JavaScript】windows.open用法详解

    windows.open("URL","窗口名称","窗口外观设定");的用法详解 function onNewWindows(redire ...

  5. Code Review 从失败中总结出来的几个经验

    资深的程序员都知道 Code Review 可以对代码质量,代码规范,团队代码能力提升带来很大的提升,还有著名的技术专家"左耳朵耗子"也说过: 我认为没有 Code Review ...

  6. Docker服务开放了这个端口,服务器分分钟变肉机

    之前有很多朋友提过,当使用docker-maven-plugin打包SpringBoot应用的Docker镜像时,服务器需要开放2375端口.由于开放了端口没有做任何安全保护,会引起安全漏洞,被人入侵 ...

  7. 这样Review代码牛逼啦!

    这样Review代码牛逼啦! 一个对项目负责的团队代码质量检查是必不可少的,有条件的团队经常有代码review习惯,这样可以使技术团队共同进步,但是一个庞大的工程做代码review其实是很麻烦的,所以 ...

  8. 【SCOI2013】摩托车交易 - 最大生成树+树链剖分

    题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...

  9. 浅谈个人学DP的经历和感受

    动态规划的定义! 首先,我们看一下官方定义:定义:动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决.动态规划算法的基本思想与分治法类似,也是将待求 ...

  10. Android studio 在项目里配置签名 + cmd命令安装apk在测试机

    一.在项目里配置签名 搜索百度里有很多可视化操作在项目里配置签名,但是对于已经有签名的旧项目来说,用语句是最方便的. 方法: 第一步:把签名文件放到项目中,和build.gradle的同一级目录下.当 ...