FCP 官方硬件要求:
拥有公网IP (没有公网IP可以用frp端口映射)
拥有域名
拥有 泛域名SSL 证书 (可以搞免费的)
至少拥有一个 GPU
至少 8 个 vCPU (建议12核以上,否则可能接不到任务)
至少 300GB SSD 存储
最低 64GB 内存 (32g也可以)
最低 50MB 带宽
FCP部署步骤非常多,建议阅读官方文档,能获取到更准确的信息:
机器配置低的朋友,可以选择部署ECP: (收益比FCP少一点)
https://github.com/swanchain/go-computing-provider/blob/release-v1.0.0/ubi/README.md
官方推特和discord:
https://twitter.com/swan_chain
https://discord.com/invite/swanchain
如果遇到问题,可加入电报群讨论:
官方技术支持频道:
https://t.me/swan_chain/102425
目录
- 1 基础环境准备:
- 2 初始化k8s
- 3 安装K8S NVIDIA 插件
- 4 nvidia-device-plugin-daemonset-qkklz 1/1 Running 60 64d
- 5 正常输出:
- 6 安装 Ingress-nginx 控制器
- 7 去域名控制台做泛解析,并申请泛域名证书。
- 8 安装Nginx
- 9 手动编辑此配置文件,修改你的域名,和反代端口。
- 10 配置computing-provider程序的环境变量
- 11 安装AI推理依赖
- 12 安装Node-Port服务
- 13 在k8s上安装资源隔离服务
- 14 创建CP钱包
- 15 初始化CP:
- 16 按小i 开始编辑。
- 17 按键盘左上角的ESC,然后输入 :wq! 保存退出
- 18 multichain.storage 这个网站需要钱包里有10个matic才能创建apikey。
- 19 质押$swan
- 20 启动CP节点
- 21 查看CP日志:
- 22 其他可能用得到的排查命令:
- 23 开一个screen,防止会话中断
- 24 启动frp服务端
- 25 部署frp客户端
- 26 启动frp客户端
- 27 执行后返回服务端查看日志,看是否连接成功。
基础环境准备:
(本文以ubuntu 22.04 系统演示)
安装go,版本需大于等于 1.21.7
国内机器可能无法访问到go的网站,需要挂代理,可以临时用我的:
export https_proxy="http://proxy1.node.study:8118"
curl https://cip.cc # 如果访问不到,可能是此代理已经挂了或者被封了
wget -c https://golang.org/dl/go1.21.7.linux-amd64.tar.gz -O - | sudo tar -xz -C /usr/local
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc && source ~/.bashrc
go version
代理用完记得撤销掉:
unset https_proxy
curl https://cip.cc
安装docker
apt update && apt install docker.io -y
设置docker的cgroupdriver为systemd
这一大段是一条命令(cat > 到最后面的 EOF),需要一起复制,这是cat的特殊用法,可以直接把文本写入文件。
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
然后重启docker
systemctl restart docker
安装cri-dockerd
wget https://testnetcn.oss-cn-hangzhou.aliyuncs.com/src/cri-dockerd_0.3.3.3-0.ubuntu-jammy_amd64.deb
dpkg -i cri-dockerd_0.3.3.3-0.ubuntu-jammy_amd64.deb
systemctl status cri-docker.service
安装kubeadm
官方安装文档: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
如果你的机器有显卡的话,需要安装驱动:
先添加驱动软件源,要不然装不了高版本驱动
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update && apt install nvidia-driver-560 -y
请根据自己显卡型号,自行选择需要安装的驱动版本
nvidia-smi
安装成功后执行此命令可以看到显卡信息
初始化k8s
注意需要先关闭swap
swapoff -a
可以注释掉 /etc/fstab 文件里swap那一行,防止服务器重启后swap又起来。
开始初始化:
kubeadm init --pod-network-cidr=192.168.0.0/16 --upload-certs --control-plane-endpoint=服务器内网IP --apiserver-advertise-address=服务器内网IP --service-cidr=172.36.1.0/24 --v=5 --cri-socket unix:///var/run/cri-dockerd.sock
如果初始化过程中,日志提示拉取镜像超时,可以把k8s镜像源换成阿里云的,增加这个选项即可:
--image-repository registry.aliyuncs.com/google_containers
重新初始化之前需要重置一下:
kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
rm /etc/kubernetes/ -rf
镜像源换为阿里云重新初始化
kubeadm init --pod-network-cidr=192.168.0.0/16 --upload-certs --control-plane-endpoint=服务器内网IP --apiserver-advertise-address=服务器内网IP --service-cidr=172.36.1.0/24 --v=5 --cri-socket unix:///var/run/cri-dockerd.sock --image-repository registry.aliyuncs.com/google_containers
或者配置docker使用代理拉取镜像。可以临时用我的:
http://proxy1.node.study:8118
docker配置代理方法:
mkdir /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://你的代理IP"
Environment="HTTPS_PROXY=http://你的代理IP"
Environment="NO_PROXY=127.0.0.1,localhost"
EOF
systemctl restart docker
docker配置代理服务器拉取镜像可参考这个教程:
https://www.lfhacks.com/tech/pull-docker-images-behind-proxy/?source=post_page-----61d1bd8fc484---------------------------------------
k8s初始化完成后,会有成功提示,并让你执行屏幕上提示的 三行命令。
k8s安装网络插件
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
也可以把这个yaml文件下载下来然后执行
kubectl create -f tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml
等待pod变为running状态:
watch kubectl get pods -n calico-system
去除k8s master节点污点,否则无法正常调度pod
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-
安装K8S NVIDIA 插件
(没有显卡的话不需要执行此步)
官方文档:
https://github.com/NVIDIA/k8s-device-plugin#quick-start
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | apt-key add -
curl -s -l https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | tee /etc/apt/sources.list.d/libnvidia-container.list
apt-get update && apt-get install -y nvidia-container-toolkit
这一大段是一条命令(cat > 到最后面的 EOF),需要一起复制,这是cat的特殊用法,可以直接把文本写入文件。
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
EOF
systemctl restart docker
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.15.0/deployments/static/nvidia-device-plugin.yml
如果正确安装的话可以看到nvidia pod正在 Running:
kubectl get po -n kube-system |grep -i nvidia
nvidia-device-plugin-daemonset-qkklz 1/1 Running 60 64d
创建一个测试pod,看pod调用gpu是否正常:
cat > gpu-pod-test.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
restartPolicy: Never
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda10.2
resources:
limits:
nvidia.com/gpu: 1 # requesting 1 GPU
tolerations:
- key: nvidia.com/gpu
operator: Exists
effect: NoSchedule
EOF
kubectl apply -f gpu-pod-test.yaml
kubectl logs gpu-pod
正常输出:
[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done
安装 Ingress-nginx 控制器
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.1/deploy/static/provider/cloud/deploy.yaml
kubectl get pod -n ingress-nginx
等待pod变为Running状态
查看ingress-nginx端口:
kubectl get svc -n ingress-nginx
如图所示,我的ingress-nginx pod的端口是30689。接下来搭建nginx反向代理要用到此端口。
我们需要把域名解析到FCP所在服务器上,如果你在国内的家庭宽带下运行,是无法做域名解析的(域名解析到国内IP需要备案,而且家庭宽带无法使用80,443端口) 那么我们就需要使用frp将本地端口映射到一台境外云服务器上(低配即可),将域名解析到这台境外服务器上,并且搭建nginx反向代理。
去域名控制台做泛解析,并申请泛域名证书。
我的域名在阿里云,以阿里云域名控制台为例。
假如我想使用 *.cp.testnet.cn 这个泛域名,那么,添加A记录解析
主机记录填写 *.cp
记录值填写 服务器的公网IP
添加之后,过个几分钟,在命令行 ping 一下域名,看是否生效。
ping aaa.cp.testnet.cn
ping bbb.cp.testnet.cn
域名的ssl证书可以去 ohttps.com 这个网站免费签发:
按照ohttps网站上的提示,去域名控制台做一个CNAME解析:
稍等一会儿,返回ohttps网站,点击验证解析记录,成功后创建证书,下载这两个证书文件:
将这两个证书文件上传到服务器,下面步骤需要使用。
安装Nginx
如果你的机器没有公网IP,或无法使用80,443端口,那么需要部署frp服务,将8085端口和上一个步骤部署的ingress-nginx的端口映射到有公网IP的境外云服务器上。此步骤的nginx需要部署在这台境外云服务器上。
frp部署步骤比较简单,一个服务端frps(部署在境外云服务器上),一个客户端frpc(部署在本机),在客户端配置文件里 frpc.toml 定义一下服务端IP和服务端端口,和需要映射的端口,分别使用frps和frpc命令把服务端和客户端启动起来就行了。frp配置教程见本文最后面。
如果你的机器有公网IP,且可以正常使用80,443端口,那么先去域名控制台做个泛解析,然后在本机执行:
sudo apt update
sudo apt install nginx -y
vim /etc/nginx/conf.d/swan.conf
# 使用vim打开文件,输入 :set paste (冒号也输,这样执行后再粘贴格式就不会乱了) 粘贴以下内容
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name *.cp.testnet.cn; # 此处的*.cp.testnet.cn需要修改为你的域名,*号不要删除
return 301 https://$host$request_uri;
#client_max_body_size 1G;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/nginx/cert/example.com/fullchain.pem; # 修改为你的ssl证书文件所在路径
ssl_certificate_key /etc/nginx/cert/example.com/privkey.key; # 修改为你的ssl证书文件所在路径
server_name *.cp.testnet.cn; # 此处的*.cp.testnet.cn需要修改为你的域名,*号不要删除
location / {
proxy_pass http://127.0.0.1:<port>; # 这里反向代理的 <port>需要修改为上一步 Ingress-nginx 的端口
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
输入 :wq 保存退出
vim /etc/nginx/conf.d/swan.conf
手动编辑此配置文件,修改你的域名,和反代端口。
nginx配置文件改好之后,检查配置文件是否正确,并重载nginx:
nginx -t
nginx -s reload
去浏览器访问一下自己的域名,看ssl证书是否配置正确,如果不正确浏览器会提示证书不安全。
https://xxx.cp.testnet.cn
安装resource-exporter
此插件的作用是向官方汇报本机硬件配置信息,如果你的机器配置太低,可能会接不到任务。
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
namespace: kube-system
name: resource-exporter-ds
labels:
app: resource-exporter
spec:
selector:
matchLabels:
app: resource-exporter
template:
metadata:
labels:
app: resource-exporter
spec:
containers:
- name: resource-exporter
image: filswan/resource-exporter:v12.0.0
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: machine-id
mountPath: /etc/machine-id
readOnly: true
volumes:
- name: machine-id
hostPath:
path: /etc/machine-id
type: File
EOF
如果安装正确,执行 kubectl get po -n kube-system 可以看到resource-exporter正在Running
安装 computing-provider
mkdir -p /data/swan/ && cd /data/swan/
wget https://github.com/swanchain/go-computing-provider/releases/download/v1.1.2/computing-provider
chmod +x computing-provider
ln -s /data/swan/computing-provider /usr/local/bin/
computing-provider -v
配置computing-provider程序的环境变量
echo 'export CP_PATH=/data/swan' >> /etc/profile
source /etc/profile && echo $CP_PATH
安装AI推理依赖
mkdir -p /data/swan/src && cd /data/swan/src
wget https://github.com/swanchain/go-computing-provider/archive/refs/tags/v1.1.2.tar.gz
tar xvf v1.1.2.tar.gz
cd go-computing-provider-1.1.2/
export CP_PATH=/data/swan
./install.sh
安装Node-Port服务
如果你的系统是Ubuntu 20.04:
kubectl apply -f https://raw.githubusercontent.com/swanchain/go-computing-provider/refs/heads/releases/resource-isolation-20.04.yaml
如果你的系统是Ubuntu 22.04,
需要先修改grub文件 /etc/default/grub 里的这一行:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=0"
修改后执行:
update-grub
然后重启系统
reboot now
在k8s上安装资源隔离服务
kubectl apply -f https://raw.githubusercontent.com/swanchain/go-computing-provider/refs/heads/releases/resource-isolation.yaml
# 生成网络策略
computing-provider network generate
# 部署网络策略
kubectl apply -f $CP_PATH/network-policy.yaml
使用以下命令确认所有网络策略都在运行。
# kubectl get gnp
NAME CREATED AT
global-01kls78xh7dk4n 2024-09-25T04:00:59Z
global-ao9kq72mjc0sl3 2024-09-25T04:00:59Z
global-e59cad59af9c65 2024-09-25T04:00:59Z
global-pd6sdo8cjd61yd 2024-09-25T04:00:59Z
global-pod1namespace1 2024-09-25T04:01:00Z
global-s92ms87dl3j6do 2024-09-25T04:01:00Z
# kubectl get globalnetworksets
NAME CREATED AT
netset-2300e518e9ad45 2024-09-25T04:00:59Z
注意:部署CP的节点需要开放以下范围内的端口30000-32767 (如果你使用frp,则需要映射这组端口)
创建CP钱包
新建钱包:
computing-provider wallet new
列出钱包:
computing-provider wallet list
导出钱包私钥:
computing-provider wallet export 0x钱包地址
或者导入自己的小狐狸钱包:
computing-provider wallet import # 导入私钥
把主网eth用跨链桥跨到swan链:
或
https://bridge.swanchain.io/deposit
跨链后几分钟就到账了,使用命令查看余额:
computing-provider wallet list
或者通过区块浏览器搜索钱包:
https://mainnet-explorer.swanchain.io
初始化CP:
初始化配置文件:
cd /data/swan
export CP_PATH=/data/swan
computing-provider init --multi-address=/ip4/<YOUR_PUBLIC_IP>/tcp/8085 --node-name=你的节点名
注意把
执行上面命令后,会在/data/swan生成配置文件,编辑配置文件,根据自己实际情况更改,注释里有配置说明。
官方示例配置:
https://github.com/swanchain/go-computing-provider/blob/v1.1.2/config.toml.sample
vim config.toml
按小i 开始编辑。
按键盘左上角的ESC,然后输入 :wq! 保存退出
multichain.storage 这个网站需要钱包里有10个matic才能创建apikey。
初始化cp:
(此步骤需要大概2刀的gas,确保eth已经跨到了swan主网)
computing-provider account create --ownerAddress 上一步生成的钱包地址 \
--workerAddress 上一步生成的钱包地址 \
--beneficiaryAddress 上一步生成的钱包地址 \
--task-types 3,4,5
(这3个地址可以用一个)
查看CP信息:
computing-provider info
质押$swan
不同gpu所需的质押量不一样,可见官方文档:
Collateral Requirement and Earning Multiplier | Swan Chain
The base collateral requirement is 3533 $SWAN. Different GPU models contribute differently to the network and thus have…
docs.swanchain.io
如果你运行过测试网节点,那么空投的swan应该够质押了。
如果是新节点,则需要购买GPU对应数量的swan代币。
computing-provider collateral add --fcp --from 钱包地址 3533(要质押的swan数量)
查看质押信息:
computing-provider info
启动CP节点
export CP_PATH=/data/swan # 这一步可以不执行,在之前的步骤中,我们已经把这个变量加到了/etc/profile
nohup computing-provider run >> cp.log 2>&1 & # 启动并放入后台
查看CP日志:
tail -f /data/swan/cp.log
如果一切正常,CP节点启动几分钟后,可以在官方dashboard上查到你的节点信息:
https://provider.swanchain.io/rankings/fcp
查看任务接收情况
节点启动后一个小时左右,应该就能接到任务了。
查看普通任务:
computing-provider task list
查看任务详细信息:
computing-provider task list -v
computing-provider task get 任务ID
接收到的普通任务其实是用户在lagrangedao网站创建的空间,用 computing-provider task get ID可以查看分配到的子域名,可以在浏览器访问看看,有很多有趣的应用。
查看ubi任务:
computing-provider ubi list
如果一直接不到任务,按照官方文档创建一个测试任务,并观察cp.log和k8s pod是否正常:
https://docs.swanchain.io/orchestrator/as-a-computing-provider/fcp-fog-computing-provider/faq
其他可能用得到的排查命令:
kubectl get nodes
kubectl describe nodes 主机名
kubectl get pod -A
kubectl describe pod -n xxx xxx
journalctl -u kubelet -f
重启CP节点
官方没有提供停止或重启命令,如果后续更改配置文件,需要重启,则需要找到进程号杀掉:
pgrep -f "computing-provider run"|xargs kill
tail -f /data/swan/cp.log # 杀掉进程后,日志里会出现 shutdown sucessful字样。
然后重新启动:
nohup computing-provider run >> cp.log 2>&1 &
tail -f /data/swan/cp.log
哪里有问题可以来群里讨论:
部署frp服务端
(在境外云服务器执行)
cd /opt
wget https://testnetcn.oss-cn-hangzhou.aliyuncs.com/src/frp.zip
unzip frp.zip
开一个screen,防止会话中断
screen -S frps
启动frp服务端
/opt/frp/frps -c /opt/frp/frps.toml
注意在云服务器上开放frps服务端端口和映射上来的端口。
部署frp客户端
(在本地机执行)
cd /opt
wget https://testnetcn.oss-cn-hangzhou.aliyuncs.com/src/frp.zip
unzip frp.zip
vim /opt/frp/frpc.toml
自行编辑服务端IP和需要映射的端口
screen -S frpc
启动frp客户端
/opt/frp/frpc -c /opt/frp/frpc.toml
发表评论