安装 K3s

2022-05-02
2022-05-18
5 min read
Hits

  最近甲骨文云放了 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.Micro2.0 GHz AMD EPYC™ 7551 (Naples)110.48
A1.Flex2.8 GHz Ampere Altra 80C2122

  可以看到一种是一核 1G,另一种是双核 12G,这两种我们各有两台。根据网上推荐的,以及我自己的想法(想让 Agent 服务器好一些)所以我就这么踩了一个坑,就是使用一核 1G 的服务器做 Server,但是实践证明根本带不动😭

  所以我们仅剩一种选择,即使用一台双核 12G 的服务器做 Server,两台一核 1G 的做 Agent,如下表所示

用途数量型号处理器OCPU内存(GB)网络带宽(Gbps)
Server1A1.Flex2.8 GHz Ampere Altra 80C2122
Agent2E2.1.Micro2.0 GHz AMD EPYC™ 7551 (Naples)110.48

安全组配置

  创建好服务器,在等待其初始化时,我们当然又老生常谈的需要先配置好安全组,要不然日后各种连不上又要怪系统防火墙了。

  首先先来看一下 K3s 所需开放的端口,以下表格摘自 K3s 官方文档

PROTOCOLPORTSOURCEDESCRIPTION
TCP6443K3s agent nodesKubernetes API Server
UDP8472K3s server and agent nodesRequired only for Flannel VXLAN
TCP10250K3s server and agent nodesKubelet metrics
TCP2379-2380K3s server nodesRequired only for HA with embedded etcd

  因为三台服务器属于同一内网:10.0.0.0/29,那么很简单,我们按官方要求,开放 10.0.0.0/29 的以上端口就行了

IP 协议源端口范围目的地端口范围说明
10.0.0.0/29TCP全部6443Kubernetes API Server
10.0.0.0/29UDP全部8472Required only for Flannel VXLAN
10.0.0.0/29TCP全部10250Kubelet metrics
10.0.0.0/29TCP全部2379-2380Required 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 就安装完成了,开始享受不一样的“容器人生”吧~

Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.