Weylus容器编排:Kubernetes部署与自动扩缩容配置指南
项目概述
Weylus是一款能将平板或智能手机转变为电脑绘图板/触摸屏的工具,支持跨平台使用,在Linux系统上还提供手写笔、多点触控等增强功能。项目核心功能实现位于src/目录,包含输入处理src/input/、视频编码src/video.rs和Web服务src/web.rs等模块。
容器化构建基础
Docker镜像构建
项目提供官方Docker构建方案,Dockerfile位于docker/Dockerfile。构建命令如下:
# 克隆代码仓库
git clone https://gitcode.com/gh_mirrors/we/Weylus
cd Weylus
# 构建Docker镜像
docker build -t weylus:latest -f docker/Dockerfile .
构建过程会自动处理Rust依赖编译、TypeScript前端构建及FFmpeg视频编码库集成,生成包含完整运行环境的镜像。
构建优化选项
- 使用
--features ffmpeg-system特性可切换为系统FFmpeg库,减少镜像体积:
docker build --build-arg FEATURES=ffmpeg-system -t weylus:system-ffmpeg -f docker/Dockerfile .
- Alpine版本Dockerfile(docker/Dockerfile_alpine)可进一步压缩镜像大小,适合生产环境部署。
Kubernetes部署配置
基础Deployment配置
创建weylus-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: weylus
spec:
replicas: 3
selector:
matchLabels:
app: weylus
template:
metadata:
labels:
app: weylus
spec:
containers:
- name: weylus
image: weylus:latest
ports:
- containerPort: 1701 # Web服务端口
- containerPort: 9001 # WebSocket端口
env:
- name: WEYLUS_LOG_LEVEL
value: "INFO"
- name: WEYLUS_VAAPI_DEVICE
value: "/dev/dri/renderD128"
resources:
requests:
cpu: 500m
memory: 256Mi
limits:
cpu: 1000m
memory: 512Mi
volumeMounts:
- name: dri
mountPath: /dev/dri
volumes:
- name: dri
hostPath:
path: /dev/dri
该配置包含:
- 3个初始副本保证服务可用性
- GPU视频加速支持(通过VAAPI设备挂载)
- 资源限制防止单个Pod过度占用节点资源
服务暴露配置
创建weylus-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: weylus-service
spec:
selector:
app: weylus
ports:
- name: web
port: 80
targetPort: 1701
- name: websocket
port: 9001
targetPort: 9001
type: LoadBalancer
根据实际环境可选择NodePort或Ingress方式暴露服务,生产环境建议搭配TLS终止层,参考项目加密指南weylus_tls.sh。
自动扩缩容实现
HPA配置
创建weylus-hpa.yaml:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: weylus-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: weylus
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleUp:
stabilizationWindowSeconds: 60
policies:
- type: Percent
value: 50
periodSeconds: 120
scaleDown:
stabilizationWindowSeconds: 300
此配置实现:
- CPU利用率70%或内存利用率80%时触发扩容
- 最大10副本、最小2副本的弹性范围
- 扩容冷却60秒,缩容冷却300秒防止抖动
高级扩缩容策略
对于多节点集群,可结合节点亲和性与Pod拓扑分布约束:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: feature.node.kubernetes.io/gpu
operator: Exists
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- weylus
topologyKey: kubernetes.io/hostname
确保Weylus Pod均匀分布在不同GPU节点,提高服务可用性。
监控与运维
日志收集配置
通过环境变量启用JSON格式日志:
env:
- name: WEYLUS_LOG_JSON
value: "true"
- name: WEYLUS_LOG_LEVEL
value: "DEBUG"
配合ELK或Promtail+Loki stack可实现日志集中分析,关键日志项包括客户端连接事件、视频编码性能指标及输入设备状态。
健康检查配置
添加存活探针与就绪探针:
livenessProbe:
httpGet:
path: /
port: 1701
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 1701
initialDelaySeconds: 5
periodSeconds: 5
需在src/web.rs中实现/health端点,返回200 OK状态码表示服务就绪。
部署最佳实践
持久化配置
使用ConfigMap存储Weylus配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: weylus-config
data:
access_code: "secure-code-here"
capture_mode: "window"
通过环境变量或挂载文件方式注入到Pod中,避免配置硬编码。
安全加固
- 使用非root用户运行容器,在Dockerfile中添加:
RUN adduser --disabled-password --gecos "" weylus
USER weylus
- 启用PodSecurityContext:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
allowPrivilegeEscalation: false
- 限制网络策略,仅开放必要端口:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: weylus-policy
spec:
podSelector:
matchLabels:
app: weylus
policyTypes:
- Ingress
ingress:
- ports:
- protocol: TCP
port: 1701
- protocol: TCP
port: 9001
故障排查指南
常见问题处理参考官方FAQ(Readme.md#faq):
-
uinput设备错误:检查容器是否有权限访问
/dev/uinput,可通过securityContext添加设备访问权限。 -
视频编码性能问题:
- 确认GPU设备挂载正确:
ls -l /dev/dri - 切换软件编码模式:
env: WEYLUS_VIDEO_ENCODER=libx264
- 确认GPU设备挂载正确:
-
WebSocket连接失败:检查网络策略是否放行9001端口,可通过
kubectl exec -it <pod> -- netstat -tulpn验证端口监听状态。
项目完整文档参见Readme.md,包含更多关于硬件加速配置、输入设备校准及跨平台兼容性的详细说明。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




