K3s 多节点集群安装
K3s 是轻量级的 Kubernetes,精简了很多 K8s 组件,非常适合在性能较弱的机器上运行,支持 IoT 设备,支持 arm 架构,很适合在 vps 上轻量部署。正好手里有几台 vps,于是决定用 K3s 统一进行管理。
官网:K3s 官网
在官网下面有 Get Started 部分,列出了启动 server 和 agent 节点的简单命令,但是对我们而言还不够,所以参考官网文档进行安装配置。具体的安装文档可以参见:安装选项介绍。
K3s 安装
准备工作
由于 K3s 默认运行环境为 containerd,所以为了使用 Docker 作为运行时,需要先在各节点正常安装 Docker,安装过程不再赘述。
安装 master 节点
根据个人需求,按需设置 master 节点的安装参数。由于个人使用,不要多节点部署实现高可用,所以禁用 servicelb 组件。traefik 虽然是 K3s 自带的网络组件,但是其默认会占用 80 和 443 端口,所以也不打算使用。最后完整的安装参数为:
1 | curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_SELINUX_RPM=true INSTALL_K3S_EXEC="--docker --disable servicelb --disable traefik --disable-cloud-controller" sh - |
安装完成之后我们可以通过 kubectl get node
来看一下节点的情况:

安装 agent 节点
由于 agent 节点需要与 master 节点进行通信校验,在安装时需要指定 token,所以需要从 master 节点获取安装 token:
1 | root@ubuntu-master:~# cat /var/lib/rancher/k3s/server/node-token |
然后与 master 节点类似,指定 agent 节点的参数进行安装:
1 | curl -sfL https://get.k3s.io | K3S_URL=https://MASTER_URL:6443 K3S_TOKEN=NODE_TOKEN INSTALL_K3S_SKIP_SELINUX_RPM=true INSTALL_K3S_EXEC="--docker" sh - |
然后同样的方式,安装其他 agent 节点。
验证安装
各节点安装完成后,再次在 master 节点查看各节点状态:

K3s 配置
为 master 分配 worker 角色
默认情况下,master 节点只有 control-plane 和 master 两个角色,但是由于 master 节点性能过剩,所以可以为 master 节点添加 worker 角色来运行服务:
1 | kubectl label node ${node} node-role.kubernetes.io/worker=worker |
然后我们再来看一下节点信息:

在 agent 节点上使用 kubectl
命令
默认 agent 节点安装完毕后,是不能使用 kubectl
命令的:

我们可以通过环境变量指定配置文件位置,或在使用 kubectl
命令时指定配置文件位置,但为了方便使用需要 EXPORT
环境变量或者设置 alias
别名。不过我们可以把配置文件放在 ~/.kube/config
,这样 kubectl
命令可以自动应用配置文件。把 master 节点机器上的 /etc/rancher/k3s/k3s.yaml
文件内容写入到 config
文件,不要忘记修改 server 地址改为 master 节点地址:

然后我们再来执行下 kubectl
命令,执行正常:

安装 Kubernetes 仪表盘
参考文档:Kubernetes 仪表盘
部署仪表盘程序
首先直接用 Kubernetes 官方的推荐配置进行部署:
1 | GITHUB_URL=https://github.com/kubernetes/dashboard/releases |
配置仪表盘角色
按文档创建用户相关 yml 配置文件:
dashboard.admin-user.yml
1 | apiVersion: v1 |
dashboard.admin-user-role.yml
1 | apiVersion: rbac.authorization.k8s.io/v1 |
然后部署用户角色配置:
1 | k3s kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml |

最后获取仪表盘 token 以供访问:
1 | k3s kubectl -n kubernetes-dashboard describe secret admin-user-token | grep '^token' |

测试访问仪表盘
由于 Kubernetes 仪表盘运行在集群内部,无法直接从外部访问,所以我们需要使用集群代理。打开一个新窗口,并执行一下命令开启代理:
1 | k3s kubectl proxy |
然后可以通过 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
来访问 Kubernetes 仪表盘。
或是直接使用端口转发,但是同样需要保持前台运行:
1 | 首先获取 service name 和暴露端口 |
配置端口转发
为了使用方便,当然不能每次都打开终端启动代理来访问 Kubernetes 仪表盘。但是由于我们安装的时候没有安装 lb 和网络组件,所以只能使用 NodePort 来对外暴露服务。同理也适用于其他服务。
首先打开 Kubernetes 仪表盘,切换到 kubernetes-dashboard
命名空间,然后打开 Service tab 页,编辑 kubernetes-dashboard 项。将配置文件中 type
的值改为 NodePort
,然后在 ports
下面添加 nodePort: 31001
,其中 31001
是宿主机要监听的端口号,修改完成后点击更新应用配置。

注意,由于 NodePort 限制,默认限制端口范围只能为 30000-32767,具体可以看 kubernetes 官方文档:NodePort 类型。
配置更新后就可以直接从外部用浏览器访问宿主机映射之后的端口,或者再结合反代对外暴露使用。