zoukankan      html  css  js  c++  java
  • 这应该是最适合国内用户的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,所以在阿里云上创建至少两台实例用作演示:

    在这里插入图片描述

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

  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/k3s2019/p/13612442.html
Copyright © 2011-2022 走看看