原文:https://yq.aliyun.com/articles/704089

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

安装要求

K3s 高可用安装的 CPU 和 内存要求

https://docs.rancher.cn/docs/rancher2/installation/requirements/_index

部署规模 集群 节点 vCPUs 内存 数据库规模
小 最多 150 个 最多 1500 个 2 8 GB 2 cores, 4GB + 1000 IOPS
中 最多 300 个 最多 3000 个 4 16 GB 2 cores, 4GB + 1000 IOPS
大 最多 500 个 最多 5000 个 8 32 GB 2 cores, 4GB + 1000 IOPS
特大 最多 1000 个 最多 10,000 个 16 64 GB 2 cores, 4GB + 1000 IOPS
超大 最多 2000 个 最多 20,000 个 32 128 GB 2 cores, 4GB + 1000 IOPS

外部数据库

高可用性

注意: K3s在v1.0.0版本引入了对高可用性(HA)的官方支持。

本节介绍如何使用外部数据库安装高可用性K3s群集。

单个服务器集群可以满足各种用例,但是对于Kubernetes控制平面的正常运行时间至关重要的环境,您可以在HA配置中运行K3。HA K3s集群包括:

  • 两个或更多服务器节点将服务Kubernetes API并运行其他控制平面服务
  • 一个外部数据存储(而不是在单一服务器设置中使用的嵌入式的SQLite数据存储区)
  • 固定登记地址被放置在服务器节点的前方,以允许工人节点与所述簇注册

有关这些组件如何协同工作的更多详细信息,请参阅体系结构部分。

工作人员通过固定的注册地址进行注册,但是注册后,他们将直接建立与服务器节点之一的连接。这是由k3s agent进程启动的Websocket连接,由代理程序的一部分运行的客户端负载平衡器维护。

安装概要

设置高可用性群集需要执行以下步骤:

1、创建一个外部数据存储

您首先需要为集群创建一个外部数据存储。有关更多详细信息,请参见“ 集群数据存储选项”文档。

2、启动服务器节点

K3需要两个或更多服务器节点才能进行此HA配置。

k3s server在这些节点上运行命令时,必须设置datastore-endpoint参数,以便K3s知道如何连接到外部数据存储。请参阅数据存储区配置指南以获取有关配置此参数的信息。

注意:
单服务器安装可用的相同安装选项也可用于HA安装。有关更多详细信息,请参阅“ 安装和配置选项”文档。

默认情况下,服务器节点是可调度的,因此可以在它们上启动工作负载。如果希望有一个专用的控制平面在其中不运行任何用户工作负载,则可以使用污点。该node-taint参数将允许您配置带有污点的节点,例如--node-taint k3s-controlplane=true:NoExecute

k3s server 在所有服务器节点上启动该过程后,可以使用来检查节点是否处于“就绪”状态,从而确保群集已正确启动 k3s kubectl get nodes

3、配置固定注册地址

工作节点需要一个URL进行注册。这可以是任何服务器节点的IP或主机名,但是在许多情况下,它们可能会随着时间而改变。例如,如果您在支持扩展组的云中运行群集,则可能会随着时间的推移上下扩展服务器节点组,从而导致节点被创建和销毁,因此其IP与初始服务器节点集不同。因此,您应该在服务器节点之前有一个稳定的端点,该端点不会随时间变化。可以使用许多方法来设置此端点,例如:

  • 第4层(TCP)负载平衡器
  • 轮询DNS
  • 虚拟或弹性IP地址

该端点还可以用于访问Kubernetes API。因此,例如,您可以修改kubeconfig文件使其指向它,而不是指向特定节点。

4、加入工作者节点

在HA群集中加入工作程序节点与在单个服务器群集中加入工作程序节点相同。您只需要指定代理程序应注册到的URL及其应使用的令牌。

K3S_TOKEN=SECRET k3s agent --server https://fixed-registration-address:6443

集群数据存储选项

使用etcd以外的数据存储运行Kubernetes的能力使K3与其他Kubernetes发行版区分开来。该功能为Kubernetes运营商提供了灵活性。可用的数据存储选项使您可以选择最适合您的用例的数据存储。例如:

  • 如果您的团队不具备操作etcd的专业知识,则可以选择企业级SQL数据库,例如MySQL或PostgreSQL
  • 如果您需要在CI / CD环境中运行一个简单的,短暂的集群,则可以使用嵌入式SQLite数据库
  • 如果您希望在边缘部署Kubernetes并需要高度可用的解决方案,但又无法承受在边缘管理数据库的操作开销,则可以使用基于DQLite之上的K3s嵌入式HA数据存储(目前处于试验阶段)

K3s支持以下数据存储选项:

  • 嵌入式SQLite
  • PostgreSQL(通过版本10.7和11.5认证)
  • MySQL(针对5.7版进行了认证)
  • etcd(针对版本3.3.15认证)
  • 嵌入式DQLite实现高可用性(实验性)
外部数据存储配置参数

如果您希望使用外部数据存储(例如PostgreSQL,MySQL或etcd),则必须设置datastore-endpoint参数,以便K3s知道如何连接到它。您还可以指定参数来配置连接的身份验证和加密。下表总结了这些参数,可以将其作为CLI标志或环境变量进行传递。

数据存储端点格式和功能

如前所述,传递给datastore-endpoint参数的值的格式取决于数据存储后端。以下详细介绍了每个受支持的外部数据存储的这种格式和功能。

  • For PostgreSQL

PostgreSQL 最常见的 datastore-endpoint 参数格式如下:

postgres://username:password@hostname:port/database-name

提供了更多高级配置参数。有关这些的更多信息,请参见https://godoc.org/github.com/lib/pq。

如果您指定一个数据库名称,但它不存在,则服务器将尝试创建它。

如果仅提供postgres:// 作为端点,则K3s将尝试执行以下操作:

  • 使用postgres用户名和密码连接到本地主机
  • 创建一个名为的数据库 kubernetes

基于上述内容,以下示例命令可用于启动连接到名为k3s的PostgresSQL数据库的服务器实例:

K3S_DATASTORE_ENDPOINT='postgres://username:password@hostname:5432/k3s' k3s server
  • For MySQL

MySQL 最常见的 datastore-endpoint 参数格式如下:

mysql://username:password@tcp(hostname:3306)/database-name

提供了更多高级配置参数。有关这些的更多信息,请参见https://github.com/go-sql-driver/mysql#dsn-data-source-name

请注意,由于K3s中存在已知问题,因此无法设置tls参数。支持TLS通信,但是您不能(例如)将此参数设置为“skip-verify”以使K3s跳过证书验证。

如果您指定一个数据库名称,但它不存在,则服务器将尝试创建它。

如果仅提供 mysql:// 作为端点,则K3将尝试执行以下操作:

  • /var/run/mysqld/mysqld.sock使用root用户名和密码无需连接到MySQL套接字
  • 用名称创建数据库 kubernetes

以下示例可用于使用客户端证书身份验证连接到MySQL数据库:

K3S_DATASTORE_ENDPOINT='mysql://username:password@tcp(hostname:3306)/k3s' \
K3S_DATASTORE_CERTFILE='/path/to/client.crt' \
K3S_DATASTORE_KEYFILE='/path/to/client.key' \
k3s server
  • For ETCD

ETCD 最常见的 datastore-endpoint 参数格式如下:

https://etcd-host-1:2379,https://etcd-host-2:2379,https://etcd-host-3:2379

上面假设一个典型的三节点etcd集群。该参数可以再接受一个逗号分隔的etcd URL。

Step 0: 配置环境要求

虽然K3S是K8S的轻量版,但也不能说不看配置要求。官方给出的配置要求如下:

  • 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
  • K3S Server端最低内存要求:512 MB
  • K3S Agent端内存最低要求:75MB
  • 磁盘空间最低要求:200 MB
  • 支持的硬件架构:x86_64, ARMv7, ARM64

相对于K8S那种性能杀手,K3S真的可以轻量到部署在大多数的虚拟机上(比如常见的1C512M,不过如果部署在生产环境,建议1C2G及以上以保证稳定性)。如果你还要再同一台Server上同时跑Rancher 2.x Server的话,我给出的建议最低配置要求如下:

  • 系统内核版本:Linux 3.10+ (CentOS 7, Debian 8/9, Ubuntu 14.04+)
  • CPU最低核心数:1 核心
  • Rancher 2.x Server + K3S Server + K3S Agent端最低内存要求:2 GB
  • 磁盘空间最低要求:5 GB
  • 建议使用的硬件架构:x86_64

虽然K3S足够轻量,但也请不要忘掉,Rancher Server本身也是需要占用掉大量内存的。所以如果是为了做成AIO (All In One)的效果,建议按照上述的配置要求准备Server。

Step 1: 安装Docker环境

虽然K3S默认集成的是Containerd,但出于多方面原因,为了后续部署方便起见,这里我们将Containerd换成Docker。具体的原因我会在下文讲到。

本文以 Debian 9 x64 系统作为示例,Ubuntu 可以直接照搬 Debian 的安装过程,CentOS 用户我会特殊标注操作步骤。

如果你的服务器在中国大陆境内:

curl -fsSL "https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg" | apt-key add -
echo "deb [arch=amd64] https://mirrors4.tuna.tsinghua.edu.cn/docker-ce/ stretch stable" > /etc/apt/sources.list.d/docker.list
apt-get update && apt-get install -y docker-ce

如果你的服务器在海外:

curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.list
apt-get update && apt-get install -y docker-ce

CentOS 系统或者以上方法无法安装的,请使用官方安装脚本:

curl -fsSL get.docker.com | sh

也许会有人问我,我安装的时候为什么去掉了 –no-install-recommends 参数?

因为需要用到里面的cgroup支持,当然,你也可以加上这个参数,来只安装基础的Docker组件,同样能够支持运行。

在安装完成后,如果你的服务器位于中国大陆境内,你很有可能需要一个Docker镜像加速器。国内提供Docker镜像加速器的服务商很多,这里我们以阿里云的镜像加速服务为例:

  • 打开 https://cr.console.aliyun.com ,并登录你的阿里云账户
  • 点击左方的 镜像中心 - 镜像加速器 ,然后在下方会有一个操作文档,复制其中的命令,粘贴到你的SSH窗口中即可完成镜像源的更换。

如果报错误 sudo: command not found ,只需要去掉每行命令中的sudo即可 (前提是你的当前登录用户为root)

Step 2: 安装Rancher Server

此部分你也可以参考官方教程: https://www.cnrancher.com/quick-start

Rancher Server名字听起来感觉像是又要装一大堆东西,其实并不是这样。Rancher Server其实只是一个Docker镜像,整个Rancher的程序都使用Docker打包起来了。所以相对来讲配置很简单,只需要一条命令:

docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 80:80 -p 443:443 rancher/rancher:stable

然后等待几分钟,喝杯82年的雪碧压压惊(划掉),之后访问你的Server IP即可进入Rancher Server的首次配置界面。

如果你不想让Rancher占用你的80/443端口(比如前端要放个Caddy反代),只需要按照以下步骤操作:

  • 修改启动命令行:
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 80:80 -p 443:443 rancher/rancher:stable
  • 将里面的80和443,替换为你需要的端口(注意:请不要占用Kubernetes的6443端口,这一步很容易翻车!),换完的效果大概是这样:
docker run -d -v /data/docker/rancher-server/var/lib/rancher/:/var/lib/rancher/ --restart=unless-stopped --name rancher-server -p 9080:9080 -p 9443:9443 rancher/rancher:stable
  • 启动Rancher Server容器

  • 执行命令,确认Rancher Server容器的Container ID,本例中的容器ID为 31aa94998b75:

docker ps | grep "rancher/rancher:stable"
  • 执行命令,切入到Rancher Server容器的Bash Shell中(TTY):
docker exec -it 31aa94998b75 bash

此时你会发现你的提示符变成了这个样子:

root@31aa94998b75:/var/lib/rancher#

这时候你控制的就是Rancher Server的容器,如果你能够成功切入Shell,那么请继续下一步,如果未能切入,请使用 docker logs 31aa94998b75 来确认容器发生了什么奇怪的事情。

我们先开看下要改的文件长什么样子:

#!/bin/bash
set -e

exec tini -- rancher --http-listen-port=80 --https-listen-port=443 --audit-log-path=${AUDIT_LOG_PATH} --audit-level=${AUDIT_LEVEL} --audit-log-maxage=${AUDIT_LOG_MAXAGE} --audit-log-maxbackup=${AUDIT_LOG_MAXBACKUP} --audit-log-maxsize=${AUDIT_LOG_MAXSIZE} "${@}"
  • 执行命令,替换默认的端口:
sed -i "s/80/9080/g" /usr/bin/entrypoint.sh
sed -i "s/443/9443/g" /usr/bin/entrypoint.sh
  • 执行后看下变成了什么样子:
#!/bin/bash
set -e

exec tini -- rancher --http-listen-port=9080 --https-listen-port=9443 --audit-log-path=${AUDIT_LOG_PATH} --audit-level=${AUDIT_LEVEL} --audit-log-maxage=${AUDIT_LOG_MAXAGE} --audit-log-maxbackup=${AUDIT_LOG_MAXBACKUP} --audit-log-maxsize=${AUDIT_LOG_MAXSIZE} "${@}""
  • 确认修改成功后,使用 exit 命令退出容器的Bash Shell,之后执行命令重新启动Rancher Server容器:
docker restart 31aa94998b75
  • 之后使用新的端口访问Rancher Server的UI(下面的连接为例子):访问会提示SSL证书无效,无视错误继续即可。
https://rancher.example.com:9443/

  • 此时我们会来到Rancher的初始化部署页面,在此页面输入默认的全局管理员密码,创建全局管理员账户。

  • 这一步输入我们的Rancher API Endpoint,注意这里输入的URL一定要保证整个集群内的所有节点都可以正常连接。

  • 之后我们会来到主界面,如果对英文操作看着头疼的话,右下角可以切换语言。
    具体方法是点击右下角的 English ,然后下拉选择 简体中文(zh-hans) 即可。
    汉化设置会跟随你的Cookies走,所以不换电脑或者不重装系统的话应该不会自动换回英语。

  • 我们接下来在Rancher中创建一个新的集群,点击页面上的 创建集群 按钮,开始创建一个新的K8S/K3S集群。
    注意:在这里请选择 导入现有的Kubernetes集群 (Import) ,而不是其他的新建选项!

  • 下方的集群名称随意输入一个即可,反正以后可以随意改。
    成员角色目前无需改动,直接点击 创建 完成向导。

  • 完成后我们会得到导入K3S集群所需的命令,请保存好第三条命令以备后用。
    为什么不是第二条?因为目前访问HTTPS API使用的是自签证书,直接用第二条会产生证书不信任的报错。

  • 如果你一不小心关掉了窗口,可以在首页点击右侧的三个点,然后点击升级,就可以看到上面的集群导入命令。

到这一步,我们已经完成了Rancher Server端的准备工作。接下来,我们将着手准备部署K3S集群。

Step 3: 安装K3S集群 - 国内服务器的准备工作

注意:如果你的服务器中国大陆境内,请参考下面的步骤执行;如果你的服务器在海外,请直接跳到Step 4。

出于国内拉取AWS S3 Bucket感人的速度,以及 k8s.gcr.io 被墙的无奈,我在这里额外增加了针对中国大陆境内服务器的步骤。如果你使用的是海外的服务器,这一步你无需操作,请继续下面的教程。

首先,我们下载K3S所需的Binary到本地服务器(或者在服务器端挂VPN进行下载):

https://github.com/rancher/k3s/releases/download/v0.5.0/k3s-arm64

之后上传此Binary到服务器端的 /usr/local/bin/k3s,并赋予可执行属性:

chmod +x /usr/local/bin/k3s

这一步完成后,我们来着手解决最头疼的问题:pause 镜像被墙无法拉取。

这个镜像对于很多刚接触K8S的用户来讲非常头疼,我也是在这里卡了好久最后才算弄出来个解决方案。

出于大家的部署方便考虑,我将这份镜像制成了多份副本并分发出来,大家可以根据自己的需求选择最佳的解决方案。

  • 阿里云北京镜像分流:
docker pull registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-beijing.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
  • 阿里云上海镜像分流:
docker pull registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-shanghai.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
  • 阿里云广州镜像分流:
docker pull registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1
docker tag registry.cn-shenzhen.aliyuncs.com/ilemonrain/pause-amd64:3.1 k8s.gcr.io/pause:3.1
  • Google Mirror分流 (Docker Hub):
docker pull mirrorgooglecontainers/pause:3.1
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
  • 本地镜像分流 (tar包格式):
wget -qO- https://download.ilemonrain.com/Kubernetes/pause-amd64/pause.tar | docker load

完成镜像导入后确认是否导入成功:

docker images | grep "k8s.gcr.io/pause"

如果出现类似于这样的结果:

k8s.gcr.io/pause    3.1                 da86e6ba6ca1        17 months ago       742kB

则说明导入成功,可以继续接下来的步骤。

Step 4: 安装K3S集群

接下来,我们开始K3S集群的部署。

官方提供了很好用的一键安装脚本,我们只需要使用一键脚本即可完成K3S环境的安装:

curl -sfL https://get.k3s.io | sh -

安装完成后,我们需要调整下K3S的服务配置文件,以将K3S的默认容器引擎从Containerd切换到Docker。

修改K3S服务的配置文件:

vim /etc/systemd/system/multi-user.target.wants/k3s.service

文件内容如下:

[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
After=network-online.target

[Service]
Type=notify
EnvironmentFile=/etc/systemd/system/k3s.service.env
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s server
KillMode=process
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always

[Install]
WantedBy=multi-user.targe

在这里我们需要修改ExecStart的值,将其修改为:

/usr/local/bin/k3s server --docker --no-deploy traefik

之后保存退出,执行命令重新加载新的服务配置文件:

systemctl daemon-reload

完成后重启K3S服务:

service k3s restart

稍等数十秒,之后通过命令确认K3S集群是否就绪:

k3s kubectl get node

如果得到类似如下的结果:

NAME                  STATUS   ROLES    AGE     VERSION
k3s01.ilemonrain.io   Ready    <none>   3m34s   v1.14.1-k3s.4

则说明K3S集群启动成功。

此教程目前只做单机K3S集群的部署讲解,后续教程会讲如何组建多机K3S集群,以及通过一个Rancher控制多个K3S集群。

Step 5: 导入K3S集群到Rancher

还记得在Step 2中保存好的导入命令么?是时候该派上用场了。

现在的Rancher Server上,显示集群状态为Pending,就像这样:

这是因为我们还未导入集群,这一步我们将导入集群,并建立Rancher Server与K3S集群的联系。

在K3S的主控节点(一般情况下,第一个节点都是主控制器,也叫Server节点)上,执行命令,导入集群:

curl --insecure -sfL https://10.248.21.2/v3/import/jr42wvdhk4w94htxxtf5hv424rsjjz6hzq9vl2lj8q9dnb8dgcwgzn.yaml | kubectl apply -f -

注意:每个集群的导入命令都不一样,请不要直接照搬教程中的导入命令!

之后Shell中会返回一下信息,说明集群导入配置成功:

namespace/cattle-system created
serviceaccount/cattle created
clusterrolebinding.rbac.authorization.k8s.io/cattle-admin-binding created
secret/cattle-credentials-7c9ef0a created
clusterrole.rbac.authorization.k8s.io/cattle-admin created
deployment.extensions/cattle-cluster-agent created
daemonset.extensions/cattle-node-agent created

回到Rancher界面,稍微等数十秒,我们会发现Pending状态变成了Waiting状态:

出现这个提示说明Rancher已经收到K3S的注册请求,正在完成K3S集群的注册工作,再等数十秒种的时间即可完成K3S集群的导入工作:

到这里,我们成功的完成了Rancher 2.x和K3S的对接工作,可以像操作K8S集群那样操作K3S集群了。

Step X: 一点小小的总结

为什么我会用K3S来取代K8S,主要是因为自己手里的服务器配置不太够,如果贸然上K8S的话,会导致系统资源全被K8S吃光,从而没有资源再去跑其他的业务。谨以此文,希望能够做各位运维、开发、Geeker前行路上的指路明灯,为大家扫清前进的障碍,加速业务容器化的迁移进程。

https://blog.ilemonrain.com/docker/rancher-with-k3s.html

作者:Jeebiz  创建时间:2020-01-11 23:58
 更新时间:2024-08-02 14:28