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
2
3
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_SELINUX_RPM=true INSTALL_K3S_EXEC="--docker --disable servicelb --disable traefik --disable-cloud-controller" sh -
# 或使用国内镜像
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn 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
2
root@ubuntu-master:~# cat /var/lib/rancher/k3s/server/node-token
K10995e6e37eec07447411d8f8fcf025c3ed6f9a134e30e896ac4c2a7c4f8e6b587::server:f0af86641d91b09cc7707f25586b77e5

然后与 master 节点类似,指定 agent 节点的参数进行安装:

1
2
3
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 -
# 或使用国内镜像
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn 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
2
3
GITHUB_URL=https://github.com/kubernetes/dashboard/releases
VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
k3s kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml

配置仪表盘角色

按文档创建用户相关 yml 配置文件:

dashboard.admin-user.yml

1
2
3
4
5
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard

dashboard.admin-user-role.yml

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard

然后部署用户角色配置:

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
2
3
4
5
6
# 首先获取 service name 和暴露端口
kubectl get service -nkubernetes-dashboard
# 然后进行端口转发
kubectl port-forward service/kubernetes-dashboard 8443:443 -nkubernetes-dashboard
# 如果需要远端访问的话
kubectl port-forward service/kubernetes-dashboard 8443:443 -nkubernetes-dashboard --address 0.0.0.0

配置端口转发

为了使用方便,当然不能每次都打开终端启动代理来访问 Kubernetes 仪表盘。但是由于我们安装的时候没有安装 lb 和网络组件,所以只能使用 NodePort 来对外暴露服务。同理也适用于其他服务。

首先打开 Kubernetes 仪表盘,切换到 kubernetes-dashboard 命名空间,然后打开 Service tab 页,编辑 kubernetes-dashboard 项。将配置文件中 type 的值改为 NodePort,然后在 ports 下面添加 nodePort: 31001,其中 31001 是宿主机要监听的端口号,修改完成后点击更新应用配置。

注意,由于 NodePort 限制,默认限制端口范围只能为 30000-32767,具体可以看 kubernetes 官方文档:NodePort 类型

配置更新后就可以直接从外部用浏览器访问宿主机映射之后的端口,或者再结合反代对外暴露使用。