欢迎光临
我们一直在努力

2万元构建3节点的简易分布式K8s服务器

一、硬件配置

        最近接触到了K8s的服务器动态管理工具,这是谷歌开发的一个专门用于大型服务器集群进行动态资源分配的自动化工具,基本上大厂运维都会用到这玩意,所以我们今天可以稍微来研究一下它。
        今天用三台电脑,实现一个小型K3s集群,下面是我的配置表:

品牌 内存容量 硬盘容量 角色
联想拯救者 32G 2.5T master节点
华为 16G 512G worker节点
华为 16G 512G worker节点

        联想拯救者的性能和内存更高,可以用来作为master节点,因为我们未来可能需要配置更高级的K8s,master节点必须要拥有更大的内存空间。而另外两个华为笔记本,则是作为较小的worker节点。

        首先,我要说最重要的网络问题!!!我们的这些电脑需要在统一的网络内,也就是我们经常听说的“XX部门内部网络”,这样能够保证自己的分布式服务器不用暴露在公网内,避免了大面积的服务暴露,提高系统安全性,同时还能降低我们分布式服务器的部署难度,因为只需要共同连上一个内网,就能根据每台电脑(服务器)所在的IP端口实现内网互相访问。

        如果你的电脑(们)有数据信号线,也就是说有线网络的连接条件,用有线连接实现3台电脑物理互联是最好的,因为无线网会有非常频繁的波动,多台服务器占用一个无线网络的时候,会导致分摊到每台服务器的网络带宽降低,传输速度同样也会随之降低。

        我的这三台电脑,因为我资源有限,使用的是我自己手机的热点网络,共同连接同一个手机的热点,导致我的三台服务器访问AI的网络环境非常恶劣,但是,我们这篇文章只是为了向大家演示简易3节点集群的部署方法和过程,手机热点已经够用了。如果要实现服务器连接公网并部署服务,需要设计更健壮的网络环境。比如有线网络、高带宽无线网络


有图有真相

        虽然用三个笔记本电脑连起来,总成本不到2万,做一台服务器看起来很寒酸😭,但是这已经是本人目前的极限了,未来可能加一台更稳定的台式机,以及新加一台苹果mac来做辅助开发设备。让我们继续说一下本次服务器部署所用到的环境

二、从零开始:WSL2安装到实现两台电脑SSH连接完整指南

第一阶段:安装和配置WSL2

1. 启用WSL功能

# 以管理员身份打开PowerShell,执行:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

2. 重启计算机

完成上述命令后,必须重启电脑使更改生效。

3. 设置WSL2为默认版本

# 在 powershell 里面

wsl –set-default-version 2

4. 安装Ubuntu发行版

# 在PowerShell里面输入

# 查看可用的发行版
wsl –list –online

# 安装Ubuntu(推荐)
wsl –install -d Ubuntu

# 或者从Microsoft Store安装Ubuntu

5. 初始设置Ubuntu

  • 首次启动时会提示创建用户名和密码

  • 记住这个密码,后续SSH登录会用到

第二阶段:WSL2内部SSH服务器配置

6. 更新系统并安装SSH服务

        注意,在这里进入wsl进行输入,不是powershell了。

# 进入WSL2
wsl

# 更新软件包列表
sudo apt update && sudo apt upgrade -y

# 安装SSH服务器
sudo apt install openssh-server -y

7. 配置SSH服务

# 备份原配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

# 编辑SSH配置
sudo nano /etc/ssh/sshd_config

关键配置修改:

        这里的Port 设置成22,实际上是偷懒了,因为默认是22,生产情境下,这个端口一定要修改成自己有把握的端口。

Port 22
ListenAddress 0.0.0.0
PasswordAuthentication yes
PermitRootLogin yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes

8. 启动并启用SSH服务

# 启动SSH服务
sudo service ssh start

# 设置开机自启
sudo systemctl enable ssh

# 检查服务状态
sudo service ssh status

9. 验证SSH服务监听

# 检查22端口是否监听
sudo ss -tlnp | grep :22

# 应该显示:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*

第三阶段:Windows端网络配置

10. 设置端口转发(管理员PowerShell)

# 删除可能存在的旧规则
netsh interface portproxy reset

# 设置端口转发:Windows 2220端口 → WSL2 22端口
netsh interface portproxy add v4tov4 listenport=2220 listenaddress=0.0.0.0 connectport=22 connectaddress=127.0.0.1

# 验证端口转发
netsh interface portproxy show all

11. 配置Windows防火墙

# 删除可能冲突的旧规则
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SSH*"} | Remove-NetFirewallRule

# 添加新的防火墙规则(允许2220端口入站)
New-NetFirewallRule -DisplayName "WSL2 SSH Port 2220" -Direction Inbound -LocalPort 2220 -Protocol TCP -Action Allow

# 验证防火墙规则
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SSH*"} | Format-Table DisplayName, Enabled, Direction, Action

第四阶段:本地连接测试

12. 测试本地连接

# 测试端口连通性
Test-NetConnection -ComputerName 127.0.0.1 -Port 2220

# 如果成功,显示:
TcpTestSucceeded : True

# SSH连接测试
ssh nanji@127.0.0.1 -p 2220

# 首次连接需要确认指纹,输入WSL2的用户密码

13. 获取Windows主机IP地址

ipconfig | findstr "IPv4"

# 记下无线局域网适配器 WLAN 的IPv4地址,如:192.168.1.100

第五阶段:局域网另一台电脑连接

14. 在另一台电脑上测试连接

# 假设Windows主机IP是192.168.1.100
ssh nanji@192.168.1.100 -p 2220

# 首次连接需要确认指纹
# 输入WSL2用户的密码

15. 解决可能的连接问题

如果连接失败,检查以下几点:

在Windows主机上检查:

# 检查端口转发
netsh interface portproxy show all

# 检查防火墙规则
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SSH*"}

# 检查WSL2 SSH服务状态
wsl -d Ubuntu -u root service ssh status

在WSL2内部检查:

# 检查SSH服务状态
sudo service ssh status

# 检查端口监听 sudo ss -tlnp | grep :22

# 重启SSH服务(如果需要)
sudo service ssh restart

第六阶段:高级配置(可选)

16. 使用密钥认证(更安全)

# 在客户端电脑生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 将公钥复制到WSL2服务器
ssh-copy-id -p 2220 nanji@192.168.1.100

# 或者在WSL2中手动添加公钥
nano ~/.ssh/authorized_keys

17. 修改默认SSH端口(增强安全)

# 在WSL2中修改SSH配置文件
sudo nano /etc/ssh/sshd_config

# 将 Port 22 改为其他端口,如
Port 2222

# 同时更新Windows端口转发
netsh interface portproxy delete v4tov4 listenport=2220 listenaddress=0.0.0.0
netsh interface portproxy add v4tov4 listenport=2220 listenaddress=0.0.0.0 connectport=2222 connectaddress=127.0.0.1

故障排除清单

连接失败的常见原因:

  • WSL2 SSH服务未运行→ sudo service ssh start

  • Windows防火墙阻止→ 检查防火墙规则

  • 端口转发配置错误→ 重新配置端口转发

  • 网络不在同一网段→ 检查IP地址配置

  • WSL2网络异常→ wsl –shutdown然后重启

  • 诊断命令汇总:

    # WSL2内部诊断
    sudo service ssh status
    sudo ss -tlnp | grep :22
    ip addr show eth1

    # Windows端诊断
    netsh interface portproxy show all
    Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*SSH*"}
    Test-NetConnection -ComputerName 127.0.0.1 -Port 2220

    ✅ 成功验证

    完成所有步骤后,你应该能够:

    • 从Windows本地:ssh nanji@127.0.0.1 -p 2220

    • 从局域网其他电脑:ssh nanji@[WindowsIP] -p 2220

    这样就建立了稳定可靠的WSL2 SSH服务器,支持跨设备访问!上面是两个worker节点之间搭建的过程,master和他俩是同一个道理,下面我们进行master节点、集群的搭建。

    三、K3s三节点集群搭建

    📋 集群架构

    节点

    IP地址

    角色

    状态

    笔记本电脑

    192.168.210.171

    Master

    ✅ 已就绪

    nanji节点

    192.168.210.114

    Worker

    ✅ 已加入

    sh1ns节点

    192.168.210.54

    Worker

    ✅ 已加入

    🔧 搭建流程

    1. Master节点部署(笔记本电脑)

    # 在wsl中操作

    # 安装K3s Server
    curl -sfL https://get.k3s.io | sh –

    # 获取master节点的join token
    sudo cat /var/lib/rancher/k3s/server/node-token

    2. Worker节点加入

    注意:192.168.210.171:6443 是自己master节点的专属K8s API Server 访问端点,自己的master节点数据需要自己用命令行查。可以用AI帮忙查一下。

    下面的Token是我们上面的命令获取的join token,同样也是master节点专属。

    K3S_TOKEN=K107ed9c6b35d85c3f0d948bfd87a0154535544da8fba1b961dfefa9b193716977a::server:1f4a2832a73d19f9b77b37d4d5993b5f \\ sh –

    # 使用token加入集群
    curl -sfL https://get.k3s.io | \\ K3S_URL=https://192.168.210.171:6443 \\ K3S_TOKEN=K107ed9c6b35d85c3f0d948bfd87a0154535544da8fba1b961dfefa9b193716977a::server:1f4a2832a73d19f9b77b37d4d5993b5f \\ sh –

    如下是成功将工作的Worker节点接入master的节点创建的集群的终端结果,可用来对照。

    🚨 常见错误及解决方案

    错误类型1:网络连通性问题

    ❌ 问题:节点间无法ping通

    现象:

    ping 192.168.210.171

    # worker节点访问master节点请求超时,100%丢包

    原因:

    • 设备不在同一网络段

    • 路由器客户端隔离

    • 防火墙阻挡

    • WSL 处于桥接网络模式,应当使用Mirrored模式这是我的错误情况,当你安装好WSL之后,会在WSL setting的网络设置中便捷修改网络模式,别听AI说的那些命令行,会气死自己。

    解决方案:

    # 1. 检查网络配置
    ip addr show ip route show

    # 2. 关闭防火墙(测试用)
    sudo ufw disable

    # 3. 检查路由器客户端隔离设置


    错误类型2:WSL2代理配置问题

    ❌ 问题:WSL2无法使用Windows代理

    现象:

    curl -I –proxy http://127.0.0.1:7897 https://github.com

    # 连接失败

    原因:WSL2 NAT模式无法直接访问Windows localhost

    解决方案:

    # 1. 获取Windows主机IP
    cat /etc/resolv.conf | grep nameserver | awk '{print $2}'

    # 2. 使用正确IP设置代理
    export HTTP_PROXY=http://172.20.80.1:7897 # 替换为实际IP
    export HTTPS_PROXY=http://172.20.80.1:7897

    # 3. 或者使用mirrored模式
    # 在Windows创建 ~/.wslconfig:
    echo '[wsl2]' > ~/.wslconfig
    echo 'networkingMode=mirrored' >> ~/.wslconfig


    错误类型3:证书和SSL问题

    ❌ 问题:SSL证书验证失败

    现象:

    curl: (60) SSL certificate problem: unable to get local issuer certificate

    解决方案:

    # 1. 跳过证书验证(不推荐生产环境)
    curl -k https://…

    # 2. 或者使用http镜像源
    curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | sh –


    错误类型4:端口冲突问题

    ❌ 问题:端口已被占用

    现象:

    Failed to create listener: listen tcp :6443: bind: address already in use

    解决方案:

    # 1. 检查端口占用
    sudo ss -tlnp | grep :6443

    # 2. 停止冲突服务或更改K3s端口
    sudo INSTALL_K3S_EXEC="–https-listen-port=6444" sh –


    错误类型5:资源不足问题

    ❌ 问题:内存或CPU不足

    现象:

    k3s[1234]: ERROR: failed to create kubelet: failed to create kubelet

    解决方案:

    # 1. 增加Swap空间
    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile

    # 2. 调整K3s资源限制
    sudo INSTALL_K3S_EXEC="–kubelet-arg=–eviction-hard=memory.available<500Mi" sh –


    错误类型6:Token认证问题

    ❌ 问题:Token无效或过期

    现象:

    ERROR: cannot join cluster: failed to get join config: Unauthorized

    解决方案:

    # 1. 重新生成token(在Master节点)
    sudo cat /var/lib/rancher/k3s/server/node-token

    # 2. 或者重置token
    sudo rm /var/lib/rancher/k3s/server/token
    sudo systemctl restart k3s
    sudo cat /var/lib/rancher/k3s/server/node-token


    错误类型7:容器运行时问题

    ❌ 问题:容器启动失败

    现象:

    Failed to create pod sandbox: rpc error: code = Unknown desc = failed to create containerd task:

    解决方案:

    # 1. 检查容器状态
    sudo crictl ps -a

    # 2. 重启容器运行时
    sudo systemctl restart containerd

    # 3. 清理容器缓存
    sudo crictl rmi –prune

    🛡️ 预防措施

    1. 环境预检查脚本

    #!/bin/bash
    # k3s-preflight-check.sh
    echo "=== K3s 预检查 ==="

    # 检查网络
    echo "网络检查:"
    ping -c 2 192.168.210.171

    # 检查端口
    echo "端口检查:"
    nc -zv 192.168.210.171 6443

    # 检查资源
    echo "资源检查:"
    free -h
    df -h

    # 检查容器运行时
    echo "容器运行时:"
    which containerd || which docker

    2. 安装验证脚本

    #!/bin/bash
    # k3s-verify.sh
    echo "=== K3s 集群验证 ==="

    # 检查节点状态
    sudo k3s kubectl get nodes -o wide

    # 检查Pod状态
    sudo k3s kubectl get pods -A

    # 检查服务状态
    sudo k3s kubectl get svc -A

    # 检查集群信息
    sudo k3s kubectl cluster-info

    🚀 快速恢复指南

    如果一切失败,从头开始:

    # 1. 清理所有节点
    sudo /usr/local/bin/k3s-uninstall.sh
    sudo rm -rf /etc/rancher/k3s
    sudo rm -rf /var/lib/rancher/k3s

    # 2. 重新安装Master
    curl -sfL https://get.k3s.io | sh –

    # 3. 获取新token
    sudo cat /var/lib/rancher/k3s/server/node-token

    # 4. Worker节点加入
    curl -sfL https://get.k3s.io | \\ K3S_URL=https://<MASTER_IP>:6443 \\ K3S_TOKEN=<NEW_TOKEN> \\ sh –

    💡 经验总结

  • 网络先行:确保所有节点在同一网络段且能互相通信

  • 代理配置:WSL2需要使用Windows主机IP而非127.0.0.1

  • 资源保障:确保有足够的内存和存储空间

  • 文档记录:保存好token和关键配置信息

  • 分步验证:每完成一步就验证其有效性

  • 赞(0)
    未经允许不得转载:171主机测评 » 2万元构建3节点的简易分布式K8s服务器
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址