安装 K3s
最近甲骨文云放了 ARM 架构的实例资源,于是我就又多了一台甲骨文云。之前的两台服务器是主从架构部署的网站,可是现在有三台了,而且对于一个无人问津的小网站来说,三台网站服务器做“主主从”亦或是“主从从”都太过于奢侈了(主从的“从”都从来没用到过😂)于是乎,“如何利用这多出来的一台服务器”反倒成了一大难题……
正巧遇上第一次劳动节放假五天,于是乎,一个大胆的想法就这么在我的脑海中闪现——三台服务器组一个 K3s……
Perfect for Edge:K3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.
Simplified & Secure:K3s is packaged as a single <50MB binary that reduces the dependencies and steps needed to install, run and auto-update a production Kubernetes cluster.
Optimized for ARM:Both ARM64 and ARMv7 are supported with binaries and multiarch images available for both. K3s works great from something as small as a Raspberry Pi to an AWS a1.4xlarge 32GiB server.
——摘自 K3s 官网 Why Use K3s
准备工作
子网划分
上面我们也提到过了,因为甲骨文云放资源了,所以当前同一账号下有三台服务器。但是实际上呢,因为甲骨文云免费的 ARM 架构实例给到的资源是四核 24G 内存,用来做 Server 明显有一丢丢的浪费资源,所以我们可以将其划分为两台双核 12G 内存的服务器。这样我们就有四台服务器了,其中三台组 K3s,多出来的一台还能备用。
甲骨文云的默认公共子网是:10.0.0.0/16,这对于一个个人账号来说范围属实是太大了,因为资源有限,再怎么划分最多也就只能生成四台服务器,秉着“能小则小”的原则,所以我们把子网划分为:10.0.0.0/29
三台服务器
而后我们创建三台服务器,选择一个做 Server,另两个做 Agent。因为要做选择题了,所以我们先来看一下甲骨文云两种实例的资源区别
型号 | 处理器 | OCPU | 内存(GB) | 网络带宽(Gbps) |
---|---|---|---|---|
E2.1.Micro | 2.0 GHz AMD EPYC™ 7551 (Naples) | 1 | 1 | 0.48 |
A1.Flex | 2.8 GHz Ampere Altra 80C | 2 | 12 | 2 |
可以看到一种是一核 1G,另一种是双核 12G,这两种我们各有两台。根据网上推荐的,以及我自己的想法(想让 Agent 服务器好一些)所以我就这么踩了一个坑,就是使用一核 1G 的服务器做 Server,但是实践证明根本带不动😭
所以我们仅剩一种选择,即使用一台双核 12G 的服务器做 Server,两台一核 1G 的做 Agent,如下表所示
用途 | 数量 | 型号 | 处理器 | OCPU | 内存(GB) | 网络带宽(Gbps) |
---|---|---|---|---|---|---|
Server | 1 | A1.Flex | 2.8 GHz Ampere Altra 80C | 2 | 12 | 2 |
Agent | 2 | E2.1.Micro | 2.0 GHz AMD EPYC™ 7551 (Naples) | 1 | 1 | 0.48 |
安全组配置
创建好服务器,在等待其初始化时,我们当然又老生常谈的需要先配置好安全组,要不然日后各种连不上又要怪系统防火墙了。
首先先来看一下 K3s 所需开放的端口,以下表格摘自 K3s 官方文档
PROTOCOL | PORT | SOURCE | DESCRIPTION |
---|---|---|---|
TCP | 6443 | K3s agent nodes | Kubernetes API Server |
UDP | 8472 | K3s server and agent nodes | Required only for Flannel VXLAN |
TCP | 10250 | K3s server and agent nodes | Kubelet metrics |
TCP | 2379-2380 | K3s server nodes | Required only for HA with embedded etcd |
因为三台服务器属于同一内网:10.0.0.0/29,那么很简单,我们按官方要求,开放 10.0.0.0/29 的以上端口就行了
源 | IP 协议 | 源端口范围 | 目的地端口范围 | 说明 |
---|---|---|---|---|
10.0.0.0/29 | TCP | 全部 | 6443 | Kubernetes API Server |
10.0.0.0/29 | UDP | 全部 | 8472 | Required only for Flannel VXLAN |
10.0.0.0/29 | TCP | 全部 | 10250 | Kubelet metrics |
10.0.0.0/29 | TCP | 全部 | 2379-2380 | Required only for HA with embedded etcd |
服务器出厂配置
三台服务器均使用的 Ubuntu 20.04,初装配置之前有过博文,此处不再赘述,如有需要可以参阅:Ubuntu 优化
升级完内核和系统后,最重要的一点是内网放通所有 TCP 和 UDP 的端口
ufw allow from 10.0.0.0/29 # ufw 允许来自 10.0.0.0/29 的所有流量
iptables -I INPUT -s 10.0.0.0/29 -p TCP -j ACCEPT # iptables 允许来自 10.0.0.0/29 的所有 TCP 流量
iptables -I INPUT -s 10.0.0.0/29 -p UDP -j ACCEPT # iptables 允许来自 10.0.0.0/29 的所有 UDP 流量
iptables-save > /etc/iptables/rules.v4 # 保存 iptables 设置
systemctl restart iptables # 重启 iptables 服务
开始安装
Server
根据 K3s 官方文档,在 Server 输入如下命令即可快速安装 K3s Server 端服务
curl -sfL https://get.k3s.io | sh - # 如需安装指定版本请使用:curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=**K3s版本号** sh -
安装完成后需要记录一个 token,安装 Agent 端时需要使用
cat /var/lib/rancher/k3s/server/node-token # 记录(复制)这个 token
同时因为未知问题,我们还需要下载一个配置文件
get /etc/rancher/k3s/k3s.yaml # 下载这个文件
下载上述文件时,我们会发现权限不足,所以我们需要先赋权,下载后再还原其权限(也可以不还原权限,但是尽量养成一个好习惯,还是用其默认权限较为安全)
ls -l /etc/rancher/k3s/k3s.yaml # 查看其默认权限为 600
chmod 777 /etc/rancher/k3s/k3s.yaml # 将其权限改为 777
get /etc/rancher/k3s/k3s.yaml # 下载这个文件
chmod 600 /etc/rancher/k3s/k3s.yaml # 将其权限改回 600
ls -l /etc/rancher/k3s/k3s.yaml # 查看其权限是否为 600
完成如上操作,我们 K3s Server 端就安装完成了,且我们得到了一个 token 和一个配置文件 k3s.yaml
Agent
curl -sfL https://get.k3s.io | K3S_URL=https://**Server IP**:6443 K3S_TOKEN=**token** sh - # 我们需要将 Server IP 和刚才获得的 token 填入命令并运行脚本
# 如果 Server 安装了指定版本,Agent 安装时请加上相同的版本号参数以防出错:curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=**K3s版本号** K3S_URL=https://**Server IP**:6443 K3S_TOKEN=**token** sh -
两台 Agent 均完成如上命令后,在 Server 就已经能看见节点上线了
kubectl get node # 查看节点状态
但是当我们在 Agent 运行上述命令时,会发现报错
The connection to the server localhost:8080 was refused - did you specify the right host or port?
这时我们就需要上传刚才在 Server 获取的配置文件 k3s.yaml 到两台 Agent 的相同路径下。这个路径默认不存在,所以上传前我们需要先创建目录
cd /etc/rancher # 定位到 /etc/rancher 路径
mkdir k3s # 创建 k3s 目录
cd k3s # 进入 k3s 目录
然后我们需要先修改一下配置文件,很明显的,我们需要将 k3s.yaml 中“server”的“127.0.0.1”修改为 Server 的真实 IP
如果和博主一样使用的是甲骨文云的同一子网的服务器,那么 IP 应该形如 10.0.0.x,假如是公网访问,那么就填写 Server 的公网 IP 即可
然后我们尝试在两台 Agent 上传这个 k3s.yaml 到 Agent,可以发现还是存在权限不足的问题,所以我们如法炮制,依旧修改其默认权限,待上传完毕后再改回
ls -la # 查看其默认权限为 755
chmod 777 /etc/rancher/k3s # 将其权限改为 777
put k3s.yaml # 上传这个文件
chmod 755 /etc/rancher/k3s # 将其权限改回 755
ls -la # 查看其权限是否为 755
然后我们再在 Agent 运行如下命令,可以发现节点都能正常获取到了,获取到的节点信息也与 Server 一致
kubectl get node # 查看节点状态
至此 K3s 就安装完成了,开始享受不一样的“容器人生”吧~