折腾派程序员--自建k3s集群总结,tailscale+k3s+k9s+prometheus+grafana

叠甲

这是一个折腾派程序员的记录,以下配置建立 k3s 集群并不是必须的

just for fun好奇心探索欲练习

大部分过程都是昨晚ai实现的,中午复盘了一下,因此产出本笔记。

背景

手里有一些小鸡:

  • 华为云

    • 北方某区 3 台 ubuntu24 2c2g 2Mbps 100g/月

    • 西南某区 1 台 ubuntu24 2c2g 2Mbps 100g/月

  • 阿里云

    • 南方某城 1 台 ubuntu24 2c2g 3Mbps 按固定带宽计费,理论上每个月出流量最多 972g。
  • 腾讯云

    • 海外 1 台 ubuntu24 2c2g 30Mbps 1024g/月
  • racknerd

    • us 1 台 ubuntu24 1c1g 1gMbps 2t/月

这些小鸡主要部署了自用 ai 应用、自用 api 站,服务零散分布在各个服务器上,感到不太方便,需要一个整合方案。

看到有佬友给出过实践:

技术栈解释

查询相关资料

  • tailscale 做跨区域组网

  • k3s 作为轻量级 k8s 提供集群能力

  • k9s 作为 tui 简化kubectl命令操作

  • prometheus 做监控+grafana 做数据可视化

以此为目标,可以简单搭建好一个自己的 k3s 集群。

过程

ssh 准备

现有机子登录方式不一,有的密码、有的密钥,先统一成:

  • 新建非 root 用户,有 sudo 权限

  • 禁止密码登录,使用密钥登录

  • 禁止 root 登录

编写servers.yaml文件,记录所有服务器信息,ip、别名、用户、端口等等。

编写脚本对servers.yaml做解析,完成 ssh 准备,方便后续操作。

顺便把云平台的控制台都开好,方便后续更改安全组规则。

安全检查

在此之前,我的机子都很零散,很少检查安全问题,在组网之前,考虑可能存在以下问题:

  • 是否 ssh 被攻破

  • 是否存在可疑用户

  • 是否存在可疑进程

  • 是否存在可疑网络连接

  • 是否存在可疑文件系统

  • 是否存在可疑文件

  • 是否存在可疑定时任务

使用Lynis进行安全检查。编写脚本执行。

加固

通过安全检查,使自己对机子情况心里有个数,根据具体情况进行加固。

最底线方案:更改 ssh 端口、缩小安全组放行范围 + 之前的禁止登录规则

比较麻烦的地方:

在各个云平台里面新建或者编辑现有安全组,racknerd 这种没有安全组的则手动调整 ufw,先开 22 端口进去执行脚本,完成后再把 22 端口关闭。以后用的就是非 22 端口。

这里我本想使用terraform来管理安全组,但是发现腾讯云对lighthouse轻量服务器的安全组查询支持不太好,调试了半天,这些云平台安全组规则最后还是去控制台更改方便一点。

组网

前期准备完成,使用tailscale进行组网。

tailscale官网注册账号,下载tailscale客户端。免费账户 100 个节点,足够使用。

让 ai 编写脚本完成。

调整网络配置

由于之后要频繁拉取镜像,需要调整网络配置。

改 dns、注册镜像源、或者本机下载好资源,然后通过局域网分享给其他机子。

k3s

根据个人情况选择三台机器,作为 etcd 控制平面。在此我使用的是我华为云北方同区域的三台。

从一个节点开始,作为 master 节点,安装 k3s。之后再选两个机子作为 master 节点组成 etcd 控制平面。最后再加入其他机子作为 agent 节点。

完成之后测试 get nodes 之类的命令。

k9s

k9s 可以直接安装在自己本地,然后配置 k3s 的 kubectl 配置文件即可。我安装在自己的 wsl 里面。

prometheus+grafana

选择了一个比较空闲的 master 节点安装监控。之后通过以下命令访问看板。


kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80 --address 0.0.0.0

import 的是13105


后面安装各种组件,实操过程我基本都交给 gemini 去规划执行了。

最痛的地方在于经常有仓库或者镜像拉不下来,所以调整网络配置实际上是最耗时间的。

复盘

  1. 资源匮乏,意义有限。目前这个集群的 etcd 延迟受网络波动影响较大,并且机子配置也很局限,带宽不够,拉大镜像也很折磨,适合喜欢折腾的人参考。

  2. servers.yaml 管理可以考虑结合Ansible,我使用的是 ai 生成 sh 脚本。

  3. 下一步会继续研究存储 Storage 和入口 Ingress。后续会在帖子里面更新。

  4. Prometheus 可能会考虑用 VictoriaMetrics 替换。测试了没啥太大的性能提升,内存占用看起来少了一些,但数据同一个看板数据也少了,存在很多未探索的内容。。。

  5. 可以把海外鸡做 Docker Registry Proxy。有一点用,但是用处不大。木桶的短板在于国内的几台小鸡带宽太小了。

  6. master 之间可以考虑用云内网 ip 通信,master 和 worker 之间用 Tailscale IP


2026.01.13 iperf3测试

Network Path Throughput Overhead Notes
Raw Internal IP (172.31.x.x) 1.75 Gbits/sec - Pure TCP/IP over Huawei VPC
Tailscale IP (100.x.x.x) 1.66 Gbits/sec ~5.1% WireGuard encryption over VPC

tailscale可以自动检测并使用局域网通信,不需要显式指定master之间使用内网,并且使用tailscale局域网ip,可以无视云平台安全组规则

20 个赞

用公网搭建也是少见 :woozy_face:

:joy: 所以先叠甲,机子分散在各地,想搞也只能公网了

1 个赞

k8s还没搞清楚,又来了k3s,k9s
好难啊:smiling_face_with_tear:

master需要三台吗?
我一般自用 一台好像也没出过问题

前端菜狗标识看不太懂,顶一顶

k3s 可以理解为 k8s 的 轻量化版本
k9s 可以理解为 k8s 的 ui 界面

太强了,大佬

1 个赞

rancher 和k9s 那个好用一些哈,我现在部署了 k3s tailscale组网,用内网去连接 但是现在还没组好

感谢佬友分享 我之前一直想写教程 奈何一点动力都没有 :joy: 佬友行动力可以的

分享下我的一些问题解决办法~

  1. 镜像拉取问题: 脚本或者Ansible直接给国内机器配置k3s的镜像加速 有挺多选择1ms.run daocloud.io 可以一次性配置多个 但是一般来说docker镜像加速都有白名单 不在白名单无法加速 所以你配置多个 他会进行多次尝试 直到一个能拉取成功ghcr.io quay.io 也要进行加速 否则好多helm的镜像也拉不下来

  2. 储存我是默认local pvc 加每小时velero备份一次来解决, 我也考虑过Longhorn等高可用方案 但是这种带宽还是算了 :rofl: 流量消耗大不说 性能也极低 所以我直接每小时同步备份到oss上 然后双备到家里的minio节点上 说实话 自己玩 1个小时的数据丢失 我还是能接受的… 这种方案同时也备份了集群配置 不用单独备份etcd 集群炸了直接一键还原 很适合折腾

  3. Ingress 我直接用了nginx-ingress 优点是配置双缓存或者一些特殊的代理、geoip等 很简单 并且配合crowdsec能做到waf防火墙和规则封禁等 缺点是马上就不在维护了…
    默认的traefik-ingress也能用 但是配置缓存什么的好麻烦 当然 你如果有好的cdn可以不考虑缓存问题

  4. 扩展下网络问题 我目前是使用dnspod的igtm能力(免费) dns级别的负载均衡

比如 对master做负载均衡 我的集群主节点访问入口是 master.node.xxx.com 他解析到我的三台主节点上 并且会自动剔除不可用节点 这样任意主节点挂掉 都可以不丢失对其群的访问能力

再例如对ingress lb的出口机器 做负载均衡 我现在有4台2c1g 不同厂商的小鸡 但是对国内网络很好 所以我直接负载均衡到4台机器上 dns缓存时间60秒 也就是一个节点挂了 也只会影响部分人 并且会在缓存过期(理论上)后重新解析到新的正常的节点上

同时我只会让国内的解析到我的lb上 国外的流量来源一律解析cf再回源 同时有一个备用lb节点藏在cf后面 这样如果被打 国内lb全部挂掉的情况下 会自动流量切到cf + 备用lb回源节点的路线上 这样也不太怕被打

当然这些都是简单的防御手段 同时dns切换也不是即时的 一部分用户依然会受影响

但是… .. … … … 谁会在意一个每天才几十真实ip的博客呢 :distorted_face: 我19台机器 150g总内存的集群 跑了一堆的infra项目 监控 日志 备份 安全 证书 结果只为了服务一个博客而已… 都是折腾罢了

2 个赞

我是这么理解的,k9s轻量级适合自己用,rancher更重适合更大规模、多集群

1 个赞

:joy: 佬,请教一个奇怪的问题,刚才升级了之后发现的,阿里云和华为云的国内节点都有这个情况。

阿里内网dns服务器
nameserver 100.100.2.136
nameserver 100.100.2.138

华为内网dns服务器
nameserver 100.125.1.250

apt upgrade之后,刚才操作发现都连不上,curl、ping、nslookup,都试了一通,发现就是没法用,只能换成公网dns服务器,8.8.8.8、114.114.114.114、223.5.5.5。

你有遇到过类似的情况吗

拉个专线:new_moon_face:

1 个赞

应该不用改dns吧

像是tailscale的问题

阿里云、华为云因使用100网段作为dns等内部服务 需要关闭netfilter 否则会自动添加iptables规则导致无法访问dns
需要添加 extraArgs=–netfilter-mode=off

不太确定是不是这个问题 你可以先尝试下 dns一般来说不需要修改的 如果是这个问题 再tailscale后台 开dns全局覆盖 也能解决此问题 不过还是推荐加参数

感谢分享!

:joy: 好像是tailscale接管了网络的原因,但是关了之后Prometheus、grafana也连不上了,还得研究研究配置

如果关了netfilter之后 节点的dns正常了 但是集群容器里的dns出现问题

估计要检查下华为云 or 阿里云的机器上的容器是否正确获取了节点的dns 一般服务无法访问 可能就是内部的解析服务出问题了…

本质原因是他们100网段和tailscale的100网段冲突了 :rofl:

目前这种混合集群内部dns到真有点麻烦 目前我的阿里华为的机器也是这样配置的 唯一不同是我为了解决coredns延迟问题 加了一层nodelocal dns 这个是k8s解决dns 5秒超时的一种方案 我用在这里刚好解决dns缓存 以及网络波动造成的解析异常问题

服务通过service name访问 → 先到本机nodelocal dns解析 → 查不到缓存则查询coredns

服务访问外部域名 → 直接通过nodelocal dns进行解析 绕过coredns

算是给coredns减压了 比较抗网络波动 像现在这种跨区域 跨服务商 网络波动和延迟会对集群造成不小影响的

K8s是大管家,K3s是小管家,K9s是这两个管家的操作大屏;大管家管大项目,小管家管小场景,大屏帮工程师轻松使唤管家。

是的,本质是100网段跟tailscale冲突了。

tailscale后台dns配置的细粒度不够,容易搞得不必要的节点也受到影响。

我现在的方案是改节点的iptables,把内网规则放在tailscale规则之前,这样算是开了个洞,倒也管用了。