这应该是最适合国内用户的K3s HA方案

前 言

在面向生产环境的实践中,高可用是我们无法避免的问题,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,所以在阿里云上创建至少两台实例用作演示:

[图片上传失败...(image-3bca5e-1599186915258)]

配置阿里云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方式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354