之前一直用的阿里云香港轻量服务器,不过最近不打算继续续费了,需要将上面的部分服务转移到 CloudCone 的 K3s 集群中:
-
Aria2
-
Aria2NG
-
TiddlyWiki
趁着春节假期的缓冲期,就先把 Aria2 给搬到单节点的 K3s 集群中吧。
容器化
之前在阿里云上是用的 pm2 做的守护进程,然后 Caddy 静态暴露 Aria2NG 前端面板跟下载目录。要迁移到 K3s 的话就需要将这些东西容器化了。Aria2 的话,我直接用了这位老哥的 Aria2 Pro,虽然不清楚具体设置了些什么,但是用起来没啥问题,前端面板也是用了他提供的 Aria2NG 镜像。
除了 aria2 之外,还得把下载目录的暴露也容器化。因为目前 K3s 集群中用的 traefik 作为 ingress,所以不能像之前那样直接通过反向代理软件暴露文件系统了。记得之前 Caddy 是自带一个 File Browser 插件的,这是一个单独的 Web 服务,可以非常方便的搭建一个文件共享系统,也提供了官方的 Docker 镜像,那么就决定用它来对外暴露下载目录了。
持久化存储
File Browser 需要持久化一个 db 文件用来保存系统数据(用户管理、文件共享等),Aria2 跟 File Browser 还需要共享下载目录,前者写入,后者读取。因为我的 K3s 集群就 1 个节点,所以直接就用 hostPath
来持久化数据了。
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: default
name: file-transfer-pv
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: '/path/to/file-transfer'
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: file-transfer-data-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: manual
resources:
requests:
storage: 10Gi
配置文件持久化
File Browser 默认的配置文件将数据库文件设置为了 /database.db
,不太方便我们使用 pvc 持久化,所以我就需要通过 ConfigMap 修改一下配置文件,将数据库文件保存到单独的外部挂载目录下。
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: file-browser
name: file-browser-config
namespace: default
data:
.filebrowser.json: |
{
"port": 80,
"baseURL": "",
"address": "",
"log": "stdout",
"database": "/db/database.db",
"root": "/srv"
}
数据持久化
# 省略部分内容....
containers:
- image: filebrowser/filebrowser
name: file-browser
imagePullPolicy: Always
volumeMounts:
- mountPath: /.filebrowser.json (1)
subPath: .filebrowser.json
name: file-browser-config
- mountPath: /db (2)
subPath: db/
name: data
- mountPath: /srv (3)
subPath: data/
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: file-transfer-data-pvc
- name: file-browser-config
configMap:
name: file-browser-config
items:
- key: .filebrowser.json
path: .filebrowser.json
1 | file-browser 配置文件挂载点 |
2 | 将 data 卷的 db/ 目录挂载到容器中的 /db 路径下,用来持久化数据库文件 |
3 | 将 data 卷的 data/ 目录挂载到容器中的 /srv 路径下,用来在 Pod 间共享下载目录 |
containers:
- image: p3terx/ariang
name: ariang
imagePullPolicy: Always
- image: p3terx/aria2-pro
env:
- name: RPC_SECRET
value: <SECERT>
- name: RPC_PORT
value: '6800'
- name: TZ
value: Asia/Shanghai
name: aria2-pro
imagePullPolicy: Always
volumeMounts:
- mountPath: /downloads (1)
subPath: data/
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: file-transfer-data-pvc
1 | 将 data 卷的 data/ 目录挂载到容器中的 /downloads 路径下,用来在 Pod 间共享下载目录 |
服务暴露
Aria2 服务需要暴露的端口不少,除了 HTTP 端口之外,还需要暴露供 BT 上传用的 TCP 与 UDP 端口。
apiVersion: v1
kind: Service
metadata:
name: aria2
namespace: default
spec:
selector:
app: aria2
ports:
# aria2 rpc
- protocol: TCP
port: 6800
name: rpc
# aria2 BT
- protocol: TCP
port: 6888
name: bt
# aria2 DHT
- protocol: UDP
port: 6888
name: dht
# aria ng
- protocol: TCP
port: 6880
name: web
apiVersion: v1
kind: Service
metadata:
name: file-browser
namespace: default
spec:
selector:
app: file-browser
ports:
# file-browser http
- protocol: TCP
port: 80
通过 Service 暴露端口之后还需要使用 Ingress 来向集群外暴露服务,我使用的是 traefik 提供的官方 helm chart,通过 IngressRoute 来定义 Ingress 路由。
Traefik 的默认配置中只监听了 80/443 端口,为了让 BT 上传能够正常工作,还得加入新的监听端口:
# ...
# Configure ports
ports:
# ...
aria2tcp:
port: 6888
expose: true
exposedPost: 6888
protocol: TCP
aria2udp:
port: 6888
expose: true
exposedPost: 6888
protocol: UDP
IngressRoute 只能用来路由 HTTP/HTTPS 请求,对于 TCP/UDP 请求,需要使用 IngressRouteTCP/IngressRouteUDP 来转发:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
name: apps-tcp
namespace: default
spec:
entryPoints:
- aria2tcp
routes:
- match: HostSNI(`*`) (1)
services:
- name: aria2
port: 6888
---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteUDP
metadata:
name: apps-udp
namespace: default
spec:
entryPoints:
- aria2udp
routes:
- match: HostSNI(`*`) (1)
services:
- name: aria2
port: 6888
1 | 因为 aria2 暴露的 TCP/UDP 端口没有使用 TLS 加密,所以需要设置路由匹配规则为 HostSNI( 。 |